Делегирование событий JavaScript не работает должным образом

0

Я просто подумал, что могу использовать делегирование делегирования на элементе 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;
}
  • 0
    может кто-нибудь возиться с ответом?
  • 1
    и что вы видите в инструментах разработчика вашего браузера?
Показать ещё 3 комментария
Теги:

1 ответ

2
Лучший ответ

Основная проблема заключается в том, что в обработчике событий есть синтаксическая ошибка, вам не хватает } для 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;
    }
});

Другие библиотеки имеют схожие функции.

  • 0
    не могли бы вы поиграть так же, потому что ваш код не дает мне оповещения, TJ Crowder. :-(
  • 1
    @ user2899508: Возможно, вы могли бы создать скрипку, показывающую, что она не работает.
Показать ещё 11 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню