it-swarm-ko.tech

Drupal.behaviors의 순서를 어떻게 제어 할 수 있습니까?

모듈 X의 JavaScript 코드가 모듈 Y의 코드가 실행 된 후에 만 ​​실행되기를 원합니다. 가장 좋은 방법은 무엇입니까?

9
cam8001

Drupal 7에서 사용하는 JavaScript 코드는 다음과 같습니다.

Drupal.attachBehaviors = function (context, settings) {
  context = context || document;
  settings = settings || Drupal.settings;
  // Execute all of them.
  $.each(Drupal.behaviors, function () {
    if ($.isFunction(this.attach)) {
      this.attach(context, settings);
    }
  });
};

Drupal 6은 비슷한 코드를 사용합니다.

Drupal.attachBehaviors = function(context) {
  context = context || document;
  if (Drupal.jsEnabled) {
    // Execute all of them.
    jQuery.each(Drupal.behaviors, function() {
      this(context);
    });
  }
};

JavaScript가 객체/배열 속성이 항상 추가 된 순서와 동일한 순서로 순회하도록 보장하는 경우 값은 jQuery.each()에서 삽입 된 순서와 동일한 순서로 두 번째 매개 변수로 사용되는 함수로 전달됩니다. 배열이 첫 번째 매개 변수로 전달되었습니다.
이것은 Drupal.behaviors에 삽입 된 첫 번째 동작이 먼저 실행됨을 의미합니다.
이 경우 모듈에서 정의한 동작을 먼저 실행하려면 더 가벼운 가중치를 사용할 수 있습니다. 다른 것들보다 먼저 실행하려면 모듈 무게를 -50으로 설정해야합니다. 다른 값들도 작동 할 수 있습니다. Drupal 7, drupal_add_js () 를 사용하는 경우 가중치를 JavaScript 코드에 연결할 수 있습니다. 가중치가있는 JavaScript 코드는 HTML 출력에서 ​​먼저 나타납니다. Drupal 6, 생각으로는 가능하지 않습니다.

JavaScript는 속성이 추가 된 순서대로 순회한다고 보장하지 않습니다. 이것은 다른 JavaScript 구현은 다른 순서를 사용하여 동일한 속성을 제공한다는 것을 의미합니다. 또한 동일한 브라우저의 다른 버전에서 동일한 순서가 변경 될 수 있음을 의미합니다.

5
kiamlaluno

행동 가중치 모듈을 사용하십시오.
(제작 현장에서 사용하기 전에 테스트를 해주십시오)

이 모듈은 행동에 가중치를 부여 할 수 있으며 drupal.attachBehaviors 가중치를 존중하는 맞춤 구현을 사용합니다.


다른 답변에서 제안한 것처럼 모듈 무게 대신에 왜 그렇지 않습니까?

  • 모듈 무게는 상당히 무거운 도구입니다. 모듈의 모든 후크 구현 (php) 및 동작 (js)에 적용되는 반면 하나의 단일 동작에만 관심이 있습니다.
  • js 객체의 속성 순서는 사양에 의해 보장되지 않습니다 (거의 모든 브라우저에서 예상대로 구현되지만).

보다
자바 스크립트를 반복 할 때 자바 스크립트 객체의 필드 순서가 전복 가능합니까?
요소 순서-자바 스크립트에서 (… in…) 루프 .

5
donquixote

Drupal 6-

이식성이 필요하지 않은 간단한 해결책은 마지막으로 실행하려는 JS를 테마 template.php 파일에 넣는 것입니다. drupal_add_js 테마는 항상 모듈 다음에 호출됩니다.

이식성이 뛰어나야 할 경우 drupal 6)의 "가장 깨끗한"솔루션은 PHP를 사용하는 모듈과 무게가 다른 새 모듈을 추가하는 것입니다. 동일한 폴더에서 첫 번째 모듈을 첫 번째 모듈에 종속되게하고 설치/업데이트 후크에서 가중치를 조정하십시오.

0
mirzu