2011-09-15 10 views
37

Supongamos que tengo definidos algunos manejadores de eventos Ajax globales (ajaxStart, ajaxStop y ajaxError). Normalmente estoy de acuerdo con eso, pero para una solicitud, quiero deshabilitar el controlador ajaxError pero aún ejecutar los controladores ajaxStart y ajaxStop como de costumbre. El jQuery ajax function documentation menciona el parámetro "global" que se puede configurar como falso y se pasa a la función $ .ajax para deshabilitar todos los controladores de eventos Ajax globales, pero no mencionan ninguna forma de desactivar solo algunos controladores globales.Deshabilitar algunos manejadores de eventos Ajax globales de jQuery para una solicitud

Puedo evitar el controlador ajaxError haciendo una prueba en la propiedad "url" del objeto ajaxSettings que se pasa a la función ajaxError, pero parece algo torpe. ¿Alguien aquí sabe de una forma de desactivar la ejecución de la función ajaxError que sería claro para alguien que busca en el lugar donde se está llamando a la función $ .ajax?

Puedo proporcionar un ejemplo simple si alguien quiere verlo.

+0

Ha intentado (y estoy adivinando esto) agregar su propio controlador '.error' en la llamada' $ .ajax() 'y luego poner' return false' al final de la función para detener el procesamiento ? –

+0

Sí, lo intenté. No solucionó el problema. El controlador global aún se ejecutó. –

+0

El controlador global (éxito, error, completo) se ejecuta antes del controlador de éxito/error/completo si no recuerdo mal. –

Respuesta

85

Es posible y no es difícil de hacer.

Sólo tiene que configurar su gestor de errores mundial (.ajaxError) para recibir algunos de los parámetros que jQuery puede proporcionar a la misma:

$("div.log").ajaxError(function(evt, xhr, settings) { 
    if(settings.suppressErrors) { 
     return; 
    } 

    // Normal processing 
}); 

Después de esto, se puede añadir suppressErrors: true a la configuración de cualquier AJAX solicitar que realice, y si falla, el controlador de errores regresará sin hacer lo que normalmente hace.

See it in action.

+0

Esta parece ser la mejor respuesta hasta el momento. Me gusta tu ejemplo. –

+0

Probé tu idea y funcionó. Probablemente te otorgue el botín, a menos que alguien más pueda proponer una solución más elegante. –

+0

Esta respuesta es completamente adecuada para mis necesidades, así que decidí otorgarle la recompensa. –

7

tratan de utilizar global: false en su solicitud Ajax como:

$.ajax({ 
    url: "test.html", 
    global: false, 
    // ... 
}); 

fuente :: http://docs.jquery.com/Ajax_Events

buscar eventos globales.

+1

Intenté eso y deshabilitó todos los controladores ajax globales. Solo estoy intentando desactivar ciertos controladores globales de ajax. –

+1

Esto ayudó mucho con un problema similar. ¡Gracias! – mwcz

+0

Esta es la mejor respuesta, creo –

14

Cuando mira esta declaración if de la fuente jquery/ajax https://github.com/jquery/jquery/blob/master/src/ajax.js#L579-582, que es una de muchas del mismo tipo, está claro que su problema no puede resolverse solo con un parámetro jquery.

Mi sugerencia sería:

  • conjunto global a falso, como Vaibhav Gupta dijo

  • mapa sus manipuladores global a lo local en la llamada ajax específica y desencadenar el evento global a través de la $ método .event.trigger

muestra:

$.ajax({ 
    url: "test.html", 
    global: false, 
    beforeSend: function(){$.event.trigger('ajaxStart');}, 
    complete: function(){$.event.trigger('ajaxStop');}, 
    error: your_error_handler 
}); 
+0

Parece que puede evitar el controlador de errores, pero puede causar otros problemas sutiles. Se supone que el controlador beforeSend solo se ejecuta cuando comienza la primera solicitud de Ajax. No se supone que se ejecute si ya hay otra solicitud Ajax en curso. La función ajaxStop se ejecuta cuando todas las solicitudes Ajax se detienen. No debería ejecutarse si hay otras solicitudes de Ajax. Todavía puedo intentar tu respuesta de todos modos si no veo nada mejor. –

+0

De acuerdo con la fuente de jQuery (https://github.com/jquery/jquery/blob/master/src/ajax.js#L659-661) jQuery está utilizando un contador público disponible jQuery.active. Confirmé que puedes usar esto para disparar el evento global. Ejemplo: beforeSend: function() {if (jQuery.active === 0) {$ .event.trigger ('ajaxStart')}} – topek

8

Puede establecer $.event.global.ajaxError en false para deshabilitar la invocación de la devolución de llamada de error global temporalmente. Utilice los error y complete devoluciones de llamada de su petición especial para establecer las banderas:

$.ajax({ 
    url: 'some.domain.com/', 
}).error(function(jXHR){ 
    // Disable global error logging 
    $.event.global.ajaxError = false; 
}).complete(function(){ 
    // Enable global error logging 
    $.event.global.ajaxError = true; 
}); 

Un ejemplo es disponible en jsFiddle.

Al presentarlo, quiero agregar que aún preferiría la propuesta de Jon. Esta técnica requiere establecer el indicador en 2 lugares de los cuales se podría olvidar uno y y hasta tener los controladores globales desactivados accidentalmente. La otra razón es que se debe garantizar que la técnica de Jon funcione en todos los lanzamientos de jQuery donde la configuración de algunos indicadores internos no es confiable.

Cuestiones relacionadas