#jquery #jquery-selectors
#jquery #jquery-селекторы
Вопрос:
Я создаю скрипт, который будет добавлять, в каждый элемент списка неупорядоченного списка, за исключением последнего элемента списка — он должен заканчиваться на ;. Это должно происходить для каждого неупорядоченного списка!
Это как…
<ul>
<li>a</li>
<li>b</li>
<li>c</li>
</ul>
<ul>
<li>d</li>
<li>e</li>
<li>f</li>
</ul>
…для:
<ul>
<li>a,</li>
<li>b,</li>
<li>c;</li>
</ul>
<ul>
<li>d,</li>
<li>e,</li>
<li>f;</li>
</ul>
На данный момент мой код выглядит примерно так…
$('ul').each(function(i) {
var listsLength = $(this 'li').length;
$(this 'li').each(function(j) {
if (i == (listsLength - 1)) {
$(this).append(';');
} else {
$(this).append(',');
}
});
}
Я думаю, что проблема в этом коде…
$( this 'li' )
Есть идеи, как получить тот же эффект?
Редактировать:
Исправлено. На самом деле также была синтаксическая ошибка, и я также использовал i там, где должно быть помещено j. Теперь все работает, и вот результат.
Правка # 2:
Просто используйте код @lonesomeday … он намного удобочитаемее и легче!
Ответ №1:
Вы не можете сделать this 'li'
. this
в данном контексте это элемент DOM, а не строка. Чтобы получить желаемый эффект, вам понадобится $(this).find('li')
.
Ваш цикл также не нужен. Вы можете сделать что-то намного лучшее с :last-child
:
$('ul li:last-child').append(';');
$('ul li:not(:last-child)').append(',');
Эти две строки будут иметь желаемый эффект.
Комментарии:
1. @Rocket Это, конечно, может быть один…
$('li').filter(':last-child').append(';').end().filter(':not(:last-child)').append(',');
Но это не так читаемо!2. @lonesomeday: Еще лучше:
$('li', 'ul').append(function(){return $(this).is(':last-child') ? ';' : ','});
3. @lonesome: Но это избавляет от этого непослушного избыточного выбора DOM. ;o) Может быть:
$('ul li').slice(0,-1).append(',').end().slice(-1).append(';');
4. @Rocket: Да, вы абсолютно правы. Только что просмотрел HTML. Вероятно, следовало сделать это первым!
5. @daGrevis:-P. это все, что я должен сказать, хе-хе
Ответ №2:
Вместо $( this 'li' )
делать $( 'li', this )
Ответ №3:
this 'li'
попытается преобразовать this
в строку, а затем объединить 'li'
с ней.
Попробуйте это вместо:
$('li', this)
Ответ №4:
Вы могли бы использовать
$(this).find ('>li').each(...)
вместо этого (если проблема действительно здесь).