【问题标题】:Mulitple Elements with the same ID具有相同 ID 的多个元素
【发布时间】:2017-06-09 10:56:37
【问题描述】:

我正在尝试在同一页面上使用相同 ID (#vid) 的三个视频上使用脚本。目前似乎只有一个视频能够使用该脚本。

var video = document.getElementById('vid')
// When the 'ended' event fires
video.addEventListener('ended', function(){
  // Reset the video to 
  video.currentTime = 0;
  // And play again
  video.load();
});

【问题讨论】:

  • id 应该是唯一的,否则只有第一个被选中
  • 谢谢 Pranav,我该如何修改?
  • 将类附加到您的元素
  • 如果要在多个元素上使用,请尝试使用 class 而不是 id
  • 尝试使用类,但脚本似乎不适用于所有 3 个视频

标签: javascript video getelementbyid


【解决方案1】:

Id 必须是唯一的。您应该改用class,然后使用document.getElementsByClassName('className');

var video = document.getElementsByClassName('vid');
var myFunction = function() {
    // Reset the video to 
    this.currentTime = 0;
    // And play again
    this.load();
};

for (var i = 0; i < video.length; i++) {
    video[i].addEventListener('ended', myFunction, false);
}

【讨论】:

  • @epascarello 是的,我明白了,我已经编辑了代码以循环到单个元素,之前犯了一个错误
【解决方案2】:

ID 在一个文档中只能使用一次,并且它们应该是唯一的。相反,您应该做的是给他们一个类,然后以该类为目标并在该类的每个项目上运行该函数。

例如给他们一个 class="vid"

<script>

var videos = document.getElementsByClassName('vid');
// When the 'ended' event fires


for (var i = 0; i < videos.length; i++) {
    videos[i].addEventListener('ended', function(){
    // Reset the video to 
    videos[i].currentTime = 0;
    // And play again
    videos[i].load();
   });
}

</script>

我不确定这个确切的代码是否适用于添加的事件侦听器,但这个概念是正确的。

【讨论】:

    【解决方案3】:

    id 属性应该是唯一的,否则只有第一个总是被选中。因此,对一组元素使用class 并遍历它们以附加事件处理程序。

    <script>
      var video = document.getElementsByClassName('vid');
      // convert the element collection to array using Array.from()
      // for older browser use `[].slice.call()` for converting into array
      // and iterate over the elements to attach listener
      Array.from(video).forEach(function(v) {
        v.addEventListener('ended', function() {
          v.currentTime = 0; // or use `this` to refer the element
          v.load();
        });
      })
    </script>
    

    【讨论】:

    • 仅供参考:IE 不支持Array.from。所以要么需要 polyfill,要么需要一个 for 循环。
    • @epascarello : 在评论中添加了替代项
    • @epascarello: 哦,IE...Edge 显然支持它(ref);垫片就像Array.prototype.slice.call(...) 一样简单,所以这不是一个大问题,真的。
    • 仅供参考:错字 getElementsByClassname 应该是 getElementsByClassName
    【解决方案4】:

    使用多个相同的标识符是无效的标记,因为getElementById 只返回一个元素,它将返回它遇到的第一个元素。

    但是,如果您无法使用现有方案完全更改标记,则可以使用 querySelectorAll 选择具有相同 id 属性值的所有元素。

    var videos = document.querySelectorAll('[id="vid"]')
    
    for (var i = 0; i < videos.length; i++) {
        videos[i].addEventListener('ended', function() {
            // Reset the video to 
            video.currentTime = 0;
            // And play again
            video.load();
        });
    }
    

    但是,如果可以,您应该使用其他方式来识别元素,例如数据属性或类。

    就我个人而言,我倾向于将数据属性用于功能用途,而将类用于 CSS。

    这样他们的用途就保持独占性,而 UI 开发人员也在不断变化 classes/css 不会影响您的功能代码,因为它们不应更改 属性,反之亦然。

    【讨论】:

      【解决方案5】:

      这些答案中的大多数只是部分正确。

      为了使您的标记有效,id 必须是唯一的。但是,有时粗心的开发人员会在 DOM 中重复使用相同的 id。不要害怕,这不是世界末日,您仍然可以访问具有相同 id 的多个元素,就像使用类一样。

      document.querySelectorAll('#vid'); 
      

      将返回具有相同 id 元素的 HTMLCollection(类似对象的数组)。

      【讨论】:

      • 这是一种不好的做法,不应鼓励。这个答案只是一个创可贴
      • @j08691 这绝对是一种糟糕的做法。我不推荐它作为应该做的事情。我确实指出它是无效的 HTML,加粗的 id 必须是唯一的。
      猜你喜欢
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      • 2016-12-06
      • 1970-01-01
      相关资源
      最近更新 更多