Puncte:0

Executați un comportament o singură dată pe încărcare de pagină

drapel in

Trecând de la Dupal 7 la 9, am o problemă cu comportamentele javascript care sunt apelate de mai multe ori. În consola browserului, când încarc o pagină, văd:

test de proces pentru [obiect HTMLDocument] pet_guides.js:27:15
test de proces pentru [obiect HTMLUListElement] pet_guides.js:27:15
test de proces pentru https://whiskerdocs-local-d9.pglatz.com/portal/config/user-interface/shortcut/manage/default/customize pet_guides.js:27:15
test de proces pentru [obiect HTMLUListElement] 2 pet_guides.js:27:15
test de proces pentru [obiect HTMLElement] 2 pet_guides.js:27:15

âAcesta este codul meu:

  Drupal.behaviors.guideTest = {
    atașați: funcție (context, setări) {
      console.log('test de proces pentru ' + context);
    }
  };

Mă uit la documentele de pe drupal.org și încă nu are sens pentru mine. Ceea ce vreau cu adevărat să fac este unde console.log să ruleze o buclă ca

  $.each($('.section-wrapper'), function(index) {
    $(this).addClass('foo');
  });

Care este sintaxa corectă pentru a utiliza o dată () pentru a face ca aceasta să se execute o singură dată? Dacă aș avea un comportament cu mai multe bucle, există o modalitate de a folosi un singur wrapper once() pentru toate, sau fiecare aspect ar avea nevoie de propriul său aspect? Am crezut că a folosi un comportament este ca și cum ai folosi jQuery(document).ready(funcție ($), deci codul ar fi executat numai când DOM-ul a fost încărcat complet și nu înțeleg de ce este apelat pentru cinci contexte diferite.

Puncte:1
drapel ru

Am crezut că a folosi un comportament este ca și cum ai folosi jQuery(document).ready(funcție ($), deci codul ar fi doar executat când DOM-ul a fost încărcat complet și nu înțeleg de ce este fiind chemat pentru cinci contexte diferite.

Nu. Dacă ar fi așa, comportamentele ar fi inutile.

  1. Comportamentele sunt legate de un singur nod DOM, deoarece în Drupal nu știți când acest nod DOM este redat/injectat în pagină (rețineți BigPipe, Ajax Views, coșuri de cumpărături Ajax etc).
  2. Comportamentele sunt declanșate prima dată după DOM gata și, potențial, foarte des după aceea, când noi părți parțiale sunt injectate în DOM. Pentru a evita duplicarea ascultătorilor de evenimente pe nodurile preexistente, mai vechi folosesc o singura data-funcţie.
  3. The context doar face mai rapidă dezafectarea și reatașarea comportamentelor, dacă omiteți contextul, orice injecție a unui nod DOM trebuie să caute în întregul document comportamente potențiale și nu doar în contextul parțialului nou injectat.
  4. Echivalentul lui $(document).gata() ar fi sunat $(document, context).once() în interiorul unui comportament, deoarece documentul-context este transmis o singură dată.

Codul dvs. de buclă ar arăta astfel:

Drupal.behaviors.myCustomBehavior= {
  atașați: funcție (context, setări) {
    $('.section-wrapper', context).once('myCustomOnceId').each( function(index) {
      $(this).addClass('foo');
    });
  }
};

Deci, de ex. dacă ale tale <div class="section-wrapper"> se află într-un rând de vizualizare infinită de defilare, fiecare <div> va primi exact unul foo clasa, indiferent când este încărcată.

Continuând exemplul de mai sus cu vizualizarea de defilare infinită și clasa „foo”, după 2 injecții Ajax...

...fără a folosi un comportament, ai ajunge cu ceva de genul
<div class="section-wrapper foo"></div><div class="section-wrapper"></div><div class="section-wrapper"></div>

...folosind un comportament fără o singura data, ai ajunge cu ceva de genul
<div class="section-wrapper foo foo foo"></div><div class="section-wrapper foo foo"></div><div class="section-wrapper foo"></div>

pglatz avatar
drapel in
Mulțumesc pentru explicația clară și pentru exemple.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.