我正在教自己JS并试图避免jQuery,直到我的JS技能更好。
目标:为click事件添加一个eventlistener到某个类的所有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-panel
div的非常特定部分并且e
记录该特定元素,这确实有效。但是,单击div的任何子项将e
记录为我单击的元素,但eventlistener不会应用于该元素。我在这个事件代表团中明显遗漏了一些东西。我真的希望函数能够在点击的div及其所有子节点上触发。
答案 0 :(得分:3)
您正确绑定,但如果您想获取处理程序中绑定处理程序的元素,请使用this
或event.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);
}