【发布时间】:2015-03-25 22:36:24
【问题描述】:
我在网络编程方面相对较新,因此在保持我的代码清洁方面存在问题。在处理最后一个项目时,除其他事项外,我必须执行以下操作:
- 在主页上自动播放八个可用视频之一(例如 main-vid-3.webm);
- 当它结束时,开始播放下一个(在这种情况下,main-vid-4.webm);
- 然后播放下一个视频,依此类推。在第八个视频之后,必须播放 main-vid-1。
如果我在上一个视频结束后立即开始播放下一个视频,我会出现延迟,因为尚未加载新视频。我的问题解决方法:
- 页面上有两个视频标签,其中一个有 display: none;
- 当带有 display: 块的视频结束时,它会隐藏,而另一个视频出现并开始播放;
- 播放该视频时,隐藏视频的来源随 JS 变化并开始加载(但尚未播放);
- 重复步骤 2;
它起作用了,但是我的代码(尤其是 JS 部分和在页面上必须有两个视频标签)对我来说似乎并不干净和好。有没有更好的解决问题的方法?
<section id="main-page-top">
<video id="bgvid-<?php echo $vidId; ?>" autoplay width="100%">
<source src="<?php echo get_template_directory_uri(); ?>/inc/main-vid-<?php echo $vidId; ?>.webm" type="video/webm">
</video>
<video id="bgvid-<?php echo ($vidId + 1); ?>" class="hidden" width="100%">
<source src="<?php echo get_template_directory_uri(); ?>/inc/main-vid-<?php echo $vidIdAlt; ?>.webm" type="video/webm">
</video>
</section>
document.getElementById('#main-page-top video:nth-child(1)').addEventListener('ended', function() {
document.getElementById('#main-page-top video:nth-child(1)').style.display = "none";
document.getElementById('#main-page-top video:nth-child(2)').style.display = "block";
document.getElementById('#main-page-top video:nth-child(2)').play();
var vidNum = parseInt(document.getElementById('#main-page-top video:nth-child(1)').id.substring(6));
if (vidNum === 7) {
vidNum = -1;
} else if (vidNum === 8) {
vidNum = 0;
}
document.getElementById('#main-page-top video:nth-child(1)').setAttribute('id', 'bgvid-' + (vidNum + 2));
document.getElementById('#main-page-top video:nth-child(1) source').setAttribute('src', 'http://u0065000.isp.regruhosting.ru/template/inc/main-vid-' + (vidNum + 2) + '.webm');
document.getElementById('#main-page-top video:nth-child(1)').setAttribute("poster", "http://u0065000.isp.regruhosting.ru/template/inc/main-vid-" + (vidNum + 2) + ".jpg");
document.getElementById('#main-page-top video:nth-child(1)').load();
document.getElementById('#main-page-top video:nth-child(1)').pause();
});
document.getElementById('#main-page-top video:nth-child(2)').addEventListener('ended', function() {
document.getElementById('#main-page-top video:nth-child(2)').style.display = "none";
document.getElementById('#main-page-top video:nth-child(1)').style.display = "block";
document.getElementById('#main-page-top video:nth-child(1)').play();
var vidNum = parseInt(document.getElementById('#main-page-top video:nth-child(2)').id.substring(6));
if (vidNum === 7) {
vidNum = -1;
} else if (vidNum === 8) {
vidNum = 0;
}
document.getElementById('#main-page-top video:nth-child(2)').setAttribute('id', 'bgvid-' + (vidNum + 2));
document.getElementById('#main-page-top video:nth-child(2) source').setAttribute('src', 'http://u0065000.isp.regruhosting.ru/template/inc/main-vid-' + (vidNum + 2) + '.webm');
document.getElementById('#main-page-top video:nth-child(2)').setAttribute("poster", "http://u0065000.isp.regruhosting.ru/template/inc/main-vid-" + (vidNum + 2) + ".jpg");
document.getElementById('#main-page-top video:nth-child(2)').load();
document.getElementById('#main-page-top video:nth-child(2)').pause();
});
【问题讨论】:
-
两个视频标签部分很好,可能需要,但另一部分重复过度,您使用的是 getElementById() 而不是 querySelector()
-
嗯,之前是querySelector(),所以id前面的括号里有#。我刚刚阅读了 jsperf.com/getelementbyid-vs-queryselector/11 的文章,测试表明 getElementById 在像我这样的情况下工作得更快,所以我决定更改代码。稍后我将删除所有哈希标签。
-
两者的表现都是没有意义的;请注意,jsperf 执行了数百万次运行,而您执行了几十次。我想说的更大一点是,您只需要调用一两次这样的方法而不是几十次,并且重新使用元素 ref 将彻底清理您的代码。只需定义,例如
var e2=document.getElementById('#main-page-top video:nth-child(2)'),然后将所有出现的冗长行替换为e2,例如:e2.load(); e2.pause(); -
正如@dandavis 所说,我认为两个视频标签方法很好,实际上非常优雅。如果您确实想转向不涉及 2 个标签的解决方案(并且如果您喜欢复杂的 Javascript 代码!)HTML5 媒体源扩展机制应该允许您执行类似的操作 - 请参阅此答案以获得概述:stackoverflow.com/a/28717239/334402。再一次,以防万一不清楚 - 我个人会坚持你的两个标签解决方案......
标签: javascript html video