2017-02-10 21 views
0

Я ищу способ создания многоуровневого дерева с событиями onclick в каждом узле.Многоуровневые каскады LI ONCLICK event

У меня есть следующий код:

<div id="tree"> 
    <ul id="UL1" onclick="alert('LEVEL1');"> 
     <li id="LI1"> 
     LEVEL1 
     <ul id="UL2" onclick="alert('LEVEL2');"> 
      <li id="LI2"> 
       LEVEL2 
       <ul id="UL3" onclick="alert('LEVEL3');">    
        <li id="LI3"> 
        LEVEL3 
        <ul id="UL3" onclick="alert('LEVEL4');"> 
         <li id="LI4" >LEVEL4       
        </ul>     
       </ul> 
     </ul>  
    </ul> 
</div> 

цель состоит в том, что если пользователь нажмет на LEVEL4 (к примеру) он получает уведомление только LEVEL4. Проблема заключается в том, что предупреждение каскадом и при нажатии на какой-то определенный уровень я получаю все предупреждения наследования:

  • нажав на LEVEL4 -> оповещения о LEVEL4, LEVEL3, LEVEL2 и LEVEL1
  • нажав на LEVEL3 - -> оповещения о LEVEL3, LEVEL2 и LEVEL1
  • и т.д. ...

Я ищу иметь предупреждение только для соответствующего уровня, что я нажал вместо унаследованного остальных верхних уровней ...

Есть ли простой способ достичь этого?

Спасибо!

ответ

2

Использование делегирования событий с ненавязчивым кодом вместо встроенного.

Прикрепите к вашему родительскому элементу и используйте event объект target, чтобы идентифицировать элемент, который вызвал событие.

Например:

// Your parent element 
 
var div = document.getElementById("tree"); 
 

 
// Attach the eventlistener to the parent element 
 
div.addEventListener('click', dosomething); 
 

 
// Use the target from the event object that is passed to the handler 
 
function dosomething(e) { 
 
\t console.log("You clicked " + e.target.id); 
 
}
<div id="tree"> 
 
    <ul id="UL1" > 
 
     <li id="LI1"> 
 
     LEVEL1 
 
     <ul id="UL2" > 
 
      <li id="LI2"> 
 
       LEVEL2 
 
       <ul id="UL3" >    
 
        <li id="LI3"> 
 
        LEVEL3 
 
        <ul id="UL3" > 
 
         <li id="LI4" >LEVEL4       
 
        </ul>     
 
       </ul> 
 
     </ul>  
 
    </ul> 
 
</div>

+0

Привет Abhi, спасибо! это то, что я искал. Проблема в том, что я использую jquery library (fancytree), чтобы иметь возможность преобразовать структуру ul/li в красивое древовидное представление ... В какой-то момент библиотека устанавливает для свойства отображения NONE для всех UL, а затем Я думаю, где я теряю обработку событий ... Ничего не отображается, когда свойство display установлено равным none. Существует ли какая-либо связь между наличием родительского элемента как diplay: none и назначением ему события? –

+0

@ byle.05, что не должно быть проблемой. Вы можете задать новый вопрос с минимальным воспроизводимым примером. Это поможет. – Abhitalks

+1

Спасибо Абхи, наконец, я смог разобраться. Проблема в том, что библиотека фантазийных деревьев заменяет мою структуру UL/LI собственными, а мои идентификаторы теряются. Я немного изменил библиотеку, чтобы наследовать эти идентификаторы и теперь отлично работает :) –

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

  • Нет связанных вопросов^_^