gpt4 book ai didi

JavaScript 事件委托(delegate)未按预期工作

转载 作者:太空宇宙 更新时间:2023-11-04 04:18:50 26 4
gpt4 key购买 nike

我只是想我可以在 ul 元素上使用事件委托(delegate),这样点击任何 li 元素都会冒泡到 ul。然后由 ul 的 event.target 捕获以获取正确的 li 元素并根据我对 li 的需要进行处理。这就是我学习的方式。但是点击 contact li 元素并没有像预期的那样发出警报。请在这件事上给予我帮助。我的公司强制我使用事件委托(delegate)。这就是为什么它如此重要。

HTML

<!doctype html>
<html>
<head>
<title>Title</title>
<link rel="stylesheet" type="text/css" href="style.css" >
<script src="JavaScript.js"></script>
</head>
<body>
<div>
<ul id="nav">
<li id="click"><a href="#">Contact</a></li>
<li> <a href="#">Blog</a></li>
<li> <a href="#">Work</a></li>
<li> <a href="#">About</a></li>
<li> <a href="#">Home</a></li>
</ul>
</div>
</body>
</html>

JS

var list = document.getElementById("nav");
list.addEventListener("click", function(event) {
switch(event.target.id) {
case "click":
alert("haha");
break;
}, false);

CSS

body {
margin: 0;
}
#nav {
list-style-type: none;
margin: 0;
padding: 0;
}
#nav li {
width: 20%;
float: left;
text-align: center;
display: inline;
}
#nav li a {
line-height: 40px;
display: block;
padding: 0.5em 5px;
text-decoration: none;
font-weight: bold;
color: #F2F2F2;
-webkit-box-shadow: 3px 3px 3px rgba(51,51,51,0.3);
box-shadow: 3px 3px 3px rgba(51,51,51,0.3);
}
#nav a:link, #nav a:visited {
background-color: #071726;
}
#nav a:hover, #nav a:active, #nav a:focus {
background-color: #326773;
}

最佳答案

您的主要问题是您的事件处理程序中存在语法错误,您缺少开关。 (使用一致的缩进有助于避免此类错误。)

那么你的问题是 event.target 不是你想的那样。 event.target 是被点击的实际元素。在您的情况下,被点击的实际元素很可能是 a 元素(链接)。

因此,您要做的是查看从被点击元素到您点击的元素(将是 this)的沿袭,寻找处于该级别的元素你想要(在你的例子中,一个 li):Live Example | Source

var list = document.getElementById("nav");
list.addEventListener("click", function(event) {
// Start with the element that was clicked
var li = event.target;

// You may want `event.preventDefault();` here

// If the element exists, it isn't the list on which we hooked
// the event, and its tag name isn't LI, go to the parent
// element instead.
while (li && li !== this && li.tagName.toUpperCase() !== "LI") {
li = li.parentNode;
}

// If we got an LI, use it
if (li) {
// OR you may want `event.preventDefault();` here
switch(li.id) {
case "click":
alert("haha");
// OR you may want `event.preventDefault();` here
break;
}
}
}, false);

此外,请确保上面的代码位于 HTML 中导航列表下方script 元素中,或者位于 onload 中handler(推荐前者,把脚本放在最后即可)。

最后:由于链接的 href 只是 "#",我猜您实际上并不希望浏览器访问该链接(因为将向上滚动到页面顶部)。如果是这种情况,您需要在处理程序中添加对 event.preventDefault() 的调用。我已经在上面的几个地方注明了您可能需要它的地方,这取决于您是总是想要阻止链接被跟踪,还是仅在某些情况下。


旁注:虽然您当然可以自己完成这项工作,但您可以通过使用像 jQuery 这样的好库来重用其他人的工作。 , YUI , Closure , 或 any of several others .例如,在 jQuery 中,它看起来像这样:

$("#nav").on("click", "li", function(event) {
// Possibly with `event.preventDefault();` here
switch (this.id) {
case "click":
alert("haha");
// OR possibly with `event.preventDefault();` here
break;
}
});

其他图书馆也有类似的功能。

关于JavaScript 事件委托(delegate)未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19475534/

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