jQuery equivalente del método addEventListener de JavaScript

190

Estoy tratando de encontrar el equivalente jQuery de esta llamada al método JavaScript:

document.addEventListener('click', select_element, true);

He llegado tan lejos como:

$(document).click(select_element);

pero eso no logra el mismo resultado, como el último parámetro del método JavaScript: un valor booleano que indica si el controlador de eventos debe ejecutarse en la fase de captura o burbujeo (según tengo entendido en http://www.quirksmode.org /js/events_advanced.html ): se .

¿Cómo especifico ese parámetro o logro la misma funcionalidad con jQuery?

Estropear
fuente
3
JQuery no admite la captura de eventos, ya que IE no admite la captura de eventos, que es compatible con jQuery;) ¿Está buscando compatibilidad con IE?
Crescent Fresh
Gracias, Crescent Fresh. Creo que eso tiene sentido ahora. Necesito compatibilidad con IE, así que supongo que debo olvidarme de la fase de captura.
Bungle

Respuestas:

142

No todos los navegadores admiten la captura de eventos (por ejemplo, las versiones de Internet Explorer anteriores a la 9 no), pero todos admiten el burbujeo de eventos, por lo que es la fase utilizada para vincular controladores a eventos en todas las abstracciones entre navegadores, incluido jQuery.

Lo más cercano a lo que está buscando en jQuery está usando bind()(reemplazado por on()jQuery 1.7+) o los métodos jQuery específicos del evento (en este caso click(), que llama bind()internamente de todos modos). Todos usan la fase de burbujeo de un evento elevado.

Russ Cam
fuente
66
Parece que IE9 finalmente lo admite. blogs.msdn.com/b/ie/archive/2010/03/26/…
algunos
y por qué no admiten la captura de eventos? ¿Cuáles son las desventajas de la captura de eventos?
Aakash
2
Para ser claros, estás diciendo que lo que quiere el OP no es posible, que tienes que usar burbujeo y no puedes usar la captura. ¿Correcto?
Noumenon el
115

A partir de jQuery 1.7, .on()ahora es el método preferido para vincular eventos, en lugar de.bind() :

Desde http://api.jquery.com/bind/ :

A partir de jQuery 1.7, el método .on () es el método preferido para adjuntar controladores de eventos a un documento. Para versiones anteriores, el método .bind () se usa para adjuntar un controlador de eventos directamente a los elementos. Los controladores se adjuntan a los elementos seleccionados actualmente en el objeto jQuery, por lo que esos elementos deben existir en el punto en que se produce la llamada a .bind (). Para un enlace de eventos más flexible, vea la discusión sobre la delegación de eventos en .on () o .delegate ().

La página de documentación se encuentra en http://api.jquery.com/on/


fuente
La respuesta aceptada ha sido editada para abordar esto.
Usuario que no es usuario
51

Lo más cercano sería la función de enlace:

http://api.jquery.com/bind/

$('#foo').bind('click', function() {
  alert('User clicked on "foo."');
});
Ben Rowe
fuente
14

Una cosa a tener en cuenta es que los métodos de eventos jQuery no se activan / atrapan loaden embedetiquetas que contienen DOM SVG que se carga como un documento separado en la embedetiqueta. La única forma que encontré para atrapar a unload evento en estos fue usar JavaScript sin procesar.

Esto no funcionará (he probado on/ bind/ loadmétodos):

$img.on('load', function () {
    console.log('FOO!');
});

Sin embargo, esto funciona:

$img[0].addEventListener('load', function () {
    console.log('FOO!');
}, false);
tbjers
fuente
1
Debe tenerse en cuenta que esta es la forma correcta si tiene la intención de no sobrescribir ningún otro controlador de eventos enlazado para los elementos.
r3wt
¿cuál es el $img?
anatol
12

Ahora debe usar la .on()función para vincular eventos.


fuente
2

$( "button" ).on( "click", function(event) {

    alert( $( this ).html() );
    console.log( event.target );

} );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

<button>test 1</button>
<button>test 2</button>

antílope
fuente
1

Aquí hay un excelente tratamiento en la Red de Desarrollo de Mozilla (MDN) de este problema para JavaScript estándar (si no desea confiar en jQuery o entenderlo mejor en general):

https://developer.mozilla.org/en-US/docs/DOM/element.addEventListener

Aquí hay una discusión sobre el flujo de eventos desde un enlace en el tratamiento anterior:

http://www.w3.org/TR/DOM-Level-3-Events/#event-flow

Algunos puntos clave son:

  • Permite agregar más de un controlador para un evento
  • Le brinda un control más preciso de la fase cuando el oyente se activa (captura frente a burbujeo)
  • Funciona en cualquier elemento DOM, no solo en elementos HTML
  • El valor de "esto" pasado al evento no es el objeto global (ventana), sino el elemento desde el cual se dispara el elemento. Esto es muy conveniente.
  • El código para los navegadores IE antiguos es simple y se incluye bajo el encabezado "Legacy Internet Explorer y attachEvent"
  • Puede incluir parámetros si incluye el controlador en una función anónima
Xitalogy
fuente