2011-09-15 35 views
37

Giả sử rằng tôi đã xác định một số trình xử lý sự kiện Ajax toàn cục (ajaxStart, ajaxStop và ajaxError). Thông thường tôi tốt với điều đó, nhưng đối với một yêu cầu, tôi muốn vô hiệu hóa trình xử lý ajaxError nhưng vẫn chạy các trình xử lý ajaxStart và ajaxStop như bình thường. jQuery ajax function documentation đề cập đến tham số "toàn cầu" có thể được đặt thành false và được chuyển đến hàm $ .ajax để vô hiệu hóa tất cả các trình xử lý sự kiện Ajax toàn cầu, nhưng chúng không đề cập đến bất kỳ cách nào để vô hiệu hoá một số trình xử lý chung.Vô hiệu hóa một số trình xử lý sự kiện Ajax toàn cầu của jQuery cho một yêu cầu

Tôi có thể ngăn chặn trình xử lý ajaxError bằng cách thực hiện kiểm tra trên thuộc tính "url" của đối tượng ajaxSettings được chuyển tới hàm ajaxError, nhưng điều đó có vẻ hơi vụng về. Có ai ở đây biết về một cách để vô hiệu hóa chức năng ajaxError chạy mà sẽ được rõ ràng cho một ai đó tìm kiếm tại nơi mà các chức năng $ .ajax đang được gọi là?

Tôi có thể cung cấp ví dụ đơn giản nếu có ai muốn xem.

+0

Bạn đã thử (và tôi đoán về điều này) thêm trình xử lý '.error' của riêng bạn vào lệnh' $ .ajax() 'và sau đó đặt' return false' vào cuối hàm để ngừng xử lý ? –

+0

Vâng, tôi đã thử điều đó. Nó không khắc phục được vấn đề. Người xử lý toàn cầu vẫn chạy. –

+0

Trình xử lý toàn cục (thành công, lỗi, hoàn thành) chạy trước trình xử lý thành công/lỗi/hoàn thành nếu tôi nhớ chính xác. –

Trả lời

85

Có thể và không khó thực hiện.

Bạn chỉ cần thiết lập xử lý lỗi toàn cầu của bạn (.ajaxError) để nhận một vài trong số các thông số mà jQuery có thể cung cấp cho nó:

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

    // Normal processing 
}); 

Sau đó, bạn có thể thêm suppressErrors: true để các thiết lập của bất kỳ AJAX yêu cầu bạn thực hiện, và nếu nó không xử lý lỗi sẽ trở lại mà không làm những gì nó thường làm.

See it in action.

+0

Điều này có vẻ như là câu trả lời hay nhất cho đến nay. Tôi thích ví dụ của bạn. –

+0

Tôi đã thử ý tưởng của bạn và nó đã hoạt động. Tôi có thể sẽ trao tiền thưởng cho bạn, trừ khi người khác có thể đưa ra một giải pháp thanh lịch hơn. –

+0

Câu trả lời này hoàn toàn phù hợp với nhu cầu của tôi vì vậy tôi quyết định trao tiền thưởng cho bạn. –

7

cố gắng sử dụng global: false trong yêu cầu ajax của bạn như:

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

nguồn :: http://docs.jquery.com/Ajax_Events

Look cho các sự kiện toàn cầu.

+1

Tôi đã thử điều đó và nó vô hiệu hóa tất cả các trình xử lý ajax toàn cầu. Tôi chỉ cố gắng vô hiệu hóa một số trình xử lý ajax toàn cầu nhất định. –

+1

Điều này đã giúp rất nhiều với một vấn đề tương tự. Cảm ơn! – mwcz

+0

Đây là câu trả lời hay nhất tôi nghĩ –

14

Khi bạn nhìn vào câu lệnh if này từ nguồn jquery/ajax https://github.com/jquery/jquery/blob/master/src/ajax.js#L579-582, là một trong nhiều loại cùng loại, rõ ràng là vấn đề của bạn không thể được giải quyết bởi tham số jquery một mình.

Đề nghị của tôi sẽ được:

  • đặt toàn cầu false, như Vaibhav Gupta nói

  • đồ xử lý toàn cầu của bạn đến địa phương trong các cuộc gọi ajax cụ thể và kích hoạt các sự kiện toàn cầu thông qua các $ phương pháp .event.trigger

mẫu:

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

Điều này có vẻ như nó có thể ngăn chặn xử lý lỗi, nhưng nó có thể gây ra các vấn đề tinh tế khác. Trình xử lý beforeSend chỉ được chạy khi yêu cầu Ajax đầu tiên bắt đầu. Nó không được phép chạy nếu có một yêu cầu Ajax khác đang diễn ra. Hàm ajaxStop chạy khi tất cả các yêu cầu Ajax dừng lại. Nó không nên chạy nếu có các yêu cầu Ajax khác. Tôi vẫn có thể thử câu trả lời của bạn anyway nếu tôi không thấy bất cứ điều gì tốt hơn. –

+0

Theo nguồn của jQuery (https://github.com/jquery/jquery/blob/master/src/ajax.js#L659-661) jQuery đang sử dụng một bộ đếm công khai có sẵn jQuery.active. Tôi xác nhận rằng bạn có thể sử dụng điều này để kích hoạt sự kiện toàn cầu. Ví dụ: beforeSend: function() {if (jQuery.active === 0) {$ .event.trigger ('ajaxStart')}} – topek

8

Bạn có thể đặt tạm thời $.event.global.ajaxError thành false để tắt tính năng gọi lại lỗi toàn cục. Sử dụng các errorcomplete callbacks yêu cầu đặc biệt của bạn để thiết lập các cờ:

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

Một ví dụ là có sẵn trên jsFiddle.

Điều đó được trình bày, tôi muốn thêm rằng tôi vẫn thích đề xuất của Jon hơn. Kỹ thuật này yêu cầu đặt cờ tại 2 địa điểm mà bạn có thể quên một và lên và vô tình xử lý các trình xử lý toàn cầu. Lý do khác là kỹ thuật của Jon nên được đảm bảo để làm việc trên các bản phát hành jQuery, nơi thiết lập một số cờ bên trong không đáng tin cậy.

Các vấn đề liên quan