Pruebe si el controlador de eventos está vinculado a un elemento en jQuery por el método delegate ()

Tengo una pregunta similar a esta, sin embargo, hay una diferencia importante. El método proporcionado en la respuesta aceptada funciona correctamente con eventos vinculados "directamente". No produce resultados si a los manejadores se les asigna el delegate método. Por ejemplo:

$("#some-element").delegate(".some-class", "click", function () {
  alert("Click!");
});

Después de elementos con clase some-class se generan e insertan en el html, ¿hay alguna manera de probar si el click controlador de eventos se ha vinculado a ellos?

EDIT: Según el comentario de @ Pointy, corregiré la pregunta anterior, ya que el controlador no estaría obligado a .some-class:

¿Hay alguna forma de comprobar si un elemento, representado, por ejemplo, por un objeto jQuery (en este ejemplo podría ser $(".some-class")), si se hace clic, ¿activaría el controlador?

preguntado el 01 de febrero de 12 a las 13:02

El controlador de eventos "clic" es no vinculado a esos elementos. Está vinculado a "# algún-elemento", y eso no cambia solo porque el DOM cambia. Los eventos se propagan por el DOM ("burbuja"), y el controlador vinculado a "# algún-elemento" primero se asegura de que el objetivo del evento tenga la clase "alguna-clase". Si es así, se llama al controlador. -

Entiendo. Sabiendo eso, ¿hay alguna manera de simular el comportamiento que mencioné en la pregunta? Lo corregiré ahora para ser más específico:

Bueno, no creo que haya un mecanismo jQuery listo para usar para verificar esto. Supongo que podrías escribir uno, si descubrieras dónde / cómo jQuery almacena la información del calificador de eventos para ".delegate ()". Parece que sería más fácil simplemente mantener sus propios registros de los controladores configurados. -

Puede comprobarlo si sabe a qué elemento raíz se delegan sus eventos. Si lo sabe, puede comprobarlo. $("#some-element").data('events') para el oyente de eventos para su .some-class selector. -

1 Respuestas

Como ha señalado Puntiagudo los eventos brotan y hay un solo controlador de eventos "maestro" vinculado al elemento raíz que verifica si el elemento que recibió inicialmente el clic tiene la clase que usted proporcionó, si la tiene, se llamará a su devolución de llamada.

Entonces, para verificar si se llamará a su devolución de llamada en el elemento, todo lo que tiene que hacer es verificar si el elemento está en la lista proporcionada por el selector $("#some-element .some-class");

Entonces, algo como esto debería funcionar (no lo he probado):

var testEl = elementYouWantToTestAgainst;
if ($("#some-element .some-class").is(testEl)) {
    //It is "bound"
}

U otra solución, que hace lo mismo;

//Which should do something like this:  
var els = $("#some-element .some-class");
els.each(function() {
    if (this === testEl) {
        //It is "bound"
    }
});

En cuanto a los eventos de depuración, generalmente solo agrego console.log("Event fubar fired!"); a los manipuladores.

contestado el 23 de mayo de 17 a las 14:05

\ @Maiku: puedes usar el is() método y simplemente hazlo; if ($("#some-element .some-class").is(elementYouWantToTestAgainst)) - Matt

Tengo algunos problemas al intentar activar un click evento en mi aplicación y lo necesito para fines de depuración. Gracias por el consejo, lo intentaré. - przemek

@ Matt, gracias, estaba revisando los documentos para ver si hay algo así. No uso mucho jQuery hoy en día. - Maiku Mori

Sin embargo, recuerde que algún elemento entre .some-class y # some-element puede llamar a .stopPropagation () para evitar que el clic llegue al controlador delegado. - Dave Methvin

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.