【问题标题】:Add Javascript functionality to more than one element向多个元素添加 Javascript 功能
【发布时间】:2014-06-30 16:59:20
【问题描述】:

我有几行 Javascript 为 HTML5 视频定义了一个自定义“播放”按钮。

我遇到的问题是它们适用于一个视频,并且仅适用于一个视频。我想在我的页面上有几个视频,它们都使用相同的 Javascipt 代码。这样播放按钮就可以在每个视频上单独工作。目前它仅适用于 HTML 中列出的第一个视频。

我该如何进行这项工作?

JS

var vid, playbtn;

function intializePLayer(){
    vid = document.getElementById("my_video");
    playbtn = document.getElementById("playpausebtn");
    playbtn.addEventListener("click",playPause,false);
}

window.onload = intializePLayer;

function playPause(){
    if(vid.paused){
            vid.play();
            playbtn.style.opacity = '0';
    }else{
            vid.pause();
            playbtn.style.background = "url('http://i61.tinypic.com/xm8qdu.png')";
            playbtn.style.backgroundSize = "105px 105px";
            playbtn.style.opacity = '1';
    }
}

CSS

#video_container{
    position:relative;
    width:480px;
    height:264px;
}

button#playpausebtn{
    background:url('http://i61.tinypic.com/xm8qdu.png') no-repeat;
    position:absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    margin:auto;
    border:none;
    outline:none;
    width:105px;
    height:105px;
    cursor:pointer;
    background-size: 105px 105px;
}

HTML

<!-- Video #1 -->
<div id="video_container">
    <button id="playpausebtn"></button>
    <video id="my_video" width="480" loop>
        <source src="http://www.w3schools.com/html/mov_bbb.mp4" type="video/mp4">
    </video>
</div>
<!-- Video #2 -->
<div id="video_container">
    <button id="playpausebtn"></button>
    <video id="my_video" width="480" loop>
        <source src="http://www.w3schools.com/html/mov_bbb.mp4" type="video/mp4">
    </video>
</div>

【问题讨论】:

  • ID 必须是唯一的。使用类并按类而不是 id 获取元素
  • ID 应该是唯一的,使用类,正如 Popnoodles 所说的那样。
  • 你不能有两个具有相同 ID 的元素。
  • 是否可以使用 .class 来做到这一点?如果我在同一页面上说 10 个视频并且每个视频都需要一个唯一的 ID,这似乎是过多的代码。

标签: javascript html controls


【解决方案1】:

这种方法将帮助您拥有一个->n 个视频。在小提琴中,我们首先在 DOM 中搜索类名为 playpausebtn 的元素,然后为每个元素添加一个 onclick 监听器。此侦听器获取视频对象(在这种情况下必须直接位于按钮之后,您可以更改此代码以使用递增的 id,例如 video_1、video_2 等并以这种方式查找视频对象)并将其添加到 onclick 事件侦听器.

这只是一种方法,但它是解决您的问题的一种方法 - 如果您有任何不明白的地方,请提出问题。

http://jsfiddle.net/tL5ZU/1/

HTML:

<!-- Video #1 -->
<div>
    <button class="playpausebtn">Play</button>
    <video width="480" loop>
        <source src="http://www.w3schools.com/html/mov_bbb.mp4" type="video/mp4" />
    </video>
</div>
<!-- Video #2 -->
<div>
    <button class="playpausebtn">Play</button>
    <video width="480" loop>
        <source src="http://www.w3schools.com/html/mov_bbb.mp4" type="video/mp4" />
    </video>
</div>

JS

//set up listeners for buttons
function init() {
    //get all buttons
    var buttons = document.getElementsByClassName('playpausebtn');
    //for each button set up the onclick listener
    for (var i = 0; i < buttons.length; i++) {
        buttons[i].onclick = (function () {
            //the video needs to be right after the button
            var video = buttons[i].nextSibling.nextSibling;
            return function () {
                if (video.paused) {
                    video.play();
                } else {
                    video.pause();
                }
            };
        })();
    }
}

init();

【讨论】:

  • 确实解决了播放按钮的问题!我正在尝试实现我在玩家身上拥有的其他按钮,但没有运气。我有关闭播放器、最小化播放器、全屏和时间更新的操作。在此处查看示例jsfiddle.net/tL5ZU/6 完全卡住了
  • 首先,如果这回答了您的问题,请选中答案旁边的复选标记以接受它。接下来,我试图弄清楚如何解释正在发生的事情,而不是为您编写代码。代码中的第一个问题是您添加的每个方法都依赖于方法之外的变量,而不是传递给方法的参数(这使得每个方法都是独立的)。第二个是 getElementsByClassName 向您返回一个 DOM 对象数组,而不是单个对象 - 因此您必须遍历它们并使用单个实例而不是数组。
  • 由于您有多个按钮,我可能会重构您的 HTML 以给每个包装 DIV 一个特定的类,然后找到这些并使用其中的按钮(而不是每个按钮一个循环)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
相关资源
最近更新 更多