gpt4 book ai didi

javascript - 为一个类添加了事件监听器,该类的一些成员不受影响

转载 作者:太空宇宙 更新时间:2023-11-03 23:41:22 24 4
gpt4 key购买 nike

我有一个将用作菜单的网格,它由一个 ul 制成的顶行组成,其中 3 个 li 设置为显示:内联 block 在这些 li 的每一个中都有一个 ul,在这 4 个 li 的下面。我已经分配了一个事件监听器来响应点击内部 ul 下的 li,类是“inner”。
您可以在此处查看代码:http://jsfiddle.net/jimeast123/qK2Ju/2/当我单击前 2 列中的元素时(您需要避免单击文本),当我单击第三列时,我收到了预期的警报消息,但没有任何响应。我尝试过使用不同数量的列,但最后一列从不响应

我的代码:html

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>drop down</title>
<style>
body {
margin: 0;
padding: 0;
}
header {
height: 120px;
background-color: #eef;
}
.top {
background-color: #fee;
}
.top li {
display: inline-block;
width: 5.5em;
height: 1.5em;
border: 1px solid black;
text-align: center;
}
li {
list-style: none;
}
.inner {
margin-left: -2.55em;
display:block;
}
li a {
text-decoration: none;
}
.inner li {
display: block;
text-align: center;
background-color: #efe;
}
</style>

</head>
<body>
<!-- heading>h1+nav>ul.top>li*5>(a[href=#]>{menu$})>ul.inner>li*4>a[href=#]>{menu$} -->
<header>
<nav>
<header>
<nav>
<ul class="top">
<li><a href="#">menuA</a>
<ul class="inner" id="one">
<li><a href="#">item1</a></li>
<li><a href="#">item2</a></li>
<li><a href="#">item3</a></li>
<li><a href="#">item4</a></li>
</ul>
</li>
<li><a href="#">menuB</a>
<ul class="inner" id="two">
<li><a href="#">item1</a></li>
<li><a href="#">item2</a></li>
<li><a href="#">item3</a></li>
<li><a href="#">item4</a></li>
</ul>
</li>
<li><a href="#">menuE</a>
<ul class="inner" id="five">
<li><a href="#">item1</a></li>
<li><a href="#">item2</a></li>
<li><a href="#">item3</a></li>
<li><a href="#">item4</a></li>
</ul>
</li>
</ul>
</nav>
</header>
</nav>
</header>
<script src="dropdown.js"></script>
</body>
</html>

JavaScript:

if (document.body.addEventListener) {
document.body.addEventListener('click', theHandler, false);
} else {
document.body.attachEvent('onclick', theHandler); //for IE
}

function theHandler(e){
e = e || window.event;
var target = e.target || e.srcElement;
if (target.className.match(/inner/)) {
//console.log("inner class was clicked");
alert("inner class was clicked");
}
}

最佳答案

用户实际上不能点击 .inner 元素,因为当他们尝试点击时,他们实际最终点击的是 .inner 中的子对象对象。因此,您不会获得该类(class)的目标。

您有几个选择。首先,如果您的 HTML 不是使用 JS 代码动态创建的,那么您可以直接将事件监听器应用于所有 .inner 对象,正常的点击事件传播将导致它们在子节点时触发被点击。

或者,如果您想将事件处理程序保留在主体上,那么解决方法可能是查看父链是否包含该类(您的目标将低于 .inner 几个级别).

function hasClass(elem, cls) {
var str = " " + elem.className + " ";
var testCls = " " + cls + " ";
return(str.indexOf(testCls) != -1) ;
}

function isTargetInClass(target, cls) {
while (target && target !== document.body) {
if (hasClass(target, cls)) {
return true;
}
target = target.parentNode;
}
return false;
}

function theHandler(e){
e = e || window.event;
var target = e.target || e.srcElement;
if (isTargetInClass(target, "inner")) {
//console.log("inner class was clicked");
alert("inner class was clicked");
}
}

关于javascript - 为一个类添加了事件监听器,该类的一些成员不受影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22773195/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com