javascript - 如何向 div 的所有子节点和这些 div 的数组添加事件监听器?

标签 javascript arrays events delegation

我正在自学 JS 并尽量避免使用 jQuery,直到我的 JS 技能更好。

目标:为某个类的所有div添加一个事件监听器,用于点击事件。让该类的所有子节点响应该事件。

我的 HTML

 <div class="grid-panel six columns">
            <div class="grid-panel-image">
                <i class="fa fa-css3"></i>
            </div>
            <div class="grid-panel-title">
                <h4>css3</h4>
            </div>                  
    </div>
    <div class="grid-panel six columns">
        <div class="grid-panel-image">
            <i class="fa fa-paint-brush"></i>
        </div>
        <div class="grid-panel-title">
            <h4>tamberator</h4>
        </div>
    </div>

我使用这个 JS 选择了所有的 .grid-panel div

var gridPanels = document.querySelectorAll('.grid-panel');

然后,因为它返回一个类为 .grid-panel 的 div 数组 我为点击添加事件监听器

for(i=0; i<gridPanels.length; i++){
    gridPanels[i].addEventListener('click', myFunction);
}

我的功能是这样的

 myFunction(){
    var e = event.target;

        switch(e){
            case gridPanels[0]:
            modalArray[0].setAttribute("data-modal-display", "show");
            break
            case gridPanels[1]:
            modalArray[1].setAttribute("data-modal-display", "show");
            break
        }

            console.log(e);
    }

如果我单击 .grid-paneldiv 的一个非常特定的部分并且 e 记录该特定元素,这确实有效。但是,单击 div 的任何子项会将 e 记录为我单击的元素,但事件监听器不会应用于该元素。我显然在这个事件代表团中遗漏了一些东西。我真的希望该函数在单击的 div 及其所有子节点上触发。

最佳答案

您绑定(bind)正确,但是如果您想在处理程序中获取处理程序绑定(bind)到的元素,请使用 thisevent.currentTarget 而不是event.target.

event.target 代表被点击的实际元素,这有时也很有用。

此外,您应该在函数中定义event 参数。并非所有浏览器都将其作为全局变量提供。

function myFunction(event){
    var e = this
 // var e = event.currentTarget // same as above

    switch(e){
        case gridPanels[0]:
        modalArray[0].setAttribute("data-modal-display", "show");
        break

        case gridPanels[1]:
        modalArray[1].setAttribute("data-modal-display", "show");
        break
    }

    console.log(e);
}

关于javascript - 如何向 div 的所有子节点和这些 div 的数组添加事件监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35831179/

相关文章:

MYSQL 预定事件

java - 如何为 Action 监听器编写 JUnit?

javascript - JQuery 启用带有按钮事件查询的文本框

javascript - Meteor 如何访问服务器端和客户端的 Facebook Graph Api

javascript - 查找DIV id内容并通过AJAX加载

objective-c - NSArrayController 与 NSMutableArray - 什么时候使用 NSArrayController?

javascript - Jquery 验证插件名称与 Zend_Form 冲突

php - 如何在 laravel 中回显数组元素

php - 将数组转换为另一个数组

javascript - 事件监听器与事件处理程序