2012-03-16 12 views
6
var $obj1 = $('a#one'); 
var $obj2 = $('a#two'); 
var $obj3 = $('a#three'); 

// Assume $('a#one, a#two, a#three') wasn't an option. 

Cómo puedo asignar un (mismo) controlador de eventos, p. click() a esos tres objetos jQuery? En esencia, estoy en busca de una manera más eficiente de hacerlo:Combinar/Cadena Objeto jQuery múltiple

$obj1.click(function() { /* Code A */ }); 
$obj2.click(function() { /* Code A */ }); 
$obj3.click(function() { /* Code A */ }); 
+1

'delegate' es tu amigo. – c69

+1

¿Por qué no agregar una clase a todos los objetos y usar eso como selector? '$ ('a.codeA'). Clic (función() {/ * Código A * /});' –

Respuesta

7

Sólo (muy) marginalmente más corto, pero:

$([$obj1, $obj2, $obj3]).click(function() { }); 

Usted quiere definir el controlador de fuera de la primera función anónima, por lo que probablemente sería mejor con el método de Jonas H. Solo lanzando otra sugerencia por ahí.

Nota: se podía hacer técnicamente un híbrido, pero es bastante largo:

var f = function() { }; 
$([$obj1, $obj2, $obj3]).click(f); 

Realmente esta pregunta sólo es útil si se quiere evitar la a.click $ (f) una y otra vez, lo cual es realmente una mejor opción que este abuso de jQuery. :)

+2

No necesita el bucle '.each', porque el manejador de clics está unido a todos los elementos en la colección actual. Mira el primer ejemplo aquí http://api.jquery.com/click/ –

+0

¡Oh, tienes razón! Siempre olvido que los selectores jQuery devuelven matrices normales. Editaré – Corbin

+2

Solo una nota de abandono, la sintaxis de matriz anterior no funciona si está encadenando una función (al menos, en jQuery 1.7.2) como la función 'datos' de jQuery. Entonces esto no funcionará: '$ ([$ obj1, $ obj2]). Data (" propiedad ", verdadero);' pero esto: '$ ($ obj1, $ obj2) .data (" propiedad ", verdadero); '.Espero que ayude a alguien. –

1
var myFunction = function() { /* Code A */ }; 

$obj1.click(myFunction); 
$obj2.click(myFunction); 
$obj3.click(myFunction); 
0

obtener un contenedor primario común y utilizar jQuery .on() en él.

<div id="parent"> 
    <a href="#" id="one">1</a> 
    <a href="#" id="two">2</a> 
    <a href="#" id="three">3</a> 
</div> 

//any <a> clicked under parent executes this function 
$('#parent').on('click','a#one, a#two, a#three',function(){ 
    //do stuff 
}); 

la mejor parte de ella es: es sólo uno manejador y está en la matriz. no está colocando múltiples controladores en múltiples elementos. Además, cuando modificas el controlador, tiene efecto para todos. no es necesario cambiar individualmente los controladores para cada elemento que lo tiene. demo here


http://api.jquery.com/on/

Además de su capacidad para manejar eventos en los elementos descendientes aún no creadas, otra de las ventajas de los acontecimientos delegada es su potencial para los gastos indirectos mucho más bajos cuando se deben controlar muchos elementos. En una tabla de datos con 1.000 filas en su tbody, este ejemplo se conecta un controlador a 1.000 elementos:

un enfoque de eventos delegados se une un controlador de eventos con sólo el un elemento, la tbody, y el evento sólo necesita burbuja un nivel hacia arriba (desde el tr hecho clic a tbody)

+0

¿Y si tiene enlaces en el contenedor en el que no quiere operar? – Corbin

+0

puede agregarlos en el segundo parámetro, pero sigue siendo un solo controlador. – Joseph

+0

Y luego básicamente está haciendo lo que dijo que no quiere :) – Corbin

2

Hmm, siempre hay .add(), pero personalmente prefiero escribir los .click() funciones uno a uno, si empezaba a cabo con variables separadas de todos modos. No es necesario adquirir gastos adicionales creando nuevos objetos jQuery para funcionalidades tan triviales.

$obj1.add($obj2).add($obj3).on('click' , function() { }); 
// not sure if $obj1.add($obj2, $obj3) will work as well 
+0

'$ obj1.add ($ obj2, $ obj3)' no funciona, es decir, el controlador no se adjuntará a '$ obj3'. Muestra: http://jsfiddle.net/sikusikucom/VsVcy/ – moey

Cuestiones relacionadas