странная проблема с load () или live ()! - PullRequest
0 голосов
/ 30 марта 2010

Я загружаю страницу с помощью load (), а затем динамически создаю тег

. Затем я использую live () для привязки события щелчка и запускает функцию. По окончании вызова unload ().

Проблема в том, что при повторной загрузке той же страницы (без обновления) при нажатии функция запускается дважды. Если я выйду снова (снова с помощью 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 внутри на этой странице, а также на вышеупомянутом live 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 ]

0 голосов
/ 30 марта 2010

на самом деле ответ принадлежит @vittore.

Я просто попытаюсь немного лучше объяснить, что происходит:

live () fn был внутри страницы, которую я загружал. И на первом load () live fn назначает обработчик для нажатия. НО, когда вы используете unload, а затем удаляете все элементы с этой страницы, связь между щелчком и обработчиками сохраняется.

И когда я снова загружал ту же страницу (без обновления), функция live сохранит старый обработчик и также снова подключит обработчик, и так каждый раз, когда load () используется.

Хитрость в том, чтобы использовать die () до unload (). НО еще одна вещь, которую нужно принять во внимание: мы не можем использовать цепочку с live() ($('div').children().live() не будет работать) И ТАКЖЕ, хотя:

$('.div .ctr').live() будет работать.

просто позвонить $('.ctr').die() не получится.

Таким образом, вы должны использовать для обоих fn один и тот же селектор $('.ctr').live(), а затем $('.ctr').die()

Может быть, это кому-нибудь поможет. И также проверьте новые 1.4.2 delegate () и undelegate ()

0 голосов
/ 30 марта 2010

Я думаю, что у вас может быть опечатка, если ($ this) против $ (this);
Также обратите внимание, что в JavaScript есть оператор удаления, поэтому вы можете попробовать использовать другое имя функции.
Вы также можете где-то страдать от кеша (веб-серверы по умолчанию устанавливают кеш для файлов .js)

...