jQuery เลิกใช้ XMLHTTPRequest แบบซิงโครนัสแล้ว


119

เช่นเดียวกับคนอื่น ๆ เว็บไซต์ของฉันใช้ jQuery เมื่อฉันเปิดเครื่องมือสำหรับนักพัฒนาฉันเห็นคำเตือนที่ระบุว่า XMLHTTPRequest คือ

เลิกใช้งานเนื่องจากผลกระทบที่เป็นอันตรายต่อประสบการณ์ของผู้ใช้ปลายทาง

ฉันอ่านบางส่วนของเอกสารแต่มันค่อนข้างเป็นเทคนิค มีใครสามารถอธิบายผลของการเปลี่ยนจาก XMLHTTPRequest เป็น WHATWG ได้หรือไม่? กล่าวว่าเกิดขึ้นในปี 2555

นอกจากนี้เอกสารยังระบุด้วยว่า Synchronous XMLHttpRequest ภายนอกคนงานกำลังอยู่ในขั้นตอนการลบออกจากแพลตฟอร์มเว็บเมื่อเป็นเช่นนั้นหากตัวแทนผู้ใช้มีพวกเขาในบริการพวกเขาจำเป็นต้องแก้ไขโค้ดที่มีอยู่หรือไม่


2
คุณต้องพูดถึง XMLHTTPRequests แบบซิงโครนัสไม่ใช่แบบอะซิงโครนัสถูกต้องหรือไม่? คำขอแบบซิงโครนัสนั้นแย่มากสำหรับประสบการณ์ของผู้ใช้ปลายทาง (พวกเขาจะล็อกเบราว์เซอร์ระหว่างการร้องขอ) และโดยทั่วไปไม่ควรใช้
jfriend00

2
ระบุรหัสที่เรียกสิ่งนี้
charlietfl

3
นี่คือข้อความที่เป็นปัญหาหรือไม่ XMLHttpRequest แบบซิงโครนัสบนเธรดหลักเลิกใช้งานเนื่องจากผลกระทบที่เป็นอันตรายต่อประสบการณ์ของผู้ใช้ปลายทาง
Qantas 94 Heavy

1
jQuery ให้คำเตือนสำหรับคำขอซิงโครนัสเท่านั้นใช่หรือไม่ คุณจงใจส่งคำขอแบบซิงโครนัสหรือไม่? หากเป็นเช่นนั้นวิธีแก้ปัญหาคือการจัดโครงสร้างโค้ดของคุณให้ทำงานกับคำขอแบบอะซิงโครนัสซึ่งคุณควรทำต่อไปเพราะมันดีกว่ามากจากมุมมองของผู้ใช้
nnnnnn

1
ฉันเคยเห็นการตั้งค่าสถานะนั้นไม่เพียง แต่ในเว็บไซต์ของฉันเท่านั้นฉันเคยเห็นธงอื่น ๆ เช่น Youtube ด้วย เกี่ยวกับข้อกำหนดข้อกำหนดของรหัสของฉันควรเป็นไปตามข้อกำหนดของ W3C หรือ WHATWG หรือไม่ , การอ้างอิงฉันไม่ต้องการถามในเธรดหลักเพราะมันจะถูกตั้งค่าสถานะว่าเป็นเรื่องของความคิดเห็นฉันเดา @ Qantas94Heavy
Edd

คำตอบ:


136

เพื่อหลีกเลี่ยงคำเตือนนี้อย่าใช้:

async: false

ในทุกการ$.ajax()โทรของคุณ นี่เป็นคุณลักษณะเดียวXMLHttpRequestที่เลิกใช้งานแล้ว

ค่าเริ่มต้นคือasync: trueดังนั้นหากคุณไม่เคยใช้ตัวเลือกนี้เลยโค้ดของคุณจะปลอดภัยหากคุณลักษณะนี้ถูกลบออกไปจริงๆ

อย่างไรก็ตามมันอาจจะไม่เป็นเช่นนั้น - อาจถูกลบออกจากมาตรฐาน แต่ฉันพนันได้เลยว่าเบราว์เซอร์จะยังคงให้การสนับสนุนต่อไปอีกหลายปี ดังนั้นหากคุณต้องการ AJAX แบบซิงโครนัสด้วยเหตุผลบางประการคุณสามารถใช้async: falseและเพิกเฉยต่อคำเตือนได้ แต่มีเหตุผลที่ดีว่าทำไม AJAX แบบซิงโครนัสจึงถือว่าเป็นรูปแบบที่ไม่ดีดังนั้นคุณควรพยายามหาทางหลีกเลี่ยง และคนที่เขียนแอปพลิเคชั่น Flash อาจไม่เคยคิดว่ามันจะหายไปเช่นกัน แต่มันอยู่ในขั้นตอนการยุติ

โปรดสังเกตว่าFetchAPI ที่แทนที่XMLHttpRequestไม่มีแม้แต่ตัวเลือกซิงโครนัส


9
นี่คือคำเตือนของ jQuery แล้ว ฉันสามารถเพิกเฉยได้หรือไม่? ฉันไม่ใช้การโทรแบบซิงโครนัสไปยังเซิร์ฟเวอร์ ด้านความสมบูรณ์แบบของฉันไม่ชอบมีคำเตือนเลย
จอร์แดน

2
@ Jordan ฉันคิดว่าคำเตือนมาจากเบราว์เซอร์ไม่ใช่ jQuery มันจะเกิดขึ้นทุกครั้งที่คุณพยายามใช้ AJAX แบบซิงโครนัส หากคุณใช้ jQuery สิ่งนั้นจะเกิดขึ้นก็ต่อเมื่อคุณระบุตัวเลือก$.ajaxนั้นเป็น
Barmar

2
ฉันกำลังใช้งานอยู่jquery.i18n.properties.jsแต่ไม่มีการโทรอย่างชัดเจนที่อยู่เคียงข้างฉันถึง$.ajax.อาจจะเป็นการภายใน แต่ไม่แน่ใจ
Manuel Jordan

1
ปลั๊กอินนั้นโหลดบันเดิลทรัพยากรจาก.propertiesไฟล์ อาจใช้ AJAX แบบซิงโครนัสเพื่อทำสิ่งนี้ทำให้เกิดคำเตือนนี้
Barmar

1
การตั้งค่า @ManuelJordan async: true ใน i18n อาจทำให้เกิดความล่าช้าในการแสดงสตริงที่แสดงในเพจของคุณในการเชื่อมต่อที่ช้า Showin แทนรหัสสตริง
Siyon DP

62

คำตอบที่ยอมรับนั้นถูกต้อง แต่ฉันพบสาเหตุอื่นหากคุณกำลังพัฒนาภายใต้ ASP.NET ด้วย Visual Studio 2013 ขึ้นไปและแน่ใจว่าคุณไม่ได้ทำคำขอ ajax แบบซิงโครนัสหรือกำหนดสคริปต์ใด ๆ ผิดที่

วิธีแก้ปัญหาคือปิดใช้งานคุณสมบัติ "Browser Link" โดยยกเลิกการเลือก "Enable Browser Link" ในเมนูแบบเลื่อนลงของแถบเครื่องมือ VS ที่ไอคอนรีเฟรชเล็ก ๆ ชี้ตามเข็มนาฬิกา ทันทีที่คุณดำเนินการนี้และโหลดหน้าซ้ำคำเตือนควรหยุดลง!

ปิดการใช้งานลิงค์เบราว์เซอร์

สิ่งนี้ควรเกิดขึ้นในขณะที่ดีบักในเครื่องเท่านั้น แต่ก็ยังดีที่ทราบสาเหตุของคำเตือน


สามารถปิดการใช้งานได้web.configโดยเพิ่ม<add key="vs:EnableBrowserLink" value="false" />ภายใน<appSettings>ตามที่อธิบายไว้ที่นี่: poconosystems.com/software-development/… .
Beel

3
ฉันคิดว่านี่เป็นข้อเสนอแนะที่ไม่ดีเพียงเพื่อรับข้อความเตือนในคอนโซล ปิดเบราว์เซอร์ลิงค์และกำจัดการเพิ่มประสิทธิภาพการทำงานที่เบราว์เซอร์ลิงค์เพิ่มเพื่อที่คุณจะไม่เห็นข้อความเตือนในคอนโซลเบราว์เซอร์? ดีกว่าที่จะส่งข้อบกพร่องกับ microsoft และได้รับการแก้ไข
coding4fun

4
@ coding4fun ขอบคุณสำหรับความคิดเห็น; คุณสามารถแจ้งข้อบกพร่องกับ Microsoft ได้อย่างอิสระ ฉันไม่ได้บอกว่าคุณควรปิดเบราว์เซอร์ลิงค์ คำตอบของฉันถูกต้องเกี่ยวกับสาเหตุของคำเตือนนี้ในบางกรณีและการแยกแยะบางสิ่งในโค้ดของคุณเองก็มีประโยชน์ โดยส่วนตัวแล้วฉันรู้สึกดีขึ้นเมื่อรู้ว่ามันไม่ใช่สิ่งที่ฉันทำผิดและคิดว่าคนอื่น ๆ อาจคิดว่ามันเป็นประโยชน์เช่นกัน
แซม

สิ่งนี้ได้รับการแก้ไขมากกว่าคำเตือนของ ajax ฉันมีลิงค์ของเบราว์เซอร์ทุกชนิดในคอนโซล javascript โดยใช้ asp core
JoeBass

ใครจะรู้ว่าลิงค์เบราว์เซอร์คืออะไรและเหตุใดจึงลงท้ายด้วยการแจ้งเตือนเช่นนี้?
gideon

15

สิ่งนี้เกิดขึ้นกับฉันโดยมีลิงก์ไปยัง js ภายนอกที่อยู่ด้านนอกหัวก่อนส่วนท้ายของส่วนเนื้อหา คุณรู้หรือไม่ว่าหนึ่งในนั้น:

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

ไม่มีส่วนเกี่ยวข้องกับ JQuery

คุณอาจจะเห็นสิ่งเดียวกันกับการทำสิ่งนี้:

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

แต่ฉันยังไม่ได้ทดสอบความคิดนั้น


คำเตือนหายไปสำหรับฉันเมื่อฉันลบบรรทัดแบบนี้ซึ่งฉันไม่ได้ใช้อยู่แล้ว: @ Html.Script ("~ / scripts / apps / appname.js")
MsTapp

10

มันถูกกล่าวถึงเป็นความคิดเห็นของ@ henri-chanแต่ฉันคิดว่ามันสมควรได้รับความสนใจมากกว่านี้:

เมื่อคุณอัปเดตเนื้อหาขององค์ประกอบด้วย html ใหม่โดยใช้ jQuery / javascript และ html ใหม่นี้มี<script>แท็กสิ่งเหล่านี้จะถูกดำเนินการพร้อมกันและทำให้เกิดข้อผิดพลาดนี้ เช่นเดียวกันกับสไตล์ชีต

คุณจะรู้ว่าสิ่งนี้เกิดขึ้นเมื่อคุณเห็น (หลาย) สคริปต์หรือสไตล์ชีทถูกโหลดXHRในหน้าต่างคอนโซล (Firefox)


3

ไม่มีคำตอบก่อนหน้านี้ (ซึ่งทั้งหมดถูกต้อง) ที่เหมาะกับสถานการณ์ของฉัน: ฉันไม่ได้ใช้asyncพารามิเตอร์ในjQuery.ajax()และฉันไม่รวมแท็กสคริปต์เป็นส่วนหนึ่งของเนื้อหาที่ถูกส่งกลับเช่น:

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

สถานการณ์ของฉันคือฉันกำลังเรียกคำขอ AJAX สองรายการติดต่อกันโดยมีจุดประสงค์เพื่ออัปเดตสอง div ในเวลาเดียวกัน:

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();

เมื่อฉันคลิกa.anchor3มันจะขึ้นธงเตือนฉันแก้ไขปัญหาโดยการแทนที่ f2 เรียกใช้ด้วยclick()ฟังก์ชัน:

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

5
สคริปต์จะไม่ทำงานหากคุณแทรกลงใน DOM โดยตรงผ่านทาง innerHTML ดังนั้นเมื่อคุณเรียก. html () jQuery จะดึงข้อมูลและเรียกใช้สคริปต์ใด ๆ ที่รวมอยู่ในการตอบกลับ html พร้อมกัน
Henry Chan

@HenryChan ฉันพยายามเข้าใจคุณ แต่ก็ไม่มีประโยชน์ คุณช่วยอธิบายให้ฉันเข้าใจด้วยคำพูดที่ง่ายกว่านี้ได้ไหม ฉันไม่ได้แทรกสคริปต์ลงใน DOM ฉันใส่เฉพาะ HTML และยังคงเป็นโซลูชันเดียวที่ใช้ได้สำหรับฉัน ขอบคุณล่วงหน้า
Adib Aroui

2
@whitelettersinblankpapers ฉันคิดว่าเขาหมายถึง: ภายในการเรียกกลับของ ajax ของคุณหากเนื้อหาที่คุณต่อท้าย "div" ของคุณมีแท็กสคริปต์สิ่งเหล่านี้จะถูกเรียกพร้อมกัน
Haitham Sweilem

1

วิธีการทำงานของฉัน: ฉันใช้คำขอแบบอะซิงโครนัสที่ทิ้งรหัสไปยังบัฟเฟอร์ ฉันมีลูปตรวจสอบบัฟเฟอร์ทุกวินาที เมื่อดัมพ์มาถึงบัฟเฟอร์ฉันรันโค้ด ฉันยังใช้การหมดเวลา สำหรับผู้ใช้ปลายทางเพจจะทำงานเหมือนกับว่าจะใช้การร้องขอซิงโครนัส


คุณมีรหัสเล็กน้อยสำหรับฉันที่จะรู้วิธีบรรลุเป้าหมายนี้หรือไม่?
ZerOne

5
@runback ไม่สามารถใช้การโทรกลับที่ทำ () สัญญาได้หรือไม่? $.ajax({ url : "example.com", async : true /* default is true */ }).done(function(response){ // Process the dump }) หวังว่าฉันจะไม่ได้อ่านอะไรผิด
pravin

0

หากเราโหลดสคริปต์ในมุมมองบางส่วนปัญหานี้จะตามมา

  1. ฉันลบสคริปต์ในมุมมองบางส่วนและย้ายไปที่มุมมองหลัก

วิธีนี้ใช้ได้ผลดีสำหรับฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.