ฉันคิดว่าการใช้พฤติกรรมก็เหมือนการใช้
jQuery(document).ready(function ($) ดังนั้นรหัสจะเป็น
ดำเนินการเมื่อโหลด DOM เต็มแล้ว และไม่เข้าใจว่าทำไมจึงเป็นเช่นนี้
ถูกเรียกสำหรับบริบทที่แตกต่างกันห้าประการ
ไม่ ถ้าเป็นแบบนี้ พฤติกรรมคงไร้ความหมาย
- ลักษณะการทำงานจะเชื่อมโยงกับโหนด DOM เดียว เนื่องจากใน Drupal คุณไม่รู้ว่าโหนด DOM นี้ถูกเรนเดอร์/แทรกในหน้าเมื่อใด (โปรดจำไว้ว่า BigPipe, Ajax Views, ตะกร้าสินค้า Ajax เป็นต้น)
- ลักษณะการทำงานจะเริ่มทำงานครั้งแรกหลังจาก DOM พร้อม และบ่อยครั้งหลังจากนั้นเมื่อส่วนใหม่ถูกแทรกเข้าไปใน DOM เพื่อหลีกเลี่ยงการฟังเหตุการณ์ที่ซ้ำกันบนโหนดที่มีอยู่แล้ว โหนดที่เก่ากว่าจะใช้
ครั้งหนึ่ง-การทำงาน.
- เดอะ
บริบท เพียงแค่ทำให้การแยกออกและแนบลักษณะการทำงานใหม่เร็วขึ้น หากคุณละเว้นบริบท การฉีดโหนด DOM ใดๆ จะต้องค้นหาทั้งเอกสารเพื่อหาลักษณะการทำงานที่เป็นไปได้ ไม่ใช่เฉพาะในบริบทของส่วนแทรกที่เพิ่งแทรกเข้าไปใหม่
- เท่ากับ
$(เอกสาร).พร้อม() กำลังจะโทร $(เอกสาร, บริบท).once() ภายในพฤติกรรม เนื่องจากบริบทเอกสารถูกส่งผ่านเพียงครั้งเดียว
รหัสลูปของคุณจะมีลักษณะดังนี้:
Drupal.behaviors.myCustomBehavior= {
แนบ: ฟังก์ชัน (บริบท การตั้งค่า) {
$('.section-wrapper', context).once('myCustomOnceId').each( ฟังก์ชัน(ดัชนี) {
$(นี้).addClass('foo');
});
}
};
เช่น ถ้าคุณ <div class="section-wrapper"> อยู่ภายในแถวของมุมมองการเลื่อนที่ไม่สิ้นสุด ทุกๆ <div> จะได้รับหนึ่ง ฟู คลาสไม่ว่าจะโหลดเมื่อใด
ดำเนินการต่อตัวอย่างด้านบนด้วยมุมมองการเลื่อนที่ไม่มีที่สิ้นสุดและคลาส "foo" หลังจากการฉีด Ajax 2 ครั้ง...
...หากไม่ใช้พฤติกรรม คุณจะจบลงด้วยสิ่งที่ต้องการ
<div class="section-wrapper foo"></div><div class="section-wrapper"></div><div class="section-wrapper"></div>
...ใช้พฤติกรรมที่ไม่มี ครั้งหนึ่งคุณจะจบลงด้วยสิ่งที่ต้องการ
<div class="section-wrapper foo foo foo"></div><div class="section-wrapper foo foo"></div><div class="section-wrapper foo"></div>