javascript - eventos - como se obtiene acceso a un objeto creado de forma dinámica?
Reemplace todos los eventos de JavaScript vinculados a un elemento con un solo evento nuevo (4)
Suponiendo que hay un gran número de elementos en todo el sitio que tienen un número desconocido y un tipo de eventos vinculados a ellos.
Si necesito anular todos estos eventos con un solo evento vinculado y solo ese evento se activará, ¿cuáles son algunas recomendaciones?
Yo estaría vinculando el evento a un controlador de eventos de clic, y estoy usando jQuery.
Gracias por adelantado.
Me gustaría hacer una reflexión sin eliminar todos los eventos todos juntos (solo anularlos).
Si su nuevo evento único enlazado (lo llamamos "clic" aquí) es específico del elemento al que se enlaza, creo que puede ignorar cualquier otro evento simplemente con la función stopPropagation (). Me gusta esto
$("specific-selector").on("click", ".specific-class", function (e) {
e.stopPropagation()
// e.stopImmediatePropagation()
/* your code continues ... */
});
Detendrá las burbujas de eventos, por lo que sus otros eventos no se activarán. use stopImmediatePropagation () para evitar otros eventos adjuntos a los mismos elementos que hace "clic".
Por ejemplo, si el evento "mouseleave" también se enlaza al elemento $ ("clase-específica-selector-específica"), tampoco se activará.
Por fin, todos los demás eventos no se activarán en este elemento, sino en su nuevo elemento "clic".
La pregunta no resuelta es: ¿qué sucede si otros eventos también utilizan stopPropagation ()? ... Entonces creo que el que tiene mejor especificación gana, así que trate de evitar complejos, demasiados eventos es la sugerencia final.
Puede ver "Eventos directos y delegados" en el sitio de jQuery para obtener más información.
Parece que esto es bastante simple en realidad:
$(''#foo'').unbind(''click'');
$(''#foo'').bind(''click'', myNewFunction);
Gracias por sus respuestas sin embargo.
Trate de usar live lugar de bind
. Luego, puede eliminar fácilmente el enlace en vivo con el die del selector, que es una operación rápida y establecer otro en vivo igualmente rápido.
$(''selection here'').live(''..'', .....); // multiple invocations
$(''selection here'').die();
$(''selection here'').live(''click'',.....);
DOM no se toca en absoluto. La condición del evento se evalúa en la ocurrencia del evento.
Pero en general, si solo desea intercambiar las funciones del controlador, por qué no hacerlo de esta manera:
var ahandler = function(evt) { /* first implementation */ }
$(''.selector'').bind(''click'', function(evt) { ahandler(evt); });
//and then if you want to change handlers
ahandler = function(evt) { /* new implementation */ };
Esto da absolutamente ningún costo de los cambios, reencuadernación, etc.
Estás buscando jQuery#unbind
.
Para eliminar todos los controladores de eventos en un elemento o conjunto de elementos, simplemente haga lo siguiente:
$(''.some-selector'').unbind();
Para desenlazar solo los controladores de clic, use unbind(''click'')
:
$(''.some-selector'').unbind(''click'');
Para desvincular todos los controladores de clic y vincular inmediatamente su propio controlador después de eso, puede hacer algo como esto:
$(''.some-selector'').unbind(''click'').click(function(event) {
// Your code goes here
});
Tenga en cuenta que esto solo funcionará para eventos vinculados utilizando jQuery (utilizando .bind
o cualquier método jQuery que use .bind
internamente). Si desea eliminar todos los eventos onclick posibles de un conjunto dado de elementos, puede usar:
$(''.some-selector'')
.unbind(''click'') // takes care of jQuery-bound click events
.attr(''onclick'', '''') // clears `onclick` attributes in the HTML
.each(function() { // reset `onclick` event handlers
this.onclick = null;
});