Domanda

I caricare una pagina con carico () e poi creo dinamicamente un tag

. Poi io uso dal vivo () per associare un evento click e spara una funzione. Al termine di una chiamata scarico ().

Il problema è che quando si carica la stessa pagina di nuovo (senza refresh) quando sul clic sulla funzione sarà licenziato due volte. Se esco di nuovo (di nuovo con scarico ()) e caricare la pagina ancora una volta al clic sparerà 3 volte e così via .... Un campione del mio codice è:

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

Non ho altra $.post interna su questa pagina ed anche di quanto sopra fnc dal vivo e tutto il lavoro bene. Quanto sopra si lavora anche, ma come ho detto sul secondo carico sparerà due volte e 3 volte e così via ... La parte strana per me è che se replece la console con console.log ( 'due'); salvare la pagina e caricare la pagina senza aggiornare sarà il fuoco su un diverso file - uno due -

se scaricare la pagina di sostituire la console con console.log ( 'tre'); e il carico di nuovo sparerà uno due e tre. Io cerco di usare:

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

$.ajaxSetup ({ cache: false });

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

nessuno di lavoro di questo. E ho questo problema solo su questo fnc. Cosa ne pensi, potrebbe essere la ragione, ricorda ricorda l'azione precedente e spara di nuovo?

È stato utile?

Soluzione 2

in effetti la risposta appartiene a @vittore.

mi limiterò a cercare di spiegare un po 'meglio quello che stava accadendo:

fn live () era dentro la pagina che mi stava caricando. E al primo load () FN vivo assegna il gestore di fare clic. MA quando si utilizza scarico e quindi rimuovere tutti gli elementi da quella pagina il collegamento tra clic e gestori rimane.

E quando stavo caricando di nuovo la stessa pagina (senza refresh), la funzione di live manterrà il vecchio gestore e anche collegare di nuovo il gestore, e così via ogni volta load () viene utilizzato.

il trucco è utilizzare die () prima unload (). Ma una cosa da prendere in considerazione: non possiamo usare il concatenamento con live() ($('div').children().live() non funziona) e anche se:

$('.div .ctr').live() funzionerà.

semplicemente chiamando $('.ctr').die() non funzionerà.

Quindi, è necessario utilizzare sia per fn lo stesso $('.ctr').live() di selezione e quindi $('.ctr').die()

Forse questo aiuterà qualcuno. E anche verificare il nuovo 1.4.2 delegate () e undelegate ()

Altri suggerimenti

Penso che si potrebbe avere un errore di battitura avendo ($ this) vs $ (this);
Si noti inoltre che v'è un operatore delete in javascript così si potrebbe desiderare di provare un altro nome della funzione.
Si potrebbe anche essere affetti da una cache da qualche parte (i server web di default impostato una cache per i file .js)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top