2011-09-15 16 views
37

Załóżmy, że mam zdefiniowane niektóre globalne procedury obsługi zdarzeń Ajax (ajaxStart, ajaxStop i ajaxError). Zazwyczaj mi to nie przeszkadza, ale na jedno żądanie chcę wyłączyć obsługę ajaxError, ale nadal tak jak zwykle uruchomić obsługę ajaxStart i ajaxStop. jQuery ajax function documentation wspomina o parametrze "globalnym", który można ustawić na false i przekazać do funkcji $ .ajax w celu wyłączenia wszystkich globalnych procedur obsługi zdarzeń Ajax, ale nie wspominają one o żadnym sposobie wyłączania tylko niektórych globalnych procedur obsługi.Wyłączanie niektórych programów obsługi zdarzeń globalnych Ajax jQuery dla żądania

Mogę zapobiec obsłudze ajaxError wykonując test na właściwości "url" obiektu ajaxSettings, który jest przekazywany do funkcji ajaxError, ale wydaje się to nieco niezdarne. Czy ktoś tutaj wie o sposobie wyłączenia działania ajaxError, które byłoby jasne dla kogoś, kto szuka w miejscu, w którym wywoływana jest funkcja $ .ajax?

Mogę podać prosty przykład, jeśli ktoś chce to zobaczyć.

+0

Czy próbowałeś (i zgaduję na tym), dodając własny program obsługi '.error' do wywołania' $ .ajax() ', a następnie wstawiając' return false' na końcu funkcji, aby zatrzymać przetwarzanie ? –

+0

Tak, próbowałem tego. To nie rozwiązało problemu. Globalny program obsługi nadal działał. –

+0

Globalny handler (sukces, błąd, kompletny) jest uruchamiany przed sukcesem/błędem/zakończeniem programu obsługi, jeśli dobrze pamiętam. –

Odpowiedz

85

Jest to możliwe i nie jest trudne.

Wystarczy skonfigurować swoją globalną obsługi błędów (.ajaxError), aby otrzymać kilka parametrów, które jQuery może dostarczyć do niego:

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

    // Normal processing 
}); 

Po tym, można dodać suppressErrors: true z ustawieniami jakiegokolwiek AJAX Żądanie zostanie wykonane, a jeśli się nie powiedzie, program obsługi błędu wróci, nie robiąc tego, co normalnie robi.

See it in action.

+0

To wygląda jak najlepsza odpowiedź. Podoba mi się twój przykład. –

+0

Wypróbowałem twój pomysł i zadziałało. Prawdopodobnie przyznam ci nagrodę, chyba że ktoś inny zaproponuje bardziej eleganckie rozwiązanie. –

+0

Ta odpowiedź jest całkowicie adekwatna do moich potrzeb, dlatego zdecydowałem się przyznać nagrodę. –

7

spróbować użyć global: false w swoim wniosku ajax jak:

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

źródło :: http://docs.jquery.com/Ajax_Events

Look dla zdarzeń globalnych.

+1

Próbowałem tego i wyłączono wszystkie globalne programy obsługi ajax. Próbuję tylko wyłączyć niektóre globalne programy obsługi ajax. –

+1

To bardzo pomogło przy podobnym problemie. Dzięki! – mwcz

+0

To jest najlepsza odpowiedź, myślę, że –

14

Kiedy patrzysz na tę instrukcję if ze źródła jquery/ajax https://github.com/jquery/jquery/blob/master/src/ajax.js#L579-582, która jest jedną z wielu tego samego rodzaju, jasne jest, że problemu nie można rozwiązać samodzielnie za pomocą parametru jquery.

Moja sugestia będzie:

  • ustawić globalny false, jak Vaibhav Gupta powiedział

  • mapa globalne ładowarki do lokalnych w konkretnym wywołania ajax i wywołać globalną imprezę przez $ Sposób .event.trigger

próbki:

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

Wygląda na to, że może to uniemożliwić obsługę błędów, ale może powodować inne subtelne problemy. Procedura obsługi beforeSend ma działać tylko wtedy, gdy pierwsze żądanie Ajax się rozpoczyna. Nie powinno się go uruchamiać, jeśli trwa już inne żądanie Ajax. Funkcja ajaxStop jest uruchamiana po zatrzymaniu wszystkich żądań Ajax. Nie powinien działać, jeśli są inne żądania Ajax. Nadal mogę spróbować odpowiedzi, jeśli nie widzę nic lepszego. –

+0

Zgodnie ze źródłem jQuery (https://github.com/jquery/jquery/blob/master/src/ajax.js#L659-661) jQuery używa publicznego dostępnego licznika jQuery.active. Potwierdziłem, że możesz użyć tego do wystrzelenia globalnego wydarzenia. Przykład: beforeSend: function() {if (jQuery.active === 0) {$ .event.trigger ("ajaxStart")}} – topek

8

Można ustawić na false, aby wyłączyć tymczasowe wywoływanie globalnego wywołania błędu. Użyj error i complete callbacków swojej specjalne zamówienie, aby ustawić flagi:

$.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; 
}); 

Przykładem jest dostępny na jsFiddle.

To przedstawienie, chcę dodać, że nadal wolałbym propozycję Jona. Technika ta wymaga ustawienia flagi na 2 miejscach, z których można zapomnieć i do tego, aby globalne procedury obsługi były wyłączone przypadkowo. Innym powodem jest to, że technika Jona powinna działać w wydaniach jQuery, gdzie ustawienie niektórych flag wewnętrznych nie jest niezawodne.

Powiązane problemy