Pergunta

Eu carrego uma página com carregamento () e depois crio dinamicamente um

marcação. Em seguida, eu uso o Live () para vincular um evento de clique e disparar uma função. No final, uma chamada descarrega ().

O problema é que, quando carrego a mesma página novamente (sem atualização) quando o clique na função será disparado duas vezes. Se eu sair novamente (novamente com UNLOAD ()) e carregar a página novamente, clique, disparará 3 vezes e assim por diante .... Uma amostra do meu código é:

$('#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);
}

Eu tenho outro $.post Dentro desta página e também no FNC ao vivo acima e tudo funciona bem. O acima também funciona, mas como eu disse na segunda carga, disparará duas vezes e as três vezes e assim por diante ... a parte estranha para mim é que se substituir o console no console.log ('dois'); Salve a página e carregue a página sem atualizar, ela disparará em uma linha diferente - uma - duas -

Se eu descarregar a página, substitua o console pelo console.log ('três'); E a carga novamente disparará um dois e três. Eu tento usar:

$.ajax({ url: 'updateDB.php', data: data, type: 'POST', cache:false });

$.ajaxSetup ({ cache: false });

header("Cache-Control: no-cache");

Nada disso está funcionando. E eu tenho esse problema apenas neste FNC. O que você acha, pode ser o motivo, lembra -se que se lembra da ação anterior e dispara novamente?

Foi útil?

Solução 2

De fato, a resposta pertence ao @vitore.

Vou apenas tentar explicar um pouco melhor o que estava acontecendo:

a live () FN estava dentro da página que eu estava carregando. E no primeiro load () O FN ao vivo atribui o manipulador para clicar. Mas quando você usa descarrega e remova todos os elementos dessa página, a conexão entre o clique e os manipuladores permanece.

E quando eu estava carregando novamente a mesma página (sem atualização), o live A função manterá o manipulador antigo e também anexará o manipulador novamente, e assim por diante load () é usado.

o truque é usar die () antes da unload (). Mas mais uma coisa a levar em conta: não podemos usar o encadeamento com live() ($('div').children().live() não funcionará) e também: embora:

$('.div .ctr').live() vai funcionar.

Apenas ligando $('.ctr').die() não funciona.

Então você tem que usar para ambos o mesmo seletor $('.ctr').live() e depois $('.ctr').die()

Talvez isso ajude alguém. E também verifique o novo 1.4.2 delegate () e undelegate ()

Outras dicas

Eu acho que você pode ter um erro de digitação por ter ($ this) vs $ (isto);
Observe também que existe um operador de exclusão no JavaScript, para que você queira experimentar outro nome de função.
Você também pode estar sofrendo de um cache em algum lugar (servidores da Web por padrão, defina um cache para arquivos .js)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top