Answers:
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;否则,模块权重应设置为-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对象中字段的顺序是否可确定?和
Elements order-for(…in…)在javascript中循环。