next () в jQuery для элементов не рядом друг с другом - PullRequest
3 голосов
/ 07 апреля 2010

У меня есть биты ужасного кода, с которым мне приходится иметь дело

...
<div class="container">
   ...
    <tr>
    <td width="100" height="50">
         <a class="swaps"><img src="http://www.blah.jpg" alt="Some Title" id="1"></a></span></td>
    </tr>
   <tr>
    <td width="100" height="50">
        <a class="swaps"><img src="http://www.blah2.jpg" alt="Another title" id="2"></a></span></td>
    </tr>
</div>

Если я использую

var thisone = $("#container .swaps:first")

, чтобы выбрать первый (с идентификатором 1), почему у меня проблемы с выбором

thisone.next()

Ответы [ 8 ]

4 голосов
/ 07 апреля 2010

HTML настоящий? Я не вижу ни одного элемента с идентификатором "контейнер", и вы делаете

$("#container .swaps:first")

Кроме того, если это настоящий HTML, вам следует немного его исправить (закройте тег img и добавьте открывающий тег для диапазона перед )

Если ваш HTML в порядке, это должно работать для вашего сценария.

var thisone = $("#container .swaps:first");
thisone.children();

IMG - это не брат и не якорь, это ребенок.

1 голос
/ 07 апреля 2010

Функция next() jQuery возвращает следующего брата по мере его появления в дереве DOM (не в наборе результатов jQuery) для всех соответствующих элементов. Так зовут

$("#container .swaps:first")

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

Объект jQuery - это массив элементов. Вы можете просто сохранить текущий индекс в переменной и увеличить его после получения следующего элемента.

// Naive way
var items = $("#container .swaps");
var i = 0;
items[i++] // first <a>
items[i++] // second <a>

Вот две реализации, которые обертывают вышеуказанную функциональность с использованием шаблона Iterator - одна, которая работает как плагин jQuery, другая по сути является отдельной функцией. Оба работают одинаково:

// Iterator function
function Iterator(list) {
    var results = list;
    var i = 0;

    this.next = function() {
        return results[i++];
    };

    return this;
}

// Usage
var iterator = Iterator($("#container .swaps"));
iterator.next() // first <a>
iterator.next() // second <a>

Второй почти идентичен первому, но вместо него используется плагин jQuery:

// jQuery plugin
$.fn.iterator = function() {
    var i = 0;

    this.next = function() {
        return this[i++];
    };

    return this;
};

// Usage
var iterator = $("#container .swaps").iterator();
iterator.next() // first <a>
iterator.next() // second <a>

Javascript 1.7 имеет несколько интересных функций в генераторах и итераторах для выполнения именно этого, но пока он не получил широкого распространения - насколько мне известно, его поддерживает только Firefox.

1 голос
/ 07 апреля 2010

метод next () проверяет братьев и сестер на совпадения ... в вашем сценарии нет других братьев и сестер с классом .swaps ... try $ ("# container .swaps")

1 голос
/ 07 апреля 2010

Потому что, как говорит Jquery docs:

Первый псевдо-класс эквивалентен to: eq (0). Это также может быть написано как : Л (1). Хотя это соответствует только один элемент: первый ребенок может соответствовать более одного: по одному на каждого родителя.

Попробуйте использовать .children() как в $(selector).children();

0 голосов
/ 07 апреля 2010

Во-первых, я знаю, что это не ваш код, но идентификаторы никогда не должны начинаться с или только содержать номер.

Я не уверен, что вы пытаетесь сделать, но я думаю, было бы проще, если бы вы просто перебрали все .swaps, как это:

$('#container .swaps').each(function(){
 var swapImg = $(this).find('img');
 // do something else
})
0 голосов
/ 07 апреля 2010

Ваш селектор должен быть

var thisone = $("div.container a.swaps:first");
var img = thisone.children(img);

Также ваш идентификатор недействителен.Вы не можете начать идентификатор с номера.

0 голосов
/ 07 апреля 2010

В вашем примере thisone.next() на самом деле ничего не должно получить, потому что нет родного брата (на том же уровне) в исходном выборе.То, что вы хотите, это дети thisone, то есть img, используя thisone.children("img").

0 голосов
/ 07 апреля 2010

Вы используете :first, который сокращает набор до единицы, так что нет «следующего».Вы можете попробовать использовать :first-child.

...