Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jQuery和Drupal页面加载_Jquery_Drupal - Fatal编程技术网

jQuery和Drupal页面加载

jQuery和Drupal页面加载,jquery,drupal,Jquery,Drupal,我想在drupal站点中执行jQuery$(document).ready()。虽然我知道我可以把它放在索引页上,但这真的是一个混乱和黑客行为 我想知道的是,在哪里是正确的位置,把这个,它也需要是具体的主题,因为我不希望所有的主题都使用它 提前谢谢你的帮助 甜蜜的成功,谢谢你们两位的帮助,我对这个问题只有最后一个修正。至此,我需要执行jQuery代码来更新文档,我可以使用上下文来修改文档吗 不是Drupal专家,但这表明,从Drupal 6开始,您根本不需要在jQuery代码中包含$(docu

我想在drupal站点中执行jQuery$(document).ready()。虽然我知道我可以把它放在索引页上,但这真的是一个混乱和黑客行为

我想知道的是,在哪里是正确的位置,把这个,它也需要是具体的主题,因为我不希望所有的主题都使用它

提前谢谢你的帮助



甜蜜的成功,谢谢你们两位的帮助,我对这个问题只有最后一个修正。至此,我需要执行jQuery代码来更新文档,我可以使用上下文来修改文档吗

不是Drupal专家,但这表明,从Drupal 6开始,您根本不需要在jQuery代码中包含
$(document).ready()
函数

相反,您可以将所有代码放在一个函数中,该函数被指定为
Drupal.behaviors
的属性

在Drupal安装的
misc/directory
中,我们不仅有jquery.js文件,还有Drupal.js(和其他几个js文件,控制特定页面的功能或管理功能,例如upload.js),它控制着Drupal中jquery的一般使用

它声明DrupalJavaScript对象的目的是包含其他js文件需要访问和使用的属性。例如,Drupal.settings属性用于将模块设置数组传递给该模块的js代码。只需在php代码中调用drupal_add_js(),并确保第二个参数作为“设置”传入,即可完成此操作,例如:

然后,在js文件中,您可以访问Drupal.settings.mymodule中的这些设置。因此,您使用mymodule属性扩展了Drupal.settings对象,它本身就是一个包含所有设置的对象

Drupal对象的另一个属性是行为对象,即
Drupal.behaviors
,当我们希望模块添加新的jQuery行为时,我们只需扩展这个对象。模块的整个jQuery代码的结构如下:

但是,您可能想知道,所做的只是声明一个函数——它是如何被调用的?嗯,这在drupal.js中都得到了关注。它有一个
$(document).ready
函数,该函数调用
Drupal.attachBehaviors
函数,该函数依次通过
Drupal.behaviors
对象循环调用它的每一个属性,这些都是由上述各个模块声明的函数,并作为上下文传入文档

这样做的原因是,如果jQuery代码进行AJAX调用,导致新的DOM元素被添加到页面中,那么您可能希望您的行为(例如隐藏所有h3元素或其他)也附加到新内容中。但由于在加载DOM并运行
Drupal.attachBehaviors
时它不存在,因此它没有附加任何行为。但是,通过上述设置,您只需调用
Drupal.behaviors.myModuleBehavior(newcontext)
,其中
newcontext
将是新的、AJAX交付的内容,从而确保这些行为不会再次附加到整个文档中。有关如何使用此代码的完整示例,请参见此处


VonC充分回答了问题的“如何”部分,因此我将重点讨论“在哪里”部分

如果脚本是特定于主题的,那么放置脚本文件的自然位置是在主题中。问题是,当Drupal进入主题时,
$scripts
变量已经“呈现”(用Drupal的说法)为HTML。要在主题层中添加脚本,需要添加脚本并重新生成
$scripts
变量

假设您使用的是Drupal 6,这将出现在您的
theme\u preprocess\u page()
函数中:

drupal_add_js(drupal_get_path('theme', 'theme_name') .'/example.js', 'theme');
$variables['scripts'] = drupal_get_js();

只需更改
drupal\u get\u path()
的第二个参数以反映主题的名称,然后将脚本文件的名称从
example.js
更改为您为脚本命名的名称。

实际上,您应该调用drupal.attachBehaviors(newcontext)以让所有注册的行为处理newcontext元素(及其子女)。
Drupal.behaviors.myModuleBehavior = function (context) 
{
    //do some fancy stuff
};
drupal_add_js(drupal_get_path('theme', 'theme_name') .'/example.js', 'theme');
$variables['scripts'] = drupal_get_js();