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


9

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

답변:


5

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 구현은 다른 순서를 사용하여 동일한 속성을 제공한다는 것을 의미합니다. 또한 동일한 브라우저의 다른 버전에서 동일한 순서가 변경 될 수 있음을 의미합니다.


한 번은 일부 모듈에서 사용 된 무게가 나열된 페이지를 찾았습니다. 해당 페이지의 URL을 기억하지 못하고 페이지에 특정 모듈 만 포함되어 있거나 철저하지 않은 경우 해당 페이지를 찾으면 여기에 링크를보고합니다.
kiamlaluno

1
항상 시스템 테이블에서 체크인 할 수 있습니다. – 시도select name, weight from system where type = 'module' order by weight ASC, name
cam8001

불행히도 다른 모듈 (vertical_tabs) PHP보다 먼저 실행하려면 모듈의 PHP (mymodule)가 필요하지만 vertical_tab의 js 후에는 mymodule의 JS가 실행되어야합니다 . 행동에 가중치를 부여하는 순수 자바 스크립트 기반 방법이 있습니까?
cam8001

@ cam8001 : 알고 있지만 모듈에서 사용하는 더 가벼운 무게를 알기 위해서는 모든 모듈을 설치해야합니다. 내가 찾은 페이지에는 모듈 가중치가 나열되어 있으며, 모든 모듈 전에 실행되도록 모듈에 할당해야하는 가중치를 알아야 할 때 유용 할 수 있습니다. 나는 당신이 단순히 매우 가벼운 무게를 사용할 수는 있지만 필요한 것보다 가벼운 무게를 사용할 것이라고 알고 있습니다.
kiamlaluno

@ cam8001 :이 경우 포함 된 개체의 순서를 변경하는 것 외에는 수행하려는 작업을 수행 할 수있는 방법이 없습니다 Drupal.behaviors. 내가보고 $.each(Drupal.behaviors)했듯이 식별자를 기준으로하지 않고 삽입 된 것과 동일한 순서로 객체를 나열합니다.
kiamlaluno

5

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

이 모듈은 가중치를 비헤이비어에 첨부 한 다음 가중치를 고려한 drupal.attachBehaviors사용자 지정 구현으로 하이재킹 / 대체합니다 .


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

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

참조는
그들을 통해 반복 자바 스크립트 객체 predicatble 필드의 순서인가? 그리고
javascript에서 요소 순서-for (… in…) 루프 .


@kiam, drupal.org에서 모듈을 "행동 가중치"( "bewgt")로 만들면 공동 유지 보수 담당자로 참여 하시겠습니까? 아마도 아주 작은 모듈 일 것입니다. 그러나 다른 것과 함께 제공하는 것보다 낫습니다. D6에 대해 로컬로 샘플 구현이 있는데 작동하는 것 같습니다.
donquixote

방금 해 .. 당신은 여전히 ​​초대합니다 :)
donquixote

drupal.org/node/1302126 - 나는 이것이 :) D8 핵심에있을 것입니다 희망
donquixote

흥미로운 모듈이지만 먼저 모듈 코드를 업데이트해야합니다.이 모듈은 오랫동안 코드 줄을 쓰지 않았습니다. 그 후 새 모듈을 공동 개발할 수 있습니다.
kiamlaluno

사람들은 유스 케이스를 요구하고 있습니다. drupal.org/node/1302126#comment-5911632
donquixote

0

드루팔 6

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

이식성이 뛰어나야하는 경우 drupal 6의 "가장 깨끗한"솔루션은 PHP를 사용하는 모듈과 무게가 다른 새 모듈을 추가하는 것입니다. 동일한 폴더에 두 개의 모듈이 있고 첫 번째 모듈이 첫 번째 모듈에 종속되도록하고 설치 / 업데이트 후크에서 가중치를 조정할 수도 있습니다. 어느 것도 필요하지 않으므로 설치가 더 쉬워집니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.