2012-01-10 4 views
0

У меня возникли проблемы с удалением некоторых элементов HTML.Устранение неполадок элементов DOM

Несколько слов о моем коде.

Я клонирую <ul>, а затем показываю его содержимое с помощью всплывающего диалогового окна. Затем в массиве 2dim, где я сохраняю <li> соответствующие объекты между оригиналом и клонированным. Итак, удаление из клонированного и подтверждение дает результаты в оригинале <ul>.

Проблема, с которой я столкнулся, заключается в добавлении анимации jQuery и удалении в ее функции обратного вызова, вероятно, из-за цикла «для». Затем, когда вы удаляете дополнительно второй раз, не закрывая диалоговое окно, ошибки выходят, удаляя элементы неправильно!

Если вы не являетесь свидетелем этого с первого раза, попробуйте сыграть немного больше, это будет недолго , пока вы его не увидите!

Вот разница работает без .hide анимации: http://jsfiddle.net/TTGr7/1/

багги с анимацией: http://jsfiddle.net/TTGr7/2/

ключевой частью, а разница в той части коды:

del.click(function() { 
     var len = markedForDel.b.length; 
     if (len > 0) { 
      var confirmation = confirm('Delete marked groups'); 
      if (confirmation) { 
       for (var i = 0; i < len; i++) { 
        markedForDel.a[i].remove(); 
        markedForDel.b[i].remove(); 
        //markedForDel.a.splice(i,1); 
        //markedForDel.b.splice(i,1); 
       } 
      } 
     } 
    }); 

и

del.click(function() { 
    var len = markedForDel.b.length; 
    if (len > 0) { 
     var confirmation = confirm('Delete marked groups'); 
     if (confirmation) { 
      for (var i = 0; i < len; i++) { 
       markedForDel.a[i].hide(function(){ 
        markedForDel.a[i].remove(); 
       }); 
       markedForDel.b[i].remove(); 
       //markedForDel.a.splice(i,1); 
       //markedForDel.b.splice(i,1); 
      } 
     } 
    } 
}); 

Так что мне действительно нужно сохранить анимацию .hide и по-прежнему удалять группы должным образом.

Так что я действительно рассчитываю на вашу любезную помощь, BR

+1

Я не изучил код, но, возможно, вместо 'for (var i = 0; i = 0; i- -) ', так как вы удаляете элементы по ходу. – Blazemonger

+1

вы могли бы полностью удалить цикл for в зависимости от того, как вы строите свои массивы. –

+1

@ Ответ dgvid верен ниже. Я также хотел бы отметить, что, поскольку вы очищаете весь список, вам не нужно делать сплайсинг для удаления ячеек. В конце функции задайте 'отмеченный_DDD.b = []; markForDel.a = []; '. –

ответ

3

Если цикл увеличившая стоимость i самая когда вызывается обратный вызов hide, то вы удаляете неправильный элемент. Попробуйте это вместо:

markedForDel.a[i].hide(function() { 
    $(this).remove(); 
}); 

В обратном вызове метода Хидэ, this устанавливается на элемент, который был просто скрытой.

0

Вы пробовали

del.click(function() { 
    var len = markedForDel.b.length; 
    if (len > 0) { 
     var confirmation = confirm('Delete marked groups'); 
     if (confirmation) { 
      for (var i = len -1; i >= 0; i--) { 
       markedForDel.a[i].hide(function(){ 
        markedForDel.a[i].remove(); 
       }); 
       markedForDel.b[i].remove(); 
       //markedForDel.a.splice(i,1); 
       //markedForDel.b.splice(i,1); 
      } 
     } 
    } 
}); 

fiddlke здесь http://jsfiddle.net/TTGr7/3/

+1

Все еще есть проблема, я думаю. Нажмите «del group», затем «group 2», затем «remove selected», затем не закрывая диалоговое окно, нажмите «группа 3» и «удалить выбранный». В диалоговом окне группа 3 удаляется, но на главной странице это не так. – Blazemonger

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