Drupal的附加行为:对所有新加载的内容有反应吗?


12

我有两个不同的模块,它们在许多方面可以协同工作。他们共同努力的事情之一是,模块A通过AJAX加载内容,而模块B需要将事件侦听器附加到加载的内容上。

然而,似乎当内容是由模块A通过AJAX加载,只是的“附加”功能Drupal.behaviours.a被调用,而不是的“附加”功能Drupal.behaviours.b。这两个函数在页面加载时被调用,但在后续的AJAX内容加载时不被调用。

// This runs every time module A loads new content.
Drupal.behaviors.a = {
  attach: function(context, settings) {
    alert('a:attach');
  }
}

// This only runs on page load, but never when module A loads new content.
Drupal.behaviors.b = {
  attach: function(context, settings) {
    alert('b:attach');
  }
}    

每当任何模块加载新内容时,如何使Drupal.behaviours.b的“附加”功能运行?


您是否尝试过添加Drupal.attachBehaviors();到ajax成功回调中?
克莱夫(Clive)

不,但是那不应该自动解决吗?我认为这就是“附加”功能的全部概念。应该在页面加载和页面更新时调用它?但是,看来页面更新仅调用了调用模块的“ attach”功能吗?
sbrattla 2012年

那是我的理解,是的,尽管我从未深入研究过。我知道有些时候,在AJAX调用之后,我需要重新附加行为,因此我以为是必需的
Clive

查看drupal.js:“ Drupal.attachBehaviors在下面添加到jQuery ready事件中,因此在初始页面加载时运行。在其解决方案中实现AHAH / Ajax的开发人员也应在加载新页面内容后调用此函数,并在以便将所有行为附加到新内容上。” 看来我需要自己调用attachBehaviours。但; 这使我感到困惑,即使我没有在AJAX成功回调中调用attachBehaviours,模块A的“ attach”功能仍在运行...?为什么只为调用模块而不是所有模块?
sbrattla 2012年

1
如果您想采用全面解决方案,$('body').ajaxSuccess(Drupal.attachBehaviors);则可能会起作用
克莱夫(Clive)

Answers:


4

根据中的评论misc/drupal.js,这说明了它的工作原理:

  • Drupal.attachBehaviors在下面添加到jQuery ready事件中,因此
  • 在初始页面加载时运行。开发人员在其中实施AHAH / Ajax
  • 解决方案还应在新页面内容被添加后调用此函数。
  • 加载,输入要处理的元素,以便附加所有
  • 新内容的行为。

2

尝试将其添加到Drupal.behavior.b中:

Drupal.attachBehaviors($(this));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.