jQuery.active ฟังก์ชัน


102

ฉันพยายามค้นหาข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชัน jQuery ต่อไปนี้:

jQuery.active

มีการอธิบายเพื่อทดสอบจำนวนการเชื่อมต่อที่ใช้งานอยู่กับเซิร์ฟเวอร์และจะประเมินค่าจริงเมื่อจำนวนการเชื่อมต่อเป็นศูนย์

ฉันไม่พบข้อมูลเกี่ยวกับฟังก์ชันนี้ในไซต์ jQuery และสงสัยว่ามีใครรู้บ้างว่าฉันทำได้

คำตอบ:


163

นี่คือตัวแปร jQuery ที่ใช้ภายใน แต่ไม่มีเหตุผลที่จะซ่อนดังนั้นจึงมีให้ใช้ เพียงแค่หัวขึ้นมันจะกลายเป็นjquery.ajax.activeรุ่นถัดไป ไม่มีเอกสารประกอบเนื่องจากมีการเปิดเผยแต่ไม่ได้อยู่ใน API อย่างเป็นทางการมีหลายสิ่งหลายอย่างที่เป็นเช่นนี้เช่นjQuery.cache(ที่ไปทั้งหมดjQuery.data())

ฉันคาดเดาที่นี่จากการใช้งานจริงในไลบรารีดูเหมือนว่าจะมีไว้เพื่อรองรับโดยเฉพาะ$.ajaxStart()และ$.ajaxStop()(ซึ่งฉันจะอธิบายเพิ่มเติม) แต่พวกเขาสนใจว่าจะเป็น 0 หรือไม่เมื่อคำขอเริ่มหรือหยุด แต่เนื่องจากไม่มีเหตุผลที่จะซ่อนมันจึงเปิดเผยให้คุณเห็นจำนวนคำขอ AJAX พร้อมกันที่เกิดขึ้นจริงในปัจจุบัน


เมื่อ jQuery เริ่มคำขอ AJAX สิ่งนี้จะเกิดขึ้น :

if ( s.global && ! jQuery.active++ ) {
  jQuery.event.trigger( "ajaxStart" );
}

นี่คือสาเหตุที่ทำให้$.ajaxStart()เหตุการณ์เริ่มทำงานจำนวนการเชื่อมต่อเพิ่งเปลี่ยนจาก 0 เป็น 1 ( jQuery.active++ไม่ใช่ 0 หลังจากนี้และ!0 == true) ซึ่งหมายความว่าคำขอแรกพร้อมกันในปัจจุบันเริ่มต้นขึ้น สิ่งเดียวกันเกิดขึ้นที่ปลายอีกด้านหนึ่ง เมื่อคำขอ AJAX หยุดลง (เนื่องจากมีการbeforeSendยกเลิกผ่านreturn falseหรือฟังก์ชันการโทร ajax completeทำงาน ):

if ( s.global && ! --jQuery.active ) {
  jQuery.event.trigger( "ajaxStop" );
}

นี่คือสาเหตุที่ทำให้$.ajaxStop()เหตุการณ์เริ่มทำงานจำนวนคำขอลดลงเหลือ 0 ซึ่งหมายความว่าการโทร AJAX พร้อมกันครั้งสุดท้ายเสร็จสิ้น ตัวจัดการ AJAX ระดับโลกคนอื่น ๆ ก็ยิงเข้ามาที่นั่นตลอดทางเช่นกัน


2
ฉันเห็นมันอธิบายไว้ในหนังสือ jQuery Novice to Ninja (2010)
jmav

@Nick: ตามคำอธิบายของคุณของ. jaxStop จะถูกดำเนินการหลังจากการโทร ajax เสร็จสิ้นทุกครั้ง แต่จะถูกเรียกหากการโทรทั้งหมดของ ajax เสร็จสมบูรณ์ คุณช่วยแก้ไขฉันได้ไหมถ้าฉันผิด
Kishore Relangi

27
ตอนนี้เรียกว่า$.activebtw
Ryan Bigg

4
@RyanBigg ไม่ใช่$แค่นามแฝงสำหรับjQueryทั้งคู่ยังคงเป็นจริง?
arxpoetica

2
@ArxPoetica เท่านั้นถ้าคุณกำลังใช้งานโดยไม่ต้องjQuery noConflict
Ryan Bigg

19

สำหรับใครก็ตามที่พยายามใช้ jQuery.active กับคำขอ JSONP (เช่นฉัน) คุณจะต้องเปิดใช้งานด้วยสิ่งนี้:

jQuery.ajaxPrefilter(function( options ) {
    options.global = true;
});

โปรดทราบว่าคุณจะต้องหมดเวลาสำหรับคำขอ JSONP ของคุณเพื่อตรวจจับความล้มเหลว

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