2009-01-14 5 views
9

Come si copia un gestore eventi da un elemento a un altro? Per esempio:Duplica i gestori di eventi di un elemento su un altro?

$('#firstEl') 
    .click(function() { 
     alert("Handled!"); 
    }) 
; 

// here's where the magic happens 
$('#secondEl').click = $('#firstEl').click; // ???? 

Nota che il secondo elemento è in fase di elaborazione in un momento diverso da quando il primo elemento è sempre suo gestore, il che significa che questo:

$('#firstEl, #secondEl').click(function() { ... }); 

... non lo farà lavoro.

+0

Purtroppo nessuna delle risposte vederlo senza l'utilizzo di jQuery. –

+0

@ShaneReustle è una domanda sugli eventi di jQuery ... – nickf

+0

Che sullo sfondo funzionano come normali eventi. Speravo di vedere come farlo senza usare jQuery su eventi JS standard. –

risposta

4

Non è possibile (e probabilmente non dovrebbe) "copiare" l'evento. Che cosa si può fare è utilizzare la stessa funzione per gestire ogni:

var clickHandler = function() { alert('click'); }; 
// or just function clickHandler() { alert('click'); }; 

$('#firstEl').click(clickHandler); 

// and later 
$('#secondEl').click(clickHandler); 

In alternativa si potrebbe effettivamente generare l'evento per il primo elemento del secondo gestore:

$('#firstEl').click(function() { 
    alert('click'); 
}); 

$('secondEl').click(function() { 
    $('#firstEl').click(); 
}); 

Edit: @nickf è preoccupato inquinare il namespace globale, ma questo può quasi sempre essere evitato avvolgendo il codice in un oggetto:

function SomeObject() { 
    this.clickHandler = function() { alert('click'); }; 
} 
SomeObject.prototype.initFirstEvent = function() { 
    $('#firstEl').click(this.clickHandler); 
}; 
SomeObject.prototype.initSecondEvent = function() { 
    $('#secondEl').click(this.clickHandler); 
}; 

o avvolgendo il codice in una funzione anonima e chiamando immediatamente:

(function() { 
    var clickHandler = function() { alert('click'); }; 
    $('#firstEl').click(clickHandler); 
    $('#secondEl').click(clickHandler); 
})(); 
+0

ah sì, funzionerebbe, ma speravo in un metodo che non inquinasse lo spazio dei nomi globale. – nickf

+0

@nickf: ho modificato il mio post in risposta alla tua preoccupazione. – Prestaul

0

È questo quello che stai cercando? ..

var clickHandler = function() { alert("Handled!"); } 
$('#firstEl').click(clickHandler); 
$('#secondEl').click(clickHandler); 
1

si potrebbe essere interessato al triggerHandler method

// here's where the magic happens 
//$('#secondEl').click = $('#firstEl').click; // ???? 
$('#secondEl').click(function() { 
    $('#firstEl').triggerHandler('click'); 
}); 
21

La domanda è stata già risposto, ma per riferimento futuro: si poteva copiarli iterando gli eventi dell'elemento originale e legando i loro gestori al bersaglio.

> vedi modifica qui sotto!

// iterate event types of original 
$.each($('#original').data('events'), function() { 
    // iterate registered handler of original 
    $.each(this, function() { 
    $('#target').bind(this.type, this.handler); 
    }); 
}); 

Questo è utile quando non si ha il controllo dell'elemento originale (per esempio quando si utilizza un plug-in) e vogliono solo per clonare il comportamento di un determinato elemento.

Modifica: L'accesso a un gestore di eventi di elementi è stato modificato nelle versioni successive di jQuery. Questo dovrebbe funzionare per le versioni più recenti:

$.each($._data($('#original').get(0), 'events'), function() { 
    // iterate registered handler of original 
    $.each(this, function() { 
    $('#target').bind(this.type, this.handler); 
    }); 
}); 

Acclamazioni

+0

L'uso del metodo jQuery 'triggerHandler() 'è una soluzione migliore. @KenBrowing ha una risposta al riguardo: http://stackoverflow.com/a/442305/1988326 –

+1

@Chris: Grazie per la modifica. Dopo aver cercato per giorni una soluzione per salvare gli eventi e gestirli in un secondo momento, questo è l'unico posto in cui ho trovato l'accesso ai gestori di eventi di jquery. Grazie mille :) – zreptil

Problemi correlati