【问题标题】:Loading videos on-the-fly即时加载视频
【发布时间】:2015-03-25 22:36:24
【问题描述】:

我在网络编程方面相对较新,因此在保持我的代码清洁方面存在问题。在处理最后一个项目时,除其他事项外,我必须执行以下操作:

  1. 在主页上自动播放八个可用视频之一(例如 main-vid-3.webm);
  2. 当它结束时,开始播放下一个(在这种情况下,main-vid-4.webm);
  3. 然后播放下一个视频,依此类推。在第八个视频之后,必须播放 main-vid-1。

如果我在上一个视频结束后立即开始播放下一个视频,我会出现延迟,因为尚未加载新视频。我的问题解决方法:

  1. 页面上有两个视频标签,其中一个有 display: none;
  2. 当带有 display: 块的视频结束时,它会隐藏,而另一个视频出现并开始播放;
  3. 播放该视频时,隐藏视频的来源随 JS 变化并开始加载(但尚未播放);
  4. 重复步骤 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


【解决方案1】:

谢谢你们。我找不到是否可以将您的 cmets 标记为正确答案。

现在代码是这样的(添加了淡入淡出的功能):

var vidFading = function(p1, p2) {
    $(p1).on('timeupdate', function(event) {
        var current = Math.round(event.target.currentTime * 1000);
        var total = Math.round(event.target.duration * 1000);

        if ((total - current) < 500) {
            $(this).fadeOut("slow");
            $(p2).fadeIn(1000);
        }
    });
}
var vidFoo = function(p1, p2) {
    var x = document.querySelector(p1);
    var x1 = document.querySelector(p1 + ' source')
    var y = document.querySelector(p2);
    y.play();
    var vidNum = parseInt(document.querySelector(p1).id.substring(6));
    if (vidNum === 7) {
        vidNum = -1;
    } else if (vidNum === 8) {
        vidNum = 0;
    }
    x.setAttribute('id', 'bgvid-' + (vidNum + 2));
    x1.setAttribute('src', 'http://u0065000.isp.regruhosting.ru/template/inc/main-vid-' + (vidNum + 2) + '.webm');
    x.setAttribute("poster", "http://u0065000.isp.regruhosting.ru/template/inc/main-vid-" + (vidNum + 2) + ".jpg");
    x.load();
    x.pause();
}


if (document.getElementById('main-page')) {

    vidFading('#main-page-vid video:nth-child(1)', '#main-page-vid video:nth-child(2)');
    vidFading('#main-page-vid video:nth-child(2)', '#main-page-vid video:nth-child(1)');

    document.querySelector('#main-page-vid video:nth-child(1)').addEventListener('ended', function() {
        vidFoo('#main-page-vid video:nth-child(1)', '#main-page-vid video:nth-child(2)');
    });

    document.querySelector('#main-page-vid video:nth-child(2)').addEventListener('ended', function() {
        vidFoo('#main-page-vid video:nth-child(2)', '#main-page-vid video:nth-child(1)');
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 2017-06-18
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    相关资源
    最近更新 更多