Drupal 7处理JavaScript和jQuery方式的变化


14

我目前正在开发在管理页面上运行的JavaScript脚本。我仔细阅读了Drupal 7中所做的更改,即从document.ready()jQuery功能的转变。但是,以下脚本不起作用。

(function ($) {
  console.log('hello');
  $('#edit-apiusername').append('test');
})(jQuery);

console.log()正在触发,我可以看到输出,但是简单的追加无效。字段ID正确。
我不确定我在这里缺少什么,但是我怀疑这与我引用对象的方式有关。查看Views 3 JavaScript代码,我可以看到它以类似的方式完成。


如果您console.log($('#edit-apiusername')); 它是否输出对象,即jQuery是否在页面上找到该元素?
2011年

即使使用Drupal 6,您也应该使用Drupal行为代替document.ready。你所报告的是不特定的Drupal 7
kiamlaluno

Answers:


28

我认为您误解了这些变化。

应该包装JavaScript代码,(function ($) { ... })(jQuery);以允许将$用作的快捷方式jQuery。这是为了使jQuery与其他库完美配合。在此功能中,如果要更改DOM,您仍然必须等待DOM加载。这就是包装代码的目的jQuery.ready(function(){ ... })

但是,除了使用之外jQuery.ready(function(){ ... }),您应该使用行为让Drupal的JavaScript知道您的代码想要处理从DOM 添加(或删除)的任何内容。

(function ($) {
  Drupal.behaviors.exampleModule = {
    attach: function(context, settings) {
      $(context).find('#edit-apiusername').append('test');
    }
  }
})(jQuery);

1

您还可以考虑将整个jQuery对象别名为您选择的另一个变量,如下所示:

$j = jQuery.noConflict();

您可以将其放在ready语句之外,以使其在封装之外可以访问。

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.