странная проблема с load() или live()!
Вопрос
Я загружаю страницу с помощью load(), а затем динамически создаю
ярлык.Затем я использую live() для привязки события щелчка и запускаю функцию.В конце вызов unload().
Проблема в том, что когда я снова загружаю ту же страницу (без обновления), при нажатии функция будет запущена дважды.Если я снова выйду (снова с выгрузкой()) и снова загружу страницу, то клик сработает 3 раза и так далее....Пример моего кода:
$('#tab').click(function() {
$('#formWrap').load('newPage.php');
});
$('div').after('<p class="ctr" ></p>');
$('p.ctr').live('click', function(e) {
if($(e.target).is('[k=lf]')) { console.log ('one'); delete ($this); }
else if ....
});
function delete () {
$.post( 'update.php', data);
}
у меня есть другие $.post
внутри на этой странице, а также на приведенном выше живом fnc, и все работает хорошо.Вышеупомянутый вариант также работает, но, как я уже сказал, второй заряд сработает дважды, затем 3 раза и так далее...Самое странное для меня то, что если заменить консоль на console.log('two');сохраните страницу и загрузите страницу без обновления, она будет срабатывать в разных строках - одна, две -
если я выгружу страницу, замените консоль на console.log('three');и загрузка снова выстрелит раз два и три.Я пытаюсь использовать:
$.ajax({ url: 'updateDB.php', data: data, type: 'POST', cache:false });
$.ajaxSetup ({ cache: false });
header("Cache-Control: no-cache");
ничего из этого не работает.А у меня такая проблема только на этом фнк.Как думаете, в этом может быть причина, он помнит предыдущее действие и срабатывает снова?
Решение 2
на самом деле ответ принадлежит @vittore.
Я просто попытаюсь объяснить немного лучше, что происходит:
тот live ()
fn находился внутри страницы, которую я загружал.И на первом load ()
live fn назначает обработчик щелчка.НО когда вы используете выгрузку, а затем удаляете все элементы с этой страницы, связь между кликом и обработчиками остается.
И когда я снова загружал ту же страницу (без обновления), live
функция сохранит старый обработчик, а также снова прикрепит обработчик, и так каждый раз. load ()
Это использовано.
трюк, который нужно использовать die ()
до unload ()
.НО следует учитывать еще один момент:мы не можем использовать цепочку с live()
($('div').children().live()
не получится ) А ТАКЖЕ хотя:
$('.div .ctr').live()
будет работать.
просто звоню $('.ctr').die()
не будет работать.
Поэтому вам придется использовать для обоих один и тот же селектор. $('.ctr').live()
а потом $('.ctr').die()
возможно, это поможет кому-то.А также проверьте новую 1.4.2 delegate ()
и undelegate ()
Другие советы
Я думаю, что у вас может быть опечатка, если использовать ($this) против $(this);
Также обратите внимание, что в JavaScript есть оператор удаления, поэтому вы можете попробовать другое имя функции.
У вас также может быть где-то кеш (веб-серверы по умолчанию устанавливают кеш для файлов .js)