Нумеруйте элементы по классам и получайте размещение определенного div

#javascript #jquery

#javascript #jquery

Вопрос:

У меня есть такой список:

 <div class="list"></div>
<div class="list"></div>
<div class="list on"></div>
<div class="list"></div>
... etc
  

Я получаю общее количество следующим образом:

 var count = $('.list').length; // 4 in this case
  

Но я хочу написать функцию, которая выбирает следующий div со стрелкой вниз, и я не могу понять, как получить следующий div, выбрать его и отменить выбор текущего div. Это то, что у меня есть сейчас, но это не работает:

 var visible = $('.list:visible');
var on = $('.list.on:visible');
if (e.keyCode == 40) { // down key
    if(on.length == 0) {
        visible.first().addClass("on"); // this works
    }
    else if( // div placement // < count) {
        var next = on.next(); // this part doesn't work
        on.removeClass("on"); // :(
        next.addClass("on"); // :(
    }
    else { // if its the last div
        // do nothing
    }
}
  

Ответ №1:

Вы можете сделать:

 if (e.keyCode == 40) { // down key
    if(on.length == 0) {
        visible.first().addClass("on");
    }
    else if(on.length amp;amp; on.next("div.list").length > 0) {
        var next = on.next("div.list");
        on.removeClass("on");
        next.addClass("on");
    }
    else { // if its the last div
    // do nothing
    }
}
  

Быстрая демонстрация: http://jsfiddle.net/GL7tA /

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

1. Это работает до тех пор, пока вы не введете скрытый элемент в список? jsfiddle.net/GL7tA/1

2. @user2250471 — :visible затем используйте селектор

3. Я попробовал: видимый селектор. По-видимому, next()/ prev() игнорирует селектор, поэтому он не сработал. В итоге я использовал другой класс для скрытых элементов списка (вместо .hide();) и .nextAll(‘.list:first’).addClass(«on»); чтобы заставить его полностью работать, потому что он все еще глючил. Но ваш ответ указал мне правильный путь, поэтому я отдам вам должное. 🙂

Ответ №2:

Вы можете работать, .index() чтобы увидеть, какой элемент в данный момент «выбран»:

 var $items = $('.list:visible'),
$selectedItem = $items.filter('.on'),
selectedIndex = $items.index($selectedItem);

if (selectedIndex == -1) {
  $items.eq(0).addClass('on');
} else if (selectedIndex   1 < $items.length) {
  $selectedItem.next().andSelf().toggleClass('on');
}
  

Ответ №3:

У вас the else if ( частично синтаксическая ошибка, когда вы говорите, что это не работает.

Это не работает, потому else if что ожидается вычисление условия, но вы даже не закрываете скобки этого if условия, и при этом вы не открыли скобки для его блока.

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

1. Кроме того, попробуйте проверить свой код javascript в консоли javascript, чтобы вы могли увидеть, есть ли у вас синтаксические ошибки, или запустите его в режиме реального времени на веб-странице, чтобы увидеть, работает ли он. Я бы порекомендовал вам блокнот firefox, консоль firebug, консоль chrome dev tools или opera dragonfly