2015-07-22 3 views
0

Я пытаюсь удалить элемент формирования DOM с использованием метода .remove() JQueryJquery .remove() не обновляет DOM

В основном я разборе список и удаления некоторых элементов. Затем сразу после этого я пересматриваю список для некоторого лечения остальных элементов.

Но простая распечатка размера списка дает мне впечатление, что элементы должны быть отфильтрованы не были удалены

$list = $(".elements_list"); 
alert($list.size()); 
$list.each(function(){ 
    if ($(this).data("quantity") == 0) 
    { 
    $(this).slideUp(1000,function(){ 
     $(this).remove(); 
    }); 
    } 
}); 
change_background_colors(); 

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

function change_background_colors() {  
    $list = $(".elements_list"); 
    alert($list.size()); 
    ... 
} 

я получаю один и тот же размер списка до и после удаления элементов ...

есть ли что-то не так в моем провере oach?

Спасибо!

+0

Что вы подразумеваете под контекстом? Извините, я новичок в jQuery/Javascript ... –

+0

он означает проверить значение 'this', когда вы идете удалить. –

+2

Если вы вызываете это до того, как анимация завершена, элемент все еще существует. Покажите нам, где вы положили вторую проверку размера – charlietfl

ответ

1

Элемент не удаляется до тех пор, пока не пройдет 1000 миллисекунд и завершение анимации. Подождите, пока вы не посчитаете элементы.

редактировать: вот более сложный способ отложить, пока все одушевляет полная:

$list = $(".elements_list"); 
var n = 0; 
$list.each(function(){ 
    if ($(this).data("quantity") == 0) { 
    n = n + 1; // one more callback to wait for 
    $(this).slideUp(1000,function(){ 
     $(this).remove(); 
     n = n-1; 
     checkIfAllDone(); 
    }); 
    } 
}); 
function checkIfAllDone(){ 
    if(n===0){ // be sure that n was declared in the same scope as this function 
    change_background_colors(); 
    } 
} 
+1

Я бы предпочел указать (объяснить) OP, чтобы подсчитать элементы внутри обратного вызова animate - после * remove * ... –

+0

если вы увидите изменения в коде, вы увидите, что я печатаю размер за пределами обратного вызова slideUp. –

+0

Как дождаться завершения всех слайд-залов? –

1

если вы звоните предупреждение размера в функции SetTimeout вы увидите

$list = $(".elements_list"); 
alert($list.size()); 
$list.each(function() { 
    if ($(this).data("quantity") == 0) { 
     $(this).slideUp(1000, function() { 
      $(this).remove(); 

     }); 
    } 
}); 

setTimeout(function() { 
    $list = $(".elements_list"); 
    alert($list.size()); 
}, 2000); 

JSFiddle:

https://jsfiddle.net/upkkLq2m/2/

+1

Я предлагаю использовать этот подход для задержки второго счета, потому что он проще, чем мое редактирование – Plato

Смежные вопросы