回答:
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実装は、異なる順序を使用して同じプロパティを表示します。また、同じブラウザの異なるバージョンで同じ順序が変更される可能性があることも意味します。
select name, weight from system where type = 'module' order by weight ASC, name
Drupal.behaviors
。私が報告したよう$.each(Drupal.behaviors)
に、オブジェクトは、識別子に基づいてではなく、挿入されたのと同じ順序で一覧表示されます。
行動の重みモジュールを使用します。
(本番サイトで使用する前に、テストを行ってください)
モジュールは、動作に重みを付けることを可能にしdrupal.attachBehaviors
、重みを尊重するカスタム実装でハイジャック/置換します。
他の答えで提案されているように、なぜモジュールの重みではないのですか?
参照してください
。JavaScriptオブジェクトのフィールドの順序は、それらをループするときに予測できますか?そして
要素の順序-のためのJavaScriptでのループ(...で)。
Drupal 6の場合-
これが移植可能である必要がない場合の簡単な解決策は、最後に実行するJSをテーマのtemplate.phpファイルに配置することです。テーマdrupal_add_js呼び出しは常にモジュールの後に呼び出されます。
ポータブルにする必要がある場合、drupal 6の「最もクリーンな」ソリューションは、phpを使用するモジュールとは異なる重みを持つ新しいモジュールを追加することです。同じフォルダーに2つのモジュールを置き、最初のモジュールを最初のモジュールに依存させ、インストール/更新フックで重みを調整することもできます。どれも必要ではなく、インストールを簡単にするだけです。