JQuery. Удалить производительность - PullRequest
7 голосов
/ 07 февраля 2012

Я пытаюсь удалить li с условием под Ul в нескольких div.

<div>
    <ul>
        <li class="sel">.....</li>
        <li class="sel">.....</li>
         ............
        <li>.....</li>
        <li>.....</li>
         ...........
         <!-- I have some 600 li's -->
    </ul>
</div>

У меня есть 200 литов с class='sel'. Теперь мне нужно удалить оставшиеся 400 литов.

Я пытаюсь удалить двумя способами, например,

$("ul", this).each(function(){
    $("li", this).each(function(){
        $(this).remove();
        //Also tried with -- $(this).empty().remove();
    });
});

иначе как,

$("ul", this).each(function(){
    $("li[class!=sel]", this).remove(); // Also tried with 'not'
});

Теперь проблема в том, что когда я пытаюсь выполнить эти способы, в IE возникает ошибка перегрузки скрипта.

Пожалуйста, помогите мне с другими способами удаления ненужных li.

Примечание: я не хочу оставлять в статусе ненужных ликов скрывать ().

Заранее спасибо ...

Ответы [ 3 ]

4 голосов
/ 07 февраля 2012

Если вы используете селектор атрибута Not Equal , вам не нужно заключать его в .each() - просто назовите его так:

$('li[class!="sel"]').remove();

Селектор ('li[class!="sel"]') захватывает все <li> элементы, которые не имеют класса sel, а затем вызывает метод remove() для всего этого набора элементов.

Демо

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

Если вы хотите нацелиться только на <ul>, который содержит элементы <li class="sel"></li>, вы можете установить контекст следующим образом:

// Find the first <li> with class="sel" and get it's parent <ul>
var $ul = $('li.sel:first').parent('ul');

// Use $ul as the context for the removal of the <li> elements
$('li[class!="sel"]', $ul).remove();
3 голосов
/ 07 февраля 2012

Что бы это ни стоило, я столкнулся с подобной проблемой всего пару недель назад, только в IE8, даже вызывая .remove () для одного элемента, выбранного по идентификатору. Проблема возникала только тогда, когда элемент содержал большое количество контента.

Что я сделал, так это позвонил .html(''), чтобы очистить элемент перед вызовом .remove(). Это значительно сократило время (до секунды).

У меня явно была другая ситуация (один элемент против многих, выбранных по идентификатору или по контекстным селекторам, не уверен, какой у вас контент li и т. Д.), , но это может стоить того, чтобы выстрелить .

$("ul", this).each(function(){
    $("li[class!=sel]", this).html('').remove();
});
1 голос
/ 07 февраля 2012

Попробуйте отсоединить ul, удалите li, затем снова установите ul.

$("ul", this).detach().find("li").not(".sel").remove().end().end().appendTo(this);

Это предотвращает перерисовку браузера до тех пор, пока все li, которые необходимо удалить, не будут удалены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...