2011-08-19 7 views
26

¿Hay alguna forma de adjuntar datos a un objeto de evento jQuery a medida que propaga el DOM?modificar datos de evento durante la propagación

Para aclarar, si tiene tres divs anidados, cada uno con un clic en el detector de eventos, al hacer clic en el div más interno se obtienen los tres manejadores desde el más interno al más externo (propagación del evento 101). Lo que me gustaría hacer es agregar algunos datos al objeto del evento en cada controlador accesible desde la siguiente capa. ¿Cómo puedo hacer eso?

Gracias.

Respuesta

2

Quizás he entendido mal la pregunta, pero me encontré con esta página StackOverflow, mientras que la búsqueda de una manera de hacer la misma cosa.

He encontrado que puede devolver los valores/valores que desea pasar al final de cada controlador y luego acceder a ellos en los controladores posteriores utilizando la propiedad event.result?

demostración simple en http://api.jquery.com/event.result/

4

Aunque no se puede adjuntar datos directamente al evento, aún se podía adjuntar datos a la targetElement través data() de jQuery:

$('div').click(function(e) { 
    var info = $(e.target).data('info') || ''; 
    $(e.target).data('info', info + ' ' + $(this).attr('class')); 
}); 

Aquí está el violín: http://jsfiddle.net/eKVmU/

+0

Esta solución funciona la primera vez que se activa el evento, pero los datos persiste a través de múltiples eventos (en la jsFiddle, intente hacer clic varias veces y ver qué pasa). Realmente me encantaría una forma de asociar datos con un clic específico a medida que surge, a diferencia de un elemento específico ... – josh

+0

@josh - ¿Por qué no eliminas la información cuando toca el elemento más externo? [Ver aquí] (http://jsfiddle.net/eKVmU/7/). –

+0

Downvoted porque no responde la pregunta formulada por el OP: "adjuntar datos a un objeto de evento jQuery". La segunda respuesta más votada solo hace eso y debería estar en la parte superior, y la respuesta aceptada ... –

36

El objeto de evento que se pasa por jQuery es un contenedor alrededor del objeto de evento nativo. El borboteo ocurre en el nivel de javascript/navegador y, por lo tanto, el objeto de evento nativo parece estar compartido entre todos los controladores de eventos.

$('div').click(function(e) { 
    e.originalEvent.attribute = (e.originalEvent.attribute || "") + 
     " " + $(this).prop("className"); 
    alert(e.originalEvent.attribute); 
}); 

Probado en Chrome, Firefox, Safari, IE9 e IE10. Si prueba en otros navegadores, coméntenos los resultados.

Aquí está el violín: http://jsfiddle.net/5AQqD/

+2

Acabo de probar esto en IE10/9 y trabajos. Esta debería ser la solución correcta. –

+0

bummer, sin soporte IE8. – johntrepreneur

+0

Esto es exactamente lo que necesitaba, gracias. Esto realmente debería estar documentado en MDN. – nils

Cuestiones relacionadas