2015-04-25 2 views
0

У меня есть список в моей навигационной панели, в которой есть список внутри него, который используется в качестве выпадающего меню. Общий список называется категориями (я знаю, что он должен иметь ссылку на другую страницу, но я просто пытаюсь заставить динамический контент работать в первую очередь).Добавление события в список дочернего узла

У меня есть прослушиватель событий, прикрепленный к этому элементу, который выводит пользователя на страницу, отображающую все категории.

При наведении указателя мыши на этот элемент отображается список категорий. То, что я хотел бы сделать, - это щелкнуть по одному из них, и это приведет пользователя прямо к категории.

Это работает с моим кодом, но только в определенных местах. В других это приводит меня к странице, которая отображает все категории.

Вот код, я использую для добавления событий:

var categoryHeading = document.getElementById('categoriesNav'); 

dropList = document.createElement("ul"); 
dropList.setAttribute("id", "categoriesDrop"); 
categoryHeading.appendChild(dropList); 

categoryHeading.addEventListener('click', displayCategoriesPage); //displayCategoriesPage displays a page with all categories listed 
categoryHeading.addEventListener("mouseover", function(){ 
    if(dropList){ 
    dropList.style.display = "block"; 
    } 
}); 

categoryHeading.addEventListener("mouseout", function(){ 
    if(dropList){ 
    dropList.style.display = "none"; 
    } 
}); 

var categoryListItems = document.getElementsByClassName("categoryListItem"); 
for(var i=0; i<categoryListItems.length; i++){ 
    categoryListItems[i].addEventListener("click", function(e){ 
    displaySingleCategory(e); //Displays the page with all items from one category 
    }); 
} 

Вот это HTML:

<nav> 
    <ul> 
    <li id="homeNav"></li> 
    <li id="categoriesNav"> 
     <a>Categories</a> 
     <ul id="categoriesDrop"> 
     <li class="categoryListItem">Outdoor</li> 
     <li class="categoryListItem">Technology</li> 
     </ul> 
    </li> 
    <li id="basket"></li> 
    <li id="search"></li> 
    </ul> 
</nav> 

Я предполагаю, что проблема с тем, как мой <nav> выложена , Или где я добавил события.

+0

Проблема заключается в 'displaySingleCategory', который вы не показываете. Я угадаю и скажу, что вы не прекращаете распространение событий там, поэтому оба события срабатывают сразу. См. Https://developer.mozilla.org/en-US/docs/Web/API/Event/stopPropagation. Вы также можете использовать делегирование событий с одним слушателем, поскольку его легче поддерживать, чем несколько слушателей (см. Http://www.nczonline.net/blog/2009/06/30/event-delegation-in-javascript /). И я не могу понять, почему вы вызываете 'displaySingleCategory' из анонимной функции, а не просто назначаете ее как сам слушатель. –

ответ

2

В Javascript всякий раз, когда срабатывает событие, поведение по умолчанию происходит через DOM.

В вашем случае вам необходимо остановить распространение события, потому что у вас есть прослушиватель кликов в дочернем элементе li и его родительский элемент, который будет запущен, показывая вам страницу категорий, а не страницу конкретной категории.

Ставьте e.stopPropagation(); на прием детей.

+0

Спасибо! Это сон! – Adam

Смежные вопросы