我想在drupal站点中执行jQuery $(document).ready()。虽然我知道我可以把它放在索引页面中,但这非常麻烦而且是黑客攻击。
我想知道的是放置它的正确位置在哪里,它还需要特定主题,因为我不希望所有主题都使用它。
提前感谢您的帮助。
甜蜜的成功,感谢你们两位的帮助,我对这个问题进行了最后的修改。现在我已经有了这个,我需要执行jQuery代码来更新文档,我可以使用上下文来修改文档吗?
答案 0 :(得分:7)
不是Drupal专家,但是这个blog entry表明,从Drupal 6开始,你根本不需要在我们的jQuery代码中包含$(document).ready()
函数。
相反,您可以将所有代码放在您指定为Drupal.behaviors
属性的函数中。
在Drupal安装的
misc/ directory
中,我们不仅拥有jquery.js文件,而且还有drupal.js(和其他几个js文件,控制特定于某些页面或管理功能的功能,例如上传.js),它管理Drupal中jQuery的一般用法。它声明了Drupal JavaScript对象,目的是包含需要被其他js文件访问和使用的属性。例如,Drupal.settings属性用于将模块设置数组传递给该模块的js代码。你只需在php代码中调用drupal_add_js()并确保第二个参数作为“setting”传入,例如:
drupal_add_js(array('mymodule' => $array_of_settings), 'setting');
然后,在您的js文件中,您可以在Drupal.settings.mymodule上访问这些设置。因此,您使用mymodule属性扩展了Drupal.settings对象,该属性本身就是一个包含所有设置的对象。
Drupal对象的另一个属性是behavior对象,即
Drupal.behaviors
,当我们希望我们的模块添加新的jQuery行为时,我们只是扩展这个对象。模块的整个jQuery代码可以这样构建:
Drupal.behaviors.myModuleBehavior = function (context)
{
//do some fancy stuff
};
但是,你可能想知道,所有这一切都是声明一个函数 - 它甚至被调用了什么?好吧,这一切都在drupal.js中得到了照顾。它有一个
$(document).ready
函数调用Drupal.attachBehaviors
函数,该函数依次遍历调用其每个属性的Drupal.behaviors
对象,这些函数都是上面各种模块声明的函数,并且作为上下文传递文档。这样做的原因是,如果你的jQuery代码进行AJAX调用导致新的DOM元素被添加到页面中,你可能希望你的行为(例如隐藏所有的h3元素或其他)被附加到那个新内容也是如此。但是,由于在加载DOM并且
Drupal.attachBehaviors
运行时它不存在,因此它没有附加任何行为。但是,通过上述设置,您需要做的就是调用Drupal.behaviors.myModuleBehavior(newcontext)
,其中newcontext
将是新的,由AJAX提供的内容,从而确保行为不会附加到整个文件一遍又一遍。有关如何使用此代码的完整示例,请参阅此处
答案 1 :(得分:2)
VonC充分回答了问题的“如何”部分,所以我将专注于“where”部分。
如果脚本是特定于主题的,那么放置脚本文件的自然位置就在主题中。问题是当Drupal进入主题时,$scripts
变量已经被“渲染”(用Drupal的说法)变成了HTML。要在主题图层中添加脚本,您需要添加脚本并重建$scripts
变量。
假设您正在使用Drupal 6,这将包含在您的theme_preprocess_page()
函数中:
drupal_add_js(drupal_get_path('theme', 'theme_name') .'/example.js', 'theme');
$variables['scripts'] = drupal_get_js();
只需更改drupal_get_path()
的第二个参数以反映主题的名称,然后将脚本文件的名称从example.js
更改为您为脚本命名的任何名称。