防止 HTML5 视频在移动设备上下载文件 - videojs
Prevent HTML5 videos from downloading the files on mobile - videojs
所以我目前正在构建一个网站,该网站有一个包含四个视频的轮播,每个视频都是通过连接到 Bootstrap 3 轮播的 slide.bs.carousel
事件来触发播放的。
每个视频都像这样嵌入到页面中:
<video id="somevideo" class="video-js vjs-default-skin m-hide" controls preload="auto" data-setup='{ "controls": false, "autoplay": false, "preload": "auto" }'>
<source src="somevideo.mp4">
<source src="somevideo.webmhd.webm">
</video>
现在,考虑到 Apple 特别对 HTML5 视频的自动播放和预加载施加的限制(两者都被禁用并且需要用户交互才能触发播放),我决定省略移动视频 &选择静态图像。这相对简单,因为阻止视频覆盖内容所需的只是隐藏它们的媒体查询。
也就是说,我发现很难阻止视频被下载,而且开销巨大。
例如,我有一个脚本来检查用户当前是否正在从移动设备访问,因此,我已经尝试过:
var check = false;
window.mobilecheck = function() {
// Check for mobile here
if (check === true) {
// Device is mobile
var videos = document.querySelectorAll('.video-js');
for (var i = 0; i < videos.length; i++) {
// videojs(videos[i]).destroy();
videos[i].parentNode.removeChild(videos[i]);
}
}
}
这成功删除了元素,但这必须在 DOMReady 上调用,这也意味着资源已经开始下载。
如何阻止视频在移动设备上加载?我想找到一个最好使用 VideoJS 的解决方案。
一种方法是通过 JavaScript 设置 video
元素的 src
属性,并且仅基于媒体查询(使用 matchMedia
).
不过,这意味着您的大部分代码必须移至 JavaScript。
例如,您的 HTML 可能类似于:
<video data-mp4="video.mp4" data-webm="video.webm" class="video-js" controls></video>
然后在你的 JavaScript(这里是伪代码,不是真正的 JS):
if (window.matchMedia("(min-width: 640px)").matches) {
// do nothing
} else {
var videos = document.querySelectorAll('.video-js'),
videoFile;
for (var i = 0; i < videos.length; i++) {
// Choose video type
if (video[i].canPlayType("video/mp4") === "probably") {
videoFile = video[i].getAttribute("data-mp4");
}
// do the same check for WebM here...
video[i].src = videoFile;
// Call whatever reload or refresh method video.js has
// for example...
video[i].refresh();
}
}
类似的东西可能对你有用,尽管你可能需要稍微尝试一下。
根据 Ian 提出的建议,这是我的工作解决方案。
首先,我将每个视频的子源元素更改为具有属性 data-src
,如下所示:
<video id="my-id">
<source data-src="somevideo.mp4">
</video>
然后,在使用 http://detectmobilebrowsers.com/ which I modified to include iPads etc (related SO answer here) 提供的脚本执行移动检查后,我只是使用以下脚本自动更新每个视频的 src
属性(如果我们在我的桌面上案例):
var sources = document.querySelectorAll('video#my-id source');
// Define the video object this source is contained inside
var video = document.querySelector('video#my-id');
for(var i = 0; i<sources.length;i++) {
sources[i].setAttribute('src', sources[i].getAttribute('data-src'));
}
// If for some reason we do want to load the video after, for desktop as opposed to mobile (I'd imagine), use videojs API to load
video.load();
就是这样!移动设备上不再加载任何内容,我可以相当精细地控制它将加载或不加载的设备。
希望这对某人有所帮助。
根据 Ian 和 GDGR 的回答,我修改了它以适用于多个视频。
<video class="mobile-no-load">
<source data-src="somevideo.mp4">
</video>
if (window.innerWidth > 730) {
// get multiple videos
var sources = document.querySelectorAll('video.mobile-no-load');
// loop through the videos
sources.forEach(function(source){
// target the src attribute of the <source> element and set it to the data-src attribute
source.childNodes[1].setAttribute('src', source.childNodes[1].getAttribute('data-src'))
});
}
所以我目前正在构建一个网站,该网站有一个包含四个视频的轮播,每个视频都是通过连接到 Bootstrap 3 轮播的 slide.bs.carousel
事件来触发播放的。
每个视频都像这样嵌入到页面中:
<video id="somevideo" class="video-js vjs-default-skin m-hide" controls preload="auto" data-setup='{ "controls": false, "autoplay": false, "preload": "auto" }'>
<source src="somevideo.mp4">
<source src="somevideo.webmhd.webm">
</video>
现在,考虑到 Apple 特别对 HTML5 视频的自动播放和预加载施加的限制(两者都被禁用并且需要用户交互才能触发播放),我决定省略移动视频 &选择静态图像。这相对简单,因为阻止视频覆盖内容所需的只是隐藏它们的媒体查询。
也就是说,我发现很难阻止视频被下载,而且开销巨大。
例如,我有一个脚本来检查用户当前是否正在从移动设备访问,因此,我已经尝试过:
var check = false;
window.mobilecheck = function() {
// Check for mobile here
if (check === true) {
// Device is mobile
var videos = document.querySelectorAll('.video-js');
for (var i = 0; i < videos.length; i++) {
// videojs(videos[i]).destroy();
videos[i].parentNode.removeChild(videos[i]);
}
}
}
这成功删除了元素,但这必须在 DOMReady 上调用,这也意味着资源已经开始下载。
如何阻止视频在移动设备上加载?我想找到一个最好使用 VideoJS 的解决方案。
一种方法是通过 JavaScript 设置 video
元素的 src
属性,并且仅基于媒体查询(使用 matchMedia
).
不过,这意味着您的大部分代码必须移至 JavaScript。
例如,您的 HTML 可能类似于:
<video data-mp4="video.mp4" data-webm="video.webm" class="video-js" controls></video>
然后在你的 JavaScript(这里是伪代码,不是真正的 JS):
if (window.matchMedia("(min-width: 640px)").matches) {
// do nothing
} else {
var videos = document.querySelectorAll('.video-js'),
videoFile;
for (var i = 0; i < videos.length; i++) {
// Choose video type
if (video[i].canPlayType("video/mp4") === "probably") {
videoFile = video[i].getAttribute("data-mp4");
}
// do the same check for WebM here...
video[i].src = videoFile;
// Call whatever reload or refresh method video.js has
// for example...
video[i].refresh();
}
}
类似的东西可能对你有用,尽管你可能需要稍微尝试一下。
根据 Ian 提出的建议,这是我的工作解决方案。
首先,我将每个视频的子源元素更改为具有属性 data-src
,如下所示:
<video id="my-id">
<source data-src="somevideo.mp4">
</video>
然后,在使用 http://detectmobilebrowsers.com/ which I modified to include iPads etc (related SO answer here) 提供的脚本执行移动检查后,我只是使用以下脚本自动更新每个视频的 src
属性(如果我们在我的桌面上案例):
var sources = document.querySelectorAll('video#my-id source');
// Define the video object this source is contained inside
var video = document.querySelector('video#my-id');
for(var i = 0; i<sources.length;i++) {
sources[i].setAttribute('src', sources[i].getAttribute('data-src'));
}
// If for some reason we do want to load the video after, for desktop as opposed to mobile (I'd imagine), use videojs API to load
video.load();
就是这样!移动设备上不再加载任何内容,我可以相当精细地控制它将加载或不加载的设备。
希望这对某人有所帮助。
根据 Ian 和 GDGR 的回答,我修改了它以适用于多个视频。
<video class="mobile-no-load">
<source data-src="somevideo.mp4">
</video>
if (window.innerWidth > 730) {
// get multiple videos
var sources = document.querySelectorAll('video.mobile-no-load');
// loop through the videos
sources.forEach(function(source){
// target the src attribute of the <source> element and set it to the data-src attribute
source.childNodes[1].setAttribute('src', source.childNodes[1].getAttribute('data-src'))
});
}