Score:0

ดำเนินการพฤติกรรมเพียงครั้งเดียวต่อการโหลดหน้าเว็บ

ธง in

ย้ายจาก Dupal 7 เป็น 9 ฉันมีปัญหากับพฤติกรรมของจาวาสคริปต์ที่ถูกเรียกหลายครั้ง ในคอนโซลของเบราว์เซอร์ เมื่อฉันโหลดหน้าเว็บ ฉันเห็น:

ดำเนินการทดสอบ [object HTMLDocument] pet_guides.js:27:15
ทดสอบกระบวนการสำหรับ [วัตถุ HTMLUListElement] pet_guides.js:27:15
ทดสอบกระบวนการสำหรับ https://whiskerdocs-local-d9.pglatz.com/portal/config/user-interface/shortcut/manage/default/customize pet_guides.js:27:15
ทดสอบกระบวนการสำหรับ [วัตถุ HTMLUListElement] 2 pet_guides.js:27:15
ทดสอบกระบวนการสำหรับ [วัตถุ HTMLElement] 2 pet_guides.js:27:15

âนี่คือรหัสของฉัน:

  Drupal.behaviors.guideTest = {
    แนบ: ฟังก์ชัน (บริบท การตั้งค่า) {
      console.log('กระบวนการทดสอบสำหรับ' + บริบท);
    }
  };

ฉันกำลังดูเอกสารบน drupal.org และมันยังไม่สมเหตุสมผลสำหรับฉัน สิ่งที่ฉันต้องการจะทำคือที่ console.log in เพื่อเรียกใช้ลูป

  $.each($('.section-wrapper'), ฟังก์ชัน (ดัชนี) {
    $(นี้).addClass('foo');
  });

ไวยากรณ์ที่ถูกต้องในการใช้ a Once() เพื่อให้ดำเนินการเพียงครั้งเดียวคืออะไร หากฉันมีพฤติกรรมที่มีมากกว่าหนึ่งลูป มีวิธีใดบ้างที่จะใช้การห่อครั้งเดียวครั้งเดียว () ล้อมรอบพวกเขาทั้งหมด หรือแต่ละรูปลักษณ์จะต้องมีรูปแบบของตัวเอง ฉันคิดว่าการใช้พฤติกรรมก็เหมือนการใช้ jQuery(เอกสาร).พร้อม(ฟังก์ชั่น ($)ดังนั้นโค้ดจะถูกเรียกใช้เมื่อโหลด DOM เต็มแล้วเท่านั้น และไม่เข้าใจว่าทำไมจึงถูกเรียกใช้สำหรับบริบทที่แตกต่างกันห้ารายการ

Score:1
ธง ru

ฉันคิดว่าการใช้พฤติกรรมก็เหมือนการใช้ jQuery(document).ready(function ($) ดังนั้นรหัสจะเป็น ดำเนินการเมื่อโหลด DOM เต็มแล้ว และไม่เข้าใจว่าทำไมจึงเป็นเช่นนี้ ถูกเรียกสำหรับบริบทที่แตกต่างกันห้าประการ

ไม่ ถ้าเป็นแบบนี้ พฤติกรรมคงไร้ความหมาย

  1. ลักษณะการทำงานจะเชื่อมโยงกับโหนด DOM เดียว เนื่องจากใน Drupal คุณไม่รู้ว่าโหนด DOM นี้ถูกเรนเดอร์/แทรกในหน้าเมื่อใด (โปรดจำไว้ว่า BigPipe, Ajax Views, ตะกร้าสินค้า Ajax เป็นต้น)
  2. ลักษณะการทำงานจะเริ่มทำงานครั้งแรกหลังจาก DOM พร้อม และบ่อยครั้งหลังจากนั้นเมื่อส่วนใหม่ถูกแทรกเข้าไปใน DOM เพื่อหลีกเลี่ยงการฟังเหตุการณ์ที่ซ้ำกันบนโหนดที่มีอยู่แล้ว โหนดที่เก่ากว่าจะใช้ ครั้งหนึ่ง-การทำงาน.
  3. เดอะ บริบท เพียงแค่ทำให้การแยกออกและแนบลักษณะการทำงานใหม่เร็วขึ้น หากคุณละเว้นบริบท การฉีดโหนด DOM ใดๆ จะต้องค้นหาทั้งเอกสารเพื่อหาลักษณะการทำงานที่เป็นไปได้ ไม่ใช่เฉพาะในบริบทของส่วนแทรกที่เพิ่งแทรกเข้าไปใหม่
  4. เท่ากับ $(เอกสาร).พร้อม() กำลังจะโทร $(เอกสาร, บริบท).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>

pglatz avatar
in flag
ขอบคุณสำหรับคำอธิบายและตัวอย่างที่ชัดเจน

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา