2009-01-14 9 views
9

¿Cómo se puede copiar un controlador de eventos de un elemento a otro? Por ejemplo:¿Duplicar los controladores de eventos de un elemento a otro?

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

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

Tenga en cuenta que el segundo elemento se está procesando en un momento distinto a cuando el primer elemento está recibiendo su manejador, lo que significa que esto:

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

... no lo hará trabajo.

+0

Lamentablemente ninguna de las respuestas muestran que sin el uso de jQuery. –

+0

@ShaneReustle es una pregunta sobre los eventos de jQuery ... – nickf

+0

Que en el fondo funcionan igual que los eventos normales. Esperaba ver cómo hacerlo sin usar jQuery en eventos estándar de JS. –

Respuesta

4

No es fácil (y probablemente no debería) "copiar" el evento. Lo que puede hacer es utilizar la misma función para manejar cada uno:

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

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

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

alternativa en realidad se podría desencadenar el evento para el primer elemento en el segundo controlador:

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

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

Editar: @nickf está preocupado contaminar el espacio de nombres global, pero esto casi siempre puede evitarse envolviendo código en un objeto:

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

o envolver el código en una función anónima y llamar inmediatamente:

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

ah sí, eso funcionaría, pero esperaba un método que no contaminaría el espacio de nombres global. – nickf

+0

@nickf: edité mi publicación en respuesta a su inquietud. – Prestaul

0

¿Esto es lo que estás buscando? ..

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

Quizás se encuentre interesado en el triggerHandler method

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

Esta pregunta ya fue contestada pero para referencia futura: Se podría copiarlos iterando los eventos del elemento original y vinculando a sus manejadores con el objetivo.

> ver abajo!

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

Esto es útil cuando no se tiene control del elemento original (por ejemplo, cuando se utiliza un plug-in) y sólo quieren clonar el comportamiento de un determinado elemento.

Editar: El acceso a un controlador de eventos de elementos se ha modificado en versiones posteriores de jQuery. Esto debería funcionar si hay nuevas versiones:

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

Saludos

+0

Usando el método 'JHueler()' JQuery es una mejor solución. @KenBrowing tiene una respuesta al respecto a continuación: http://stackoverflow.com/a/442305/1988326 –

+1

@Chris: Gracias por la edición. Después de buscar días para una solución para guardar eventos y manejarlos más tarde, este es el único lugar donde encontré el acceso a los controladores de eventos de jquery. Muchas gracias :) – zreptil

Cuestiones relacionadas