jQuery registra automáticamente el (los) controlador (es) de eventos en las acciones del usuario en los elementos que se agregan a DOM mediante la respuesta Ajax
Para la aplicación web ajax que tiene muchas pantallas y navegaciones, para adjuntar controladores de eventos para div o enlaces o botones, podemos codificar como:
//Using $.on inside Ajax success handler
$("#container").on("click", "#selector", function(event){
});
Este enfoque NO funcionará si el contenedor no existe en el DOM. Para que funcione, tendrá que usar el documento o el cuerpo como contenedor, el rendimiento puede no ser bueno.
Podría haber muchas líneas de código en el controlador de éxito Ajax. Para organizarse mejor, puede mover el código a una función y llamar a esa función en el controlador de éxito Ajax. Pero tenemos que hacer muchas funciones de registro de eventos para todas las permutaciones y combinaciones.
Registro de funciones de saturación de códigos.
Si el controlador de eventos ya estaba registrado, el registro nuevamente causará dos controladores iguales. Por lo tanto, debemos cancelar el registro y registrarse (O adjuntar solo si no está adjunto) - No estamos seguros sobre el problema de rendimiento.
¿Alguna alternativa?
Estoy pensando en seguir:
Mantenga un mapa del contenedor, destino y haga clic en el controlador de eventos en un lugar para un módulo.En el controlador de eventos global ajaxComplete, si xhr.responseHTML tiene el contenedor, adjunte el controlador de eventos a los elementos de destino (adjunte solo si no está adjunto ya).
$(document).ajaxComplete(function(e, xhr, settings){
for(ind in clickEventListeners){eventlistner = clickEventListeners[ind];
if($(eventlistner.container,xhr.responseHTML).length > 0){
$(eventlistner.target).on("click",function(){
eventlistner.processor(this);
});
}
}
});
Pros: Todos los controladores de eventos documentados en un solo lugar para un módulo. No hay saturación de código en cada controlador de éxito ajax.
Contras: No estoy seguro si alguno.
Por favor avise si tiene alguna sugerencia.