#jquery #each
#jquery #каждый
Вопрос:
Я обнаружил, что $.each работает очень медленно и создает проблемы для веб-страниц, если содержит много различных эффектов jQuery.
Я хотел бы знать, есть ли хорошая альтернатива $.each, например:
$('ul li').each(function() {
var singleLi = $(this);
});
как я могу сделать то же самое без наведения курсора мыши, не используя each?
Спасибо.
Комментарии:
1. В вашем коде есть некоторые синтаксические ошибки.
2. Я ставлю под сомнение утверждение о том, что «$.each ()» сам по себе является причиной проблем с производительностью. По моему мнению и опыту, это совсем не так, за исключением некоторых экстремальных ситуаций с производительностью, которые по определению не предполагают «множества различных эффектов jQuery». Вы должны опубликовать пример того, что вы считаете проблемой, и тогда мы сможем помочь разобраться в реальной проблеме.
3. $.each работает медленно. Если вы используете его для больших объемов данных, работает очень медленно.
4. Нет, @Toro, это действительно не так медленно. Да, это медленнее, чем цикл «for», но особенно в современных средах выполнения JavaScript накладные расходы не так уж велики. В вашем примере, например, сколько
<li>
элементов у вас есть? Если их тысячи и тысяч, то проблема в том, что ваш DOM очень большой, а не в том, что «$.each()» работает медленно.
Ответ №1:
Если вам нужна реальная альтернатива «$.each()», просто используйте цикл «for»:
var liElements = $('ul li');
for (var i = 0; i < liElements.length; i) {
var li = liElements[i];
// ... lots of various jQuery effects ...
}
Предложения, которые вы можете пропустить «.each ()» и просто использовать напрямую «.hover()», верны, но они упускают суть: эти подпрограммы jQuery в любом случае будут выполнять «.each()» внутренне.
Однако я сомневаюсь, что переключение с «$.each()» на цикл «for» само по себе будет иметь большое значение.
Комментарии:
1. Это должно быть принятым ответом. Вы можете получить тесты, сравнивающие производительность $.each с другими методами цикла здесь: jsperf.com/jquery-each-vs-for-loop/4
2. Я попробовал это вместо $.get, главным образом потому, что это выдавало мне ошибку с $.get. Итак, это сработало идеально. Я настоятельно рекомендую использовать cycle вместо $.get().
Ответ №2:
Точно так же, без each
$('#list li').hover(function() {
$('#myDiv').stop().fadeIn(400);
}, function() {
$('#myDiv').stop().fadeOut(400);
})
});
Комментарии:
1.
stop()
гарантирует, что оба эффекта не перекрываются.2. Хотя, возможно, вы захотите использовать
.stop(true, true)
, в противном случае они просто остановятся и никогда не закончат анимацию, и вы застряли с наполовину выцветшим div.3. требуется остановка (верно, true)… или это не сработает. Но мой вопрос в другом.
4. Обратите внимание, что код для метода «.hover()» в любом случае будет выполнять «.each()» внутренне …
5. Проголосовал «Против» из-за введения в метод .stop(), поскольку мне всегда было интересно, есть ли способ предотвратить множественные запуски эффектов jQuery, которые выполняются до полного завершения итерации. Я подозреваю,
.stop()
что это остановит их от этого.
Ответ №3:
ДА… просто добавьте указатель мыши ко всем li
$('#list li').hover(function() {
$('#myDiv').fadeIn(400);
}, function() {
$('#myDiv').fadeOut(400);
});
$('#myDiv').fadeOut(400);
Ответ №4:
Поскольку идентификатор должен быть уникальным, весь этот скрипт не должен изменяться, если .each()
будет удален.
$.hover()
это мало что значит.
$('#list li').hover(function() {
$('#myDiv').fadeIn(400);
}, function() {
$('#myDiv').fadeOut(400);
});
$('#myDiv').fadeOut(400);