2009-04-20 9 views
19

Quando I replaceWith un elemento per portare uno dei DOM, quindi replaceWith, gli eventi registrati non vengono attivati. Ho bisogno di eventi per rimanere intatto.Eventi che non si registrano dopo la sostituzioneCon

Ecco la mia Javascript:

var replacement = $(document.createElement('span')); 
var original = $(this).replaceWith(replacement); 

replacement 
    .css('background-color', 'green') 
    .text('replacement for ' + $(this).text()) 
    .click(function() { 
     replacement.replaceWith(original); 
    }); 

Live demo

Nella demo, quando si fa clic su un elemento, esso viene sostituito con un altro elemento utilizzando replaceWith. Quando fai clic sul nuovo elemento, questo viene sostituito con l'elemento originale usando replaceWith. Tuttavia, il gestore dei clic non funziona più (dove penserei che dovrebbe).

+1

Hai finito per utilizzare il riattacco dell'evento o sei mai riuscito a far funzionare gli eventi dal vivo? Sto facendo la stessa identica cosa, e mi piacerebbe imparare dalla tua esperienza. –

+0

@Erick T, mi dispiace, ma onestamente non ricordo. Ho fatto questa domanda quasi due anni fa. Penso che l'uso di '$ .fn.live' non ha funzionato perché avevo a che fare con elementi reali, non con un selettore. ('$ .fn.delegate' (che non esisteva allora) potrebbe funzionare come un'alternativa' live'.) A causa della risposta che ho selezionato, presumo di aver finito per riattaccare il gestore di eventi. Puoi provare a clonare in profondità anche l'elemento (quale IIRC può mantenere i gestori di eventi nell'ultima jQuery). – strager

risposta

11

Perché quando si sostituisce l'elemento originale, gli eventi ad esso associati vengono rimossi. Avrai bisogno di ricollegare il gestore click evento original dopo la chiamata a replacement.replaceWith(original):

$(function() 
{ 
    function replace() 
    { 
     var replacement = $(document.createElement('span')); 
     var original = $(this).replaceWith(replacement); 

     replacement 
     .css('background-color', 'green') 
     .text('replacement for ' + $(this).text()) 
     .click(function() 
     { 
      replacement.replaceWith(original); 
      original.click(replace); 
     }); 
    } 

    $('.x').click(replace); 
}); 
+2

Vorrei che ci fosse un modo automatico/elegante per farlo. Immagino che questa soluzione dovrà fare. – strager

+1

@strager: puoi provare il suggerimento di eventi live di Matt o implementare una versione mirata per i tuoi scopi. Ci sono gravi (e spiacevoli) effetti collaterali in * alcuni browser * se non riesci a staccare gli eventi dagli elementi separati, quindi vuoi davvero che funzioni in questo modo. – Shog9

+0

Questo non ha senso. Gli elementi possono avere eventi senza essere collegati al DOM, quindi perché rimuoverli dal DOM rimuovere gli eventi? Devono essere alcune decisioni specifiche per le prestazioni, beh ... – Alex

3

live events sono quello che stai cercando per

+0

Maggio essere ciò di cui ho bisogno Lo esaminerò. – strager

+0

Non sembra funzionare. Dispari. = S – strager

+1

Non funziona più da jQuery 1.9 – YaDa

4

UPDATE: live() e bind() sono stati deprecati, in favore di on().

È possibile utilizzare live() e bind() eventi, questo è il vostro codice di nuovo:

$(function() { 
$('.x').live('click', function() { 
    var replacement = $(document.createElement('span')); 
    var original = $(this).replaceWith(replacement); 

    replacement 
     .css('background-color', 'green') 
     .text('replacement for ' + $(this).text()) 
     .bind('click', function() { 
      replacement.replaceWith(original); 
     }); 
}); 
}); 

evento -Live lavora con jQuery 1.3 e superiore.

-se si desidera interrompere la propagazione dal vivo utilizzare la funzione die().

Problemi correlati