Что является лучшим методом при удалении элементов с обработчиками - PullRequest
1 голос
/ 17 февраля 2012

Я столкнулся с проблемой при использовании метода jdeuate.de в IE8 при удалении элементов, к которым был прикреплен мой обработчик делегата. Вот сценарий: у меня была таблица со строками, в каждой из которых была кнопка удаления. Строки были созданы динамически, поэтому кнопка удаления была подключена с помощью делегата для обработки событий щелчка. Когда пришло время удалить последнюю строку, вся таблица была удалена (таблица была создана только тогда, когда было значение для создания хотя бы одной строки.) Это работало нормально почти везде, за исключением одного исключения IE8. Даже тогда это работало на некоторых страницах, но только не на одной (точно такой же код использовался на каждой странице.) Для этой отдельной страницы удаление этой последней строки вызовет ошибку js в IE8 с указанием «Требуется объект» - нарушитель строка в коде jQuery для делегата.

Итак, вопрос в том, что является лучшим методом для обработчиков, когда некоторые элементы DOM, используемые этими обработчиками, удаляются? Следует ли вызывать undelegate в какой-то момент, и если да, то где?

Ответы [ 2 ]

3 голосов
/ 17 февраля 2012

Используйте метод jQuery .remove() :

"Используйте .remove(), когда хотите удалить сам элемент, а также все, что внутри него. В дополнение кСами элементы, все связанные события и данные jQuery, связанные с элементами, удаляются. "

Или .empty() метод , чтобы удалить все дочерние элементы, но сохранить элемент верхнего уровня.

0 голосов
/ 17 февраля 2012

Kinakuta, из того, что вы говорите, может быть просто вопрос правильной настройки делегирования и формулировки удаления соответствующим образом, а не использования или не remove() как таковых .Трудно понять, почему только IE8 должен вести себя неправильно, но, возможно, некоторые проблемы с IE8 в jQuery.

С jQuery 1.7+ .on() заменяет .bind(), .live() и .delegate() и может предложить путь вперед.Я хотел бы сделать что-то вроде этого:

$("#myContainer").on("click", "button.delete", function(event){
    $(this).closest("tr", "#myContainer").remove();
});

Без сомнения, вы можете добиться аналогичного с .delegate(), если вы используете jQuery <1.7. </p>

Насколько я могу сказать,в момент удаления строки не должно иметь значения, что таблица и / или ее строки были сгенерированы с помощью MVC или любого другого метода генерации.

...