Drupal.behaviorsの順序を制御するにはどうすればよいですか?


9

モジュールXのJavaScriptコードを、モジュールYのJavaScriptコードが実行された後にのみ実行したいのですが。これを行うための最良の方法は何ですか?

回答:


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()、最初のパラメーターとして渡された配列に挿入されたのと同じ順序で、2番目のパラメーターとして使用される関数に渡されます。
つまり、最初に挿入された動作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 '31

残念ながら、モジュールのPHP(mymodule)を他のモジュールの(vertical_tabs)PHPの前に実行する必要がありますが、mymoduleのJSはvertical_tabのjsのに実行する必要があります。動作を重み付けするための純粋にJavaScriptベースの方法はありますか?
cam8001 2011年

@ cam8001:私はそれを知っています、しかしそれはあなたがモジュールによって使われるより軽い重量を知るためにあなたがすべてのモジュールをインストールするべきであることを意味するでしょう。私が見つけたページにはモジュールの重みがリストされており、各モジュールの前に実行するモジュールに割り当てる必要がある重みを知る必要がある場合に役立ちます。私は知っている、あなたは単純に非常に軽いウェイトを使用することができるが、あなたはそれが必要とされるよりも軽いウェイトを使用するであろう。
kiamlaluno

@ cam8001:その場合、に含まれるオブジェクトの順序を変更する以外に、実行しようとしていることを達成する方法はありませんDrupal.behaviors。私が報告したよう$.each(Drupal.behaviors)に、オブジェクトは、識別子に基づいてではなく、挿入されたのと同じ順序で一覧表示されます。
kiamlaluno

5

行動の重みモジュールを使用します。
(本番サイトで使用する前に、テストを行ってください)

モジュールは、動作に重みを付けることを可能にしdrupal.attachBehaviors、重みを尊重するカスタム実装でハイジャック/置換します。


他の答えで提案されているように、なぜモジュールの重みではないのですか?

  • モジュールの重量は非常に重いツールです。これは、モジュールのすべてのフック実装(php)と動作(js)に適用されますが、1つの単一の動作のみに関心があります。
  • jsオブジェクト内のプロパティの順序は仕様によって保証されていません(ほとんどすべてのブラウザーで期待どおりに実装されています)。

参照してください
。JavaScriptオブジェクトのフィールドの順序は、それらをループするときに予測できますか?そして
要素の順序-のためのJavaScriptでのループ(...で)


@kiam、これをdrupal.orgの「動作の重み」(「bewgt」)のモジュールにした場合、共同メンテナとして参加しますか?それはおそらくかなり小さなモジュールになるでしょうが、おそらく何か他のものと一緒に出荷させるよりはましです。D6のサンプル実装をローカルに持っていますが、動作しているようです。
ドンキホーテ

ちょうどそれをやった..あなたはまだ招待されています:)
donquixote '10 / 07/10

drupal.org/node/1302126-これがD8のコアになることを願っています:)
donquixote

興味深いモジュールですが、最初にいくつかのモジュールのコードを更新する必要があります。これについては、古くからのコード行を記述していませんでした。その後、私は新しいモジュールを共同開発する自由ができます。
kiamlaluno

ただ、人々はユースケースを求めています。drupal.org/node/1302126#comment-5911632
donquixote

0

Drupal 6の場合-

これが移植可能である必要がない場合の簡単な解決策は、最後に実行するJSをテーマのtemplate.phpファイルに配置することです。テーマdrupal_add_js呼び出しは常にモジュールの後に呼び出されます。

ポータブルにする必要がある場合、drupal 6の「最もクリーンな」ソリューションは、phpを使用するモジュールとは異なる重みを持つ新しいモジュールを追加することです。同じフォルダーに2つのモジュールを置き、最初のモジュールを最初のモジュールに依存させ、インストール/更新フックで重みを調整することもできます。どれも必要ではなく、インストールを簡単にするだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.