Я просто подумал, что могу использовать делегирование делегирования на элементе ul, чтобы щелчок по любому из элементов li пузырился до ul. Затем он захватывает ul event.target, чтобы получить правильный элемент li и действовать в соответствии с тем, что мне нужно с ли. Так я узнал. Но щелчок на элементе контакта li не предупреждает, как ожидалось. Пожалуйста, помогите мне с этим. Моя компания заставляет меня использовать делегацию событий. Вот почему это так важно.
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;
}
Основная проблема заключается в том, что в обработчике событий есть синтаксическая ошибка, вам не хватает }
для switch
. (Использование последовательных отступов поможет избежать подобных ошибок.)
Тогда ваша проблема в том, что event.target
- это не то, что вы думаете. event.target
- это фактический элемент, который был нажат. Шансы в вашем случае состоят в том, что фактический элемент, который был нажат, - a
элемент (ссылка).
Итак, что вы хотите сделать, это посмотреть на линию от элемента clicked до элемента, на который вы нажмете клик (который будет this
), ища тот, который находится на нужном уровне (в вашем случае, li
): Живой пример | Источник
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);
Кроме того, убедитесь, что приведенный выше код находится либо в элементе script
под вашим навигационным списком в HTML, либо в обработчике onload
(я рекомендую первый, просто поместите скрипт в конец).
И, наконец: Поскольку ссылка href
просто "#"
, я предполагаю, что на самом деле вы не хотите, чтобы за ней следовал браузер (так как это прокрутит вверх до верхней части страницы). В этом случае вам нужно добавить вызов event.preventDefault()
в обработчик. Я заметил несколько мест выше, где вы можете этого захотеть, это зависит от того, хотите ли вы всегда препятствовать тому, чтобы ссылка не соблюдалась, или только в определенных случаях.
Замечание: Хотя вы, конечно, можете сделать эту работу самостоятельно, вы можете повторно использовать работу других, используя хорошую библиотеку, такую как jQuery, YUI, Closure или любой другой. Например, в 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;
}
});
Другие библиотеки имеют схожие функции.