2012-03-18 35 views
12

Những gì tôi đang cố gắng làm là gắn thêm hình ảnh vào div (để người dùng biết thứ gì đó đang tải) và sau đó tôi gọi hàm jquery ajax, được đặt thành "async: false". Đây là mã của tôi:Dừng khóa trình duyệt trong khi (đồng bộ) Ajax?

$jQuery("#playersListDiv").html(loadingImage);  
$jQuery.ajax({ 
     type: "POST", /* this goesn't work with GET */ 
     url: urlValue, /*ex: "NBAgetGamesList.php" */ 
     data: parameters, /*ex: "param1=hello" */ 
     cache: false, 
     async: false, 
        success: function(data){ 

        } 
}); 

Vấn đề là trình duyệt khóa và không thêm hình ảnh tải cho đến SAU KHI cuộc gọi ajax hoàn tất vô dụng. Firefox là trình duyệt duy nhất thực sự gắn thêm hình ảnh tải. IE, Chrome và Safari KHÔNG thêm hình ảnh tải.

Tôi biết khóa trình duyệt xảy ra vì async được đặt thành false nhưng đây là tùy chọn duy nhất của tôi vì tôi phải đợi yêu cầu này hoàn tất trước khi tiếp tục vì tôi cần dữ liệu được trả về.

Có cách nào xung quanh vấn đề này không? Nếu tôi đặt cảnh báo sau khi tôi thêm hình ảnh tải hoạt động nhưng tôi không muốn cảnh báo xuất hiện mỗi lần.

+5

Đồng bộ, theo định nghĩa, là "chặn". Làm thế nào nó sẽ ảnh hưởng đến các trình duyệt khác nhau nhưng thường chặn các cập nhật và tương tác DOM. Làm cho nó không đồng bộ để "khắc phục" sự cố. –

+1

Tại sao không chỉ làm cho nó không đồng bộ và đặt mã để chạy sau này trong một chức năng riêng biệt. Sau đó gọi hàm trong mã trả về? – Bob

+2

"vì tôi cần dữ liệu được trả về". Đó là những gì gọi lại cho. Mã của bạn không phải là tuyến tính. – epascarello

Trả lời

12

Mặc dù khẳng định của bạn ngược lại bạn không cần nó phải được đồng bộ. Bất cứ điều gì bạn cần làm với/sau khi phản ứng có thể được thực hiện thành công (và/hoặc lỗi hoặc hoàn thành) gọi lại. Vì vậy, thay đổi:

$jQuery("#playersListDiv").html(loadingImage);  
$jQuery.ajax({ 
    ... 
    async: false, 
    ... 
}); 
// OTHER CODE 

là như thế này:

$jQuery("#playersListDiv").html(loadingImage);  
$jQuery.ajax({ 
    ... 
    async: true, 
    success: function(data) { 
     // OTHER CODE 
    } 
}); 

Hoặc di chuyển "CODE KHÁC" tới chức năng riêng biệt mà bạn gọi từ gọi lại thành công.

Nếu bạn cần một cái gì đó phức tạp hơn mà bạn có thể gói gọn ở trên trong một hàm và vượt qua một callback với nó:

function doAjaxStuff(callback) { 
    $jQuery("#playersListDiv").html(loadingImage);  
    $jQuery.ajax({ 
     ... 
     async: true, 
     success: function(data) { 
      // optional other processing here, then: 
      callback(data); 
     } 
    }); 
} 

// then from somewhere else in your code: 
doAjaxStuff(function(data) { 
    // do something with data 
}); 
+0

Đó chính xác là những gì tôi đã có. Một hàm thành công/gọi lại. Trình duyệt bị khóa cho đến khi chức năng gọi lại hoàn tất. – Ray

+2

Đó là _not_ những gì bạn đã có: thay đổi mã của bạn thành 'async: true' (hoặc bỏ qua tham số hoàn toàn và nó phải mặc định là' async: true'). – nnnnnn

+0

Xin lỗi tôi đã không rõ ràng. Tôi đã thử "async: true" ban đầu và mã thậm chí không hoạt động. Đó là lý do tại sao tôi đã đi sai ở nơi đầu tiên. Mục tiêu của tôi là tìm ra cách để làm việc này với "async: false". – Ray

-1

Tôi đã xem qua vấn đề này và tôi tìm thấy một giải pháp cho nó.
Giả sử! bạn thực sự cần sử dụng async : false trong số ajax request và bạn muốn hiển thị Hình ảnh tải trong khi thực hiện yêu cầu ajax. Nhưng yêu cầu ajax đang tạm dừng hoạt động giao diện người dùng khác (hiển thị hình ảnh tải) do async : false. Vì vậy, giải pháp đơn giản cho nó, Sử dụng fadeIn để hiển thị hình ảnh tải và fadeOut để ẩn hình ảnh tải.

Đây là bản trình diễn jsFiddle chứa yêu cầu ajax với async : false. Do đó, tải hình ảnh không hiển thị. (Tôi đã sử dụng phương pháp show để hiển thị hình ảnh tải.).

Dưới đây là một jsFiddle khác với hiệu ứng fadeIn và fadeOut. Nó hiển thị hình ảnh tải bất kể số async : false trong yêu cầu ajax.

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