【问题标题】:How to add Event Listener on Multiple tag at once如何一次在多个标签上添加事件侦听器
【发布时间】:2018-10-23 14:06:43
【问题描述】:

我是 Javascript 新手。我有这些图像要在 main-img 上替换。下面的代码工作正常,但我只想知道如何通过在 Javascript 中使用更少的代码来做到这一点。

<div id="container">
        <div id="side-img">
            <img id="side1" onclick="side1()" src="img1.jpeg">
            <img id="side2" onclick="side2()" src="img2.jpeg">
            <img id="side3" onclick="side3()" src="img3.jpeg">
            <img id="side4" onclick="side4()" src="img4.jpeg">
        </div>
        <div id="main-img">
            <img id="main" src="img0.jpeg">
        </div>
        
    </div>
    
    
    
    
    <script type="text/javascript">
        var sideimg = document.querySelectorAll('#side-img img');
        var main = document.querySelector('#main');
    
             function side1() {
                main.src = sideimg[0].src;
             }
             function side2() {
                main.src = sideimg[1].src;
             }
             function side3() {
                main.src = sideimg[2].src;
             }
             function side4() {
                main.src = sideimg[3].src;
             }
            
        
    </script>

【问题讨论】:

  • 搜索如何使用 javascript 创建幻灯片

标签: javascript html event-handling dom-events addeventlistener


【解决方案1】:

您可以通过像这样修改图像标签来简化它:

<img id="side1" onclick="side(0)" src="img1.jpeg">
<img id="side2" onclick="side(1)" src="img2.jpeg">
<img id="side3" onclick="side(2)" src="img3.jpeg">
<img id="side4" onclick="side(3)" src="img4.jpeg">


并删除 JS 脚本中的所有 side() 函数并添加此函数:

var sideimg = document.querySelectorAll('#side-img img');
var main = document.querySelector('#main');

function side(index) {
    main.src = sideimg[index].src;
}

【讨论】:

  • 谢谢兄弟的帮助。
【解决方案2】:

您可以以编程方式为每个图像附加一个 onclick 处理程序。

document.querySelectorAll('img').forEach((img) => {
  img.onclick = () => {
    console.log(img.src)
    document.querySelector('#main').src = img.src
  }
})
<div id="container">
  <div id="side-img">
    <img id="side1" src="img1.jpeg">
    <img id="side2" src="img2.jpeg">
    <img id="side3" src="img3.jpeg">
    <img id="side4" src="img4.jpeg">
  </div>
  <div id="main-img">
    <img id="main" src="img0.jpeg">
  </div>

</div>

【讨论】:

    【解决方案3】:

    包含代表团的版本

    JS

    const viewer = document.querySelector('#main');
    document.addEventListener('click', (event) => {
        if (typeof event.target.hasAttribute('data-clickable') && event.target.src) {
            viewer.src = event.target.src;
        }
    })
    

    HTML

    <div id="container">
      <div id="side-img">
        <img id="side1" data-clickable src="img1.jpeg">
        <img id="side2" data-clickable src="img2.jpeg">
        <img id="side3" data-clickable src="img3.jpeg">
        <img id="side4" data-clickable src="img4.jpeg">
      </div>
      <div id="main-img">
        <img id="main" src="img0.jpeg">
      </div>
    </div>
    

    【讨论】:

      【解决方案4】:

      我建议:

      // retrieving the common ancestor element of the <img> elements:
      let sideImage = document.querySelector('#side-img'),
      
      // defining a named function, using arrow syntax; 'e' is a reference
      // to the event object, passed automatically from the
      // EventTarget.addEventListener() method:
        imageChange = (e) => {
      
          // we retrieve the element with the 'id' of 'main', and update
          // its src property to be that of the clicked element;
          // e.target retrieves the element upon which the event was
          // originally triggered:
          document.getElementById('main').src = e.target.src;
        };
      
      sideImage.addEventListener('click', imageChange);
      

      let sideImage = document.querySelector('#side-img'),
        imageChange = (e) => {
          document.getElementById('main').src = e.target.src;
        };
      
      sideImage.addEventListener('click', imageChange);
      <div id="container">
        <div id="side-img">
          <img id="side1" src="https://via.placeholder.com/100.png?text=image1">
          <img id="side2" src="https://via.placeholder.com/100.png?text=image2">
          <img id="side3" src="https://via.placeholder.com/100.png?text=image3">
          <img id="side4" src="https://via.placeholder.com/100.png?text=image4">
        </div>
        <div id="main-img">
          <img id="main" src="img0.jpeg">
        </div>
      
      </div>

      JS Fiddle demo.

      关于 OP 留下的 cmets 中的问题:

      您能否向我解释一下容器 #side-img 是如何循环遍历每个图像并向它们添加事件侦听器的?

      当然,在这种情况下,我们使用事件委托来利用事件在 DOM 中冒泡的方式。

      我们没有将事件监听器绑定到多个 &lt;img&gt; 元素,而是利用了事件在 DOM 中冒泡的方式;这意味着我们在click 事件到达#side-img 时侦听它,并查看Event 对象的target 属性以找到最初触发事件的元素。

      参考资料:

      【讨论】:

      • 您能否向我解释一下容器#side-img 是如何遍历每个图像并向它们添加事件侦听器的。如果我的问题很愚蠢,我很抱歉
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      相关资源
      最近更新 更多