jquery найти номер индекса вложенного li

#jquery #jquery-selectors #event-handling #html-lists

#jquery #jquery-селекторы #обработка событий #html-списки

Вопрос:

Как бы мне получить номер позиции индекса одного из вложенных LI? Я могу получить индекс topnav, но не могу указать номер дочернего индекса subnav (ов).

Я хотел бы динамически создать селектор для таргетинга на subnav на основе индекса topnav.

 <div id="nav_container">
    <ul id="topnav">
        <li><a href="#a">menu item 0</a>
            <ul id="subnav0">
                <li><a href="#">sub menu item</a></li>
                <li><a href="#">sub menu item</a></li>
                <li><a href="#">sub menu item</a></li>
                <li><a href="#">sub menu item</a></li>
                <li><a href="#">sub menu item</a></li>
            </ul>
        </li>
        <li><a href="#a">menu item 1</a>
            <ul id="subnav1">
                <li><a href="#">sub menu item</a></li>
                <li><a href="#">sub menu item</a></li>
                <li><a href="#">sub menu item</a></li>
            </ul>
        </li>
        <li><a href="#">menu item 2</a></li>
        <li><a href="#">menu item 3</a></li>
     </ul>
</div>
 

Мой код jQuery

  //Event Handler
 function nav_execute(){
    var _index = $('#topnav > li').index(this);//Returns index number of topnav item selected
    var _subnav = '#subnav'  _index.toString();
    var _selector = _subnav   ' > li'.toString();//the subnav selector
    var _subindex = $(_selector).index();//gets total num of index's
}

//Binded event
$('#topnav > li').bind('click', nav_execute);
 

Ответ №1:

С оговоркой, что я действительно не уверен, что понял, к чему вы стремитесь, попробуйте заменить ваш javascript на:

 $('#topnav  li').bind('click', function (){
  alert($(this).index());   
});
 

Смотрите Полный пример здесь
(это не решение. Это способ увидеть, какие элементы запускают события и в каком порядке).

Комментарии:

1. при использовании селектора выше, как будет отслеживаться, является ли выбранный элемент элементом topnav или элементом subnav?

Ответ №2:

Итак, я ДУМАЮ, вы пытаетесь сказать, что я хочу получить ul «subNav», содержащийся в любом «#topNav> li», который был нажат?

Если это то, что вы пытаетесь сделать, то это должно сработать

 //Event Handler
 function nav_execute(){
    var $subNav = $(this).find("ul");

    //I'm not sure what you are trying to do here so im not going to change the functionality
    var subindex = $subNav.index();//gets total num of index's
}

//Binded event
$('#topnav > li').bind('click', nav_execute);
 

Редактировать:

Согласно вашему комментарию, вот jsfiddle того, что вы хотите: http://jsfiddle.net/wuFB7/4 /

Вы можете просто создать селектор для этих вложенных li напрямую. Однако, поскольку вы сказали, что они генерируются динамически, я изменил «.bind» на «.live», поскольку это позволит прикреплять обработчики событий к элементам, созданным после начальной загрузки страницы.

Комментарии:

1. По сути, я просто пытаюсь получить номер позиции индекса элемента LI в subnav на основе события click. Если я нажму на третий LI в subnav0, я хотел бы иметь возможность возвращать число 2. Причина в том, что меню создаются динамически, и это основной механизм отслеживания.

2. Спасибо, это круто, но есть ли способ провести различие между верхним LI и щелчком subnav LI? Таким образом, оповещение будет указывать позицию верхнего номера индекса LI и позицию номера индекса subnav LI.

3. Я обновил jsfiddle. Я думаю, это то, что вы хотите. в предупреждении теперь отображается индекс subnav и индекс li в topnav.

4. Спасибо Киту. Это близко, но я начинаю думать, что jquery может быть правильным инструментом. Я действительно просто хочу обновить переменные. Если пользователь нажимает на topnav, параметр topnav обновляется и очищает параметр subnav, и в вашем примере, если пользователь нажимает на subnav, обе переменные обновляются. Я просто не могу понять, как узнать, на что они нажали.

Ответ №3:

 This code seems to have solved my problem. This checks the parent 'id' and then performs a simple conditional statement to determine which nav was clicked. It then stores the index(s) to their master vars.


 function nav_execute(e){

    var id = $(this).parent().attr("id").toString();

    if(id == "topnav"){
        _index = $(this).index();
        _subindex = null;
    }else{
        _index = $(this).parent().parent().index();
        _subindex = $(this).index();    
    }

    console.log('_index: '   _index);
    console.log('_subindex: '   _subindex);

    return false;   
}


$('#topnav > li').live('click', nav_execute);


Thanks for the help from everyone!