Antes de leer esto, suba esta lista de eventos en otra página, la API en sí es tremendamente útil, y todo lo que discuto a continuación está vinculado directamente desde esta página .
Primero, .click(function)
es literalmente un atajo para .bind('click', function)
, son equivalentes. Úselos al vincular un controlador directamente a un elemento , así:
$(document).click(function() {
alert("You clicked somewhere in the page, it bubbled to document");
});
Si este elemento es reemplazado o desechado, este controlador ya no estará allí. Además, los elementos que no estaban allí cuando se ejecutó este código para adjuntar el controlador (por ejemplo, el selector lo encontró entonces) no obtendrán el controlador.
.live()
y .delegate()
están relacionados de manera similar, en .delegate()
realidad se usan .live()
internamente, ambos escuchan eventos para burbujear. Esto funciona para elementos nuevos y antiguos , burbujean eventos de la misma manera. Los usa cuando sus elementos pueden cambiar, por ejemplo, agregando nuevas filas, elementos de la lista, etc. Si no tiene un padre / antecesor común que permanecerá en la página y no se reemplazará en ningún momento, use de .live()
esta manera:
$(".clickAlert").live('click', function() {
alert("A click happened");
});
Sin embargo, si tiene un elemento padre en algún lugar que no se está reemplazando (por lo que sus controladores de eventos no se están despidiendo), debe manejarlo de .delegate()
esta manera:
$("#commonParent").delegate('.clickAlert', 'click', function() {
alert("A click happened, it was captured at #commonParent and this alert ran");
});
Esto funciona casi igual que .live()
, pero el evento burbujea menos veces antes de ser capturado y los controladores ejecutados. Otro uso común de ambos es decir que su clase cambia en un elemento, ya no coincide con el selector que utilizó originalmente ... con estos métodos, el selector se evalúa en el momento del evento , si coincide, el controlador se ejecuta. .so el elemento ya no coincide con el selector importa, ya no se ejecutará. Sin .click()
embargo, el controlador de eventos está vinculado directamente al elemento DOM, el hecho de que no coincida con el selector utilizado para encontrarlo es irrelevante ... el evento está vinculado y permanece hasta que ese elemento desaparezca, o el controlador se elimina a través de .unbind()
.
Otro uso común para .live()
y .delegate()
es el rendimiento . Si se trata de muchos elementos, adjuntar un controlador de clic directamente a cada elemento es costoso y requiere mucho tiempo. En estos casos, es más económico configurar un solo controlador y dejar que el burbujeo haga el trabajo, eche un vistazo a esta pregunta donde marcó una gran diferencia , es un buen ejemplo de la aplicación.
Activación : para la pregunta actualizada
Hay 2 funciones principales de activación del controlador de eventos disponibles, se incluyen en la misma categoría de "Anexo de controlador de eventos" en la API , estas son .trigger()
y .triggerHandler()
. .trigger('eventName')
tiene algunos atajos integrados para los eventos comunes, por ejemplo:
$().click(fn); //binds an event handler to the click event
$().click(); //fires all click event handlers for this element, in order bound
Puede ver una lista que incluye estos atajos aquí .
En cuanto a la diferencia, .trigger()
activa el controlador de eventos (pero no la acción predeterminada la mayoría de las veces, por ejemplo, colocando el cursor en el lugar correcto en un clic <textarea>
). Hace que los controladores de eventos se produzcan en el orden en que se vincularon (como lo haría el evento nativo), dispara las acciones de eventos nativos y burbujea el DOM.
.triggerHandler()
generalmente tiene un propósito diferente, aquí solo está tratando de disparar los controladores vinculados, no causa que se active el evento nativo, por ejemplo, enviar un formulario. No burbujea el DOM, y no se puede encadenar (devuelve lo que devuelve el controlador de eventos de último enlace para ese evento). Por ejemplo, si desea desencadenar un focus
evento pero no enfocar realmente el objeto, solo desea que se .focus(fn)
ejecute el código que está vinculado , esto haría eso, mientras que.trigger()
que haría eso y enfocaría el elemento y burbujearía.
Aquí hay un ejemplo del mundo real:
$("form").submit(); //actually calling `.trigger('submit');`
Esto ejecutaría cualquier controlador de envío, por ejemplo el complemento de validación jQuery , luego intentaría enviar el <form>
. Sin embargo, si solo desea validar, ya que está conectado a través de un submit
controlador de eventos, pero no envía el <form>
posterior, puede usar .triggerHandler('submit')
, de esta manera:
$("form").triggerHandler('submit');
El complemento evita que el controlador envíe el formulario bombardeando si la verificación de validación no pasa, pero con este método no nos importa lo que haga. Ya sea que haya sido cancelado o no, no estamos tratando de enviar el formulario, solo queríamos activarlo para volver a validarlo y no hacer nada más. ( Descargo de responsabilidad: este es un ejemplo superfluo ya que hay un .validate()
método en el complemento, pero es una buena ilustración de la intención)