jQuery đã không dùng XMLHTTPRequest đồng bộ nữa


119

Giống như nhiều người khác, trang web của tôi đang sử dụng jQuery. Khi tôi mở các công cụ dành cho nhà phát triển, tôi thấy một cảnh báo cho biết rằng XMLHTTPRequest là

không được dùng nữa vì những tác động bất lợi của nó đối với trải nghiệm của người dùng cuối.

Tôi đã tiếp tục và đọc một phần của tài liệu , nhưng nó khá kỹ thuật. Ai đó có thể giải thích hậu quả của việc chuyển từ XMLHTTPRequest sang WHATWG bằng các thuật ngữ đơn giản không? Nó nói rằng nó đã xảy ra vào năm 2012.

Ngoài ra, tài liệu nói rằng Synchronous XMLHttpRequest bên ngoài worker đang trong quá trình bị xóa khỏi nền tảng web, khi điều đó xảy ra, nếu tác nhân người dùng có họ trong một dịch vụ, họ có cần sửa đổi mã hiện có của mình không?


2
Chắc hẳn bạn đang nói về các yêu cầu XMLHTTPRequests đồng bộ, không phải là những cái không đồng bộ, đúng không? Yêu cầu đồng bộ rất tệ đối với trải nghiệm người dùng cuối (chúng khóa trình duyệt trong quá trình yêu cầu) và thường không được sử dụng.
jfriend00

2
cung cấp một số mã kích hoạt điều này
charlietfl

3
Đây có phải là toàn bộ nội dung được đề cập không? Synchronous XMLHttpRequest trên luồng chính không được dùng nữa vì tác động bất lợi của nó đối với trải nghiệm của người dùng cuối.
Qantas 94 Heavy

1
jQuery chỉ đưa ra cảnh báo đó cho các yêu cầu đồng bộ, phải không? Bạn đang cố tình đưa ra một yêu cầu đồng bộ? Nếu vậy, giải pháp là cấu trúc mã của bạn để hoạt động với các yêu cầu không đồng bộ, điều này bạn nên làm vì chúng đẹp hơn nhiều theo quan điểm của người dùng.
nnnnnn

1
Tôi đã thấy lá cờ đó không chỉ trong trang web của mình, tôi đã thấy nó ở một số trang khác, ví dụ như Youtube, cũng như. Về thông số kỹ thuật, mã của tôi phải tuân thủ với thông số kỹ thuật nào, W3C's hay WHATWG? , tham khảo Tôi không muốn hỏi trong chủ đề chính vì nó sẽ bị gắn cờ như một vấn đề quan điểm mà tôi đoán. @ Qantas94Heavy
Edd

Câu trả lời:


136

Để tránh cảnh báo này, không sử dụng:

async: false

trong bất kỳ $.ajax()cuộc gọi nào của bạn . Đây là tính năng duy nhất XMLHttpRequestkhông được dùng nữa.

Mặc định là async: true, vì vậy nếu bạn không bao giờ sử dụng tùy chọn này, mã của bạn sẽ an toàn nếu tính năng thực sự bị xóa.

Tuy nhiên, có lẽ sẽ không - nó có thể bị xóa khỏi các tiêu chuẩn, nhưng tôi cá rằng các trình duyệt sẽ tiếp tục hỗ trợ nó trong nhiều năm. Vì vậy, nếu bạn thực sự cần AJAX đồng bộ vì lý do nào đó, bạn có thể sử dụng async: falsevà chỉ cần bỏ qua các cảnh báo. Nhưng có những lý do chính đáng khiến AJAX đồng bộ bị coi là kém phong cách, vì vậy có lẽ bạn nên cố gắng tìm cách tránh nó. Và những người viết ứng dụng Flash có lẽ cũng không bao giờ nghĩ rằng nó sẽ biến mất, nhưng nó đang trong quá trình loại bỏ dần.

Lưu ý rằng FetchAPI thay thế XMLHttpRequestthậm chí không cung cấp tùy chọn đồng bộ.


9
Đây là cảnh báo của jQuery sau đó. Tôi có thể bỏ qua nó? Tôi không sử dụng các cuộc gọi đồng bộ đến máy chủ. Tính cách cầu toàn của tôi không thích có cảnh báo gì cả.
Jordan

2
@Jordan Tôi nghĩ rằng cảnh báo đến từ trình duyệt, không phải jQuery. Nó sẽ xảy ra bất cứ khi nào bạn cố gắng sử dụng AJAX đồng bộ. Nếu bạn sử dụng jQuery, điều đó sẽ chỉ xảy ra nếu bạn chỉ định tùy chọn đó $.ajax.
Barmar

2
Tôi đang sử dụng jquery.i18n.properties.jsnhưng không có cuộc gọi rõ ràng nào bên cạnh tôi đến $.ajax.Có lẽ trong nội bộ, nhưng không chắc chắn.
Manuel Jordan

1
Plugin đó tải các gói tài nguyên từ .propertiescác tệp. Nó có thể sử dụng AJAX đồng bộ để làm điều đó, gây ra cảnh báo này.
Barmar

1
@ManuelJordan cài đặt không đồng bộ: true trong i18n có thể gây ra sự chậm trễ trong việc hiển thị các chuỗi được hiển thị trong trang của bạn khi kết nối chậm. Showin thay vì mã chuỗi
Siyon DP

62

Câu trả lời được chấp nhận là đúng, nhưng tôi đã tìm thấy một nguyên nhân khác nếu bạn đang phát triển theo ASP.NET với Visual Studio 2013 trở lên và chắc chắn rằng bạn không thực hiện bất kỳ yêu cầu ajax đồng bộ nào hoặc xác định bất kỳ tập lệnh nào không đúng chỗ.

Giải pháp là tắt tính năng "Liên kết trình duyệt" bằng cách bỏ chọn "Bật liên kết trình duyệt" trong menu thả xuống của thanh công cụ VS được biểu thị bằng biểu tượng làm mới nhỏ trỏ theo chiều kim đồng hồ. Ngay sau khi bạn làm điều này và tải lại trang, các cảnh báo sẽ dừng lại!

Tắt liên kết trình duyệt

Điều này chỉ xảy ra trong khi gỡ lỗi cục bộ, nhưng vẫn tốt để biết nguyên nhân của các cảnh báo.


Người ta có thể vô hiệu hóa web.configbằng cách thêm vào <add key="vs:EnableBrowserLink" value="false" />bên trong <appSettings>như được mô tả ở đây: poconosystems.com/software-development/… .
Beel

3
Tôi nghĩ rằng đây là một gợi ý tồi chỉ để nhận thông báo cảnh báo trong bảng điều khiển. Tắt liên kết trình duyệt và loại bỏ các cải tiến năng suất mà liên kết trình duyệt thêm vào để bạn sẽ không thấy thông báo cảnh báo trong bảng điều khiển của trình duyệt? Tốt hơn nên gửi một lỗi với microsoft và nó sẽ được sửa.
coding4fun

4
@ coding4fun Cảm ơn ý kiến ​​của bạn; bạn có thể gửi lỗi cho Microsoft. Tôi không nói rằng bạn nên tắt Liên kết trình duyệt. Câu trả lời của tôi là chính xác về nguyên nhân của cảnh báo này trong một số trường hợp và sẽ hữu ích nếu bạn loại trừ điều gì đó trong mã của riêng bạn. Cá nhân tôi cảm thấy tốt hơn khi tôi nhận ra đó không phải là điều tôi làm sai và nghĩ rằng những người khác cũng có thể thấy nó hữu ích.
Sam

Điều này đã khắc phục nhiều hơn là chỉ cảnh báo ajax. Tôi nhận được tất cả các loại liên kết trình duyệt lộn xộn trong bảng điều khiển javascript sử dụng lõi asp.
JoeBass

Có ai biết liên kết trình duyệt là gì và tại sao nó lại đưa ra cảnh báo như vậy không?
gideon

15

Điều này đã xảy ra với tôi bằng cách có một liên kết đến js bên ngoài bên ngoài phần đầu ngay trước khi kết thúc phần nội dung. Bạn biết đấy, một trong những điều này:

<script src="http://somesite.net/js/somefile.js">

Nó không liên quan gì đến JQuery.

Bạn có thể sẽ thấy tương tự khi làm điều gì đó như thế này:

var script = $("<script></script>");
script.attr("src", basepath + "someotherfile.js");
$(document.body).append(script);

Nhưng tôi chưa thử nghiệm ý tưởng đó.


Cảnh báo ra đi cho tôi khi tôi lấy ra một dòng như thế này, mà tôi đã không sử dụng anyway: @ Html.Script ( "~ / scripts / apps / appname.js")
MsTapp

10

Nó đã được đề cập như một bình luận của @ henri-chan , nhưng tôi nghĩ nó đáng được quan tâm hơn:

Khi bạn cập nhật nội dung của một phần tử bằng html mới bằng jQuery / javascript và html mới này chứa <script>các thẻ, các thẻ đó được thực thi đồng bộ và do đó gây ra lỗi này. Tương tự với các bảng định kiểu.

Bạn biết điều này đang xảy ra khi bạn thấy (nhiều) tập lệnh hoặc biểu định kiểu đang được tải như XHRtrong cửa sổ bảng điều khiển. (firefox).


3

Không có câu trả lời nào trước đó (tất cả đều đúng) phù hợp với tình huống của tôi: Tôi không sử dụng asynctham số trong jQuery.ajax()và tôi không bao gồm thẻ tập lệnh như một phần của nội dung được trả về như:

<div> 
     SOME CONTENT HERE
</div>
<script src="/scripts/script.js"></script> 

Tình huống của tôi là tôi đang gọi hai yêu cầu AJAX liên tiếp với mục đích cập nhật hai div cùng một lúc:

function f1() {
     $.ajax(...); // XMLHTTP request to url_1 and append result to div_1
}

function f2() {
     $.ajax(...); // XMLHTTP request to url_2 and append result to div_2
}

function anchor_f1(){
$('a.anchor1').click(function(){
     f1();
})
}

function anchor_f2(){
$('a.anchor2').click(function(){
     f2();
});
}

// the listener of anchor 3 the source of problem
function anchor_problem(){
$('a.anchor3').click(function(){
     f1();
     f2();
});
}

anchor_f1();
anchor_f2();
anchor_problem();

Khi tôi nhấp vào a.anchor3, nó sẽ nâng cờ cảnh báo. Tôi đã giải quyết vấn đề bằng cách thay thế f2 gọi bằng click()hàm:

function anchor_problem(){
$('a.anchor_problem').click(function(){
     f1();
     $('a.anchor_f2').click();
});
}

5
Các tập lệnh không được thực thi nếu bạn chèn trực tiếp chúng vào DOM qua innerHTML. Vì vậy, khi bạn gọi .html (), jQuery tìm nạp và thực thi bất kỳ tập lệnh nào có trong phản hồi html một cách đồng bộ.
Henry Chan

@HenryChan, tôi đã cố gắng hiểu bạn nhưng vô ích. Bạn có thể vui lòng giải thích cho tôi bằng những từ đơn giản hơn. Tôi không chèn tập lệnh vào DOM, tôi chỉ chèn HTML và giải pháp này vẫn là giải pháp hiệu quả duy nhất đối với tôi. Cảm ơn trước
Adib Aroui

2
@whitelettersinblankpapers Tôi nghĩ ý của anh ấy là: bên trong lệnh gọi lại ajax của bạn, nếu nội dung mà bạn thêm vào "div" của mình chứa các thẻ script, thì chúng sẽ được gọi đồng bộ.
Haitham Sweilem

1

Nơi làm việc của tôi: Tôi sử dụng các yêu cầu không đồng bộ kết xuất mã vào bộ đệm. Tôi có một vòng lặp kiểm tra bộ đệm mỗi giây. Khi kết xuất đã đến bộ đệm, tôi thực thi mã. Tôi cũng sử dụng thời gian chờ. Đối với người dùng cuối, trang hoạt động như thể các yêu cầu đồng bộ sẽ được sử dụng.


bạn có một chút mã cho tôi biết làm thế nào để đạt được điều này?
ZerO một

5
@runback, không thể sử dụng lệnh gọi lại done ()? $.ajax({ url : "example.com", async : true /* default is true */ }).done(function(response){ // Process the dump }) Hy vọng tôi đã không đọc sai bất cứ điều gì.
pravin

0

Nếu chúng tôi tải tập lệnh ở chế độ xem một phần thì vấn đề này sẽ xảy ra

  1. Tôi đã xóa tập lệnh ở chế độ xem một phần và chuyển sang chế độ xem chính.

Giải pháp này hoạt động tốt đối với tôi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.