【问题标题】:jQuery And Drupal page loadjQuery 和 Drupal 页面加载
【发布时间】:2008-12-15 07:47:45
【问题描述】:

我想在 drupal 站点中执行 jQuery $(document).ready()。虽然我知道我可以将其粘贴在索引页中,但这真的很混乱而且很糟糕。

我想知道放置它的正确位置在哪里,它还需要特定于主题,因为我不希望所有主题都使用它。

提前感谢您的帮助。


甜蜜的成功,感谢你们的帮助,我对这个问题有最后的修改。现在我已经到了这一步,我需要执行 jQuery 代码来更新文档,我可以使用上下文来修改文档吗?

【问题讨论】:

    标签: jquery drupal


    【解决方案1】:

    不是 Drupal 专家,但这个 blog entry 建议,从 Drupal 6 开始,您根本不需要在我们的 jQuery 代码中包含 $(document).ready() 函数。

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

    在 Drupal 安装的misc/ directory 中,我们不仅有 jquery.js 文件,而且还有 drupal.js(以及其他几个 js 文件,控制特定于某些页面或管理功能的功能,例如 upload.js ),它管理 Drupal 中 jQuery 的一般使用。

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

    drupal_add_js(array('mymodule' => $array_of_settings), 'setting'); 
    

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

    Drupal 对象的另一个属性是行为对象,即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 交付的内容,从而确保行为不会全部附加到整个文档再次。有关如何使用此代码的完整示例,请参见此处

    【讨论】:

    • 其实应该调用 Drupal.attachBehaviors(newcontext) 让所有注册的行为处理 newcontext 元素(及其子元素)。
    【解决方案2】:

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

    如果脚本是特定于主题的,那么放置脚本文件的自然位置就是您的主题。问题是当 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 更改为您为脚本命名的任何名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      相关资源
      最近更新 更多