通过jquery动态的设置video src的值无法播放视频?

<div id="video-box">
 <video style="object-fit: fill;width: 200px;height: 50px;" controls>
    <source src="">
  </video>
</div>
<a class="dj" href="javascript:;" data-src="http://www.w3school.com.cn/i/movie.mp4">点击</a> 
*{padding:0;margin:0;}
#video-box{display:none;}
$(".dj").on("click", function() {
   var src = $(this).data("src");
   $("#video-box source").prop("src",src)
   $("#video-box").show();
});

demo在这里https://jsfiddle.net/r9u1cn7o/
作一个通过点击不同的标签弹出弹框播放相应的视屏,但是通过jquery成功的给src赋值了,但是不知道为什么播放不了?

阅读 31k
8 个回答

通过 jQuery 确实是给 source 的 src 赋值成功,从调试来看,浏览器并没有去发起请求去获得相应的视频,而只是单纯的将 a 标签的 data-src 中的值赋值给 source 了。

但是如果这么做,浏览器就会去请求地址获得视频文件:

$(".dj").on("click", function() {
   var src = $(this).data("src"),
       sourceDom = $("<source src=\""+ src +"\">");
       
   $("#video-box video").append(sourceDom);
   $("#video-box").show();
   
   // 自动播放
   $("#video-box video")[0].play()
});

因此,可以推断出来的是,当 video 中存在 source 标签的时候,浏览器渲染之后会自动去获取地址,即便地址改变,浏览器也不会再去获取地址。但是通过动态的插入 source 标签的方式,可以触发浏览器进行重排,从而去获取相应地址的文件进行播放。

//你在动态赋值src后要加载这个视频文件即:
$("#video-box").load();
//然后在判断是否可以播放了,在播放即:
$("#video-box").addEventListener("canplaythrough", function() { 
    $("#video-box").play();
} );

别用source标签,直接写到video标签里;另外用attr()吧。还有就是video标签的width和height别写到style里,拿出来~

<video>
    <source src="xxx.mp4"/>
    <source src="xxx.ogg"/>
</video>

source 里的 src 只会在渲染的时候被 check 一次.
要动态调整 src , 你应该从 video 入手, 改成这样应该就没问题了
$("#video-box video").prop("src",src)

针对上面的动态更换视频地址,我综合了大家的回答,写了一篇博客,地址:h5 动态更换视频播放地址如下:
1.第一步,html上面,插入播放视频的标签video,且增加一个source,src的值需要先填空处理.

<div id="video-box">
<video style="object-fit: fill;width: 200px;height: 50px;" controls>

<source src="">  

</video>
</div>
点击
//css相关文件
*{padding:0;margin:0;} #video-box{display:none;}
//js代码:点击上传视频文件,下面这个替换视频播放地址的方法是无效的
$(".dj").on("click", function() {
var src = $(this).data("src");
$("#video-box source").prop("src",src)
$("#video-box").show();
});
2.第二步,解决方案如下:
通过 jQuery 确实是给 source 的 src 赋值成功,从调试来看,浏览器并没有去发起请求去获得相应的视频,
而只是单纯的将 a 标签的 data-src 中的值赋值给 source 了。
但是如果这么做,浏览器就会去请求地址获得视频文件:

$(".dj").on("click", function() {  
   var src = $(this).data("src"),  
       sourceDom = $("<source src=\""+ src +"\">");  
         
   $("#video-box video").append(sourceDom);  
   $("#video-box").show();  
     
   // 自动播放  
   $("#video-box video")[0].play()  
});  

因此,可以推断出来的是,当 video 中存在 source 标签的时候,浏览器渲染之后会自动去获取地址,即便地址改变,浏览器也不会再去获取地址。但是通过动态的插入 source 标签的方式,可以触发浏览器进行重排,从而去获取相应地址的文件进行播放。

总结:
上面那个方法,经测试,只能上传一次的时候是有效果的,如果要替换多次视频地址,就会显示第一次的视频,还有有一点问题,可以使用如下方式修改视频的播放地址,参考链接:https://bbs.csdn.net/topics/3...

var videoSrc = data.videoUrl;//新的视频播放地址  
document.getElementById("videoid").src=videoSrc ;  
document.getElementById("videoid").play();  

jsfidle不能嵌入视频. 换到本地就好了

video标签支持的视频格式有(1)H.264编码的mp4文件(2)webm(3)ogg 其他后缀的文件因为专利等问题暂时不支持,可以考虑转码试试

加个play()事件就好了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题