【问题标题】:Adding a JavaScript file添加 JavaScript 文件
【发布时间】:2010-04-01 21:11:30
【问题描述】:

我正在尝试使用 drupal_add_js() 在标头中插入对 Javascript 文件的引用。我将这一行放在 template.php 中的模板预处理函数中。代码根本不起作用的结果:输出中没有应有的脚本链接。谁能告诉我我做错了什么?

function phptemplate_preprocess_page(&$vars) {
    $url = drupal_get_path("theme","mysite");  
    drupal_add_js($url."/jquery.js");  
    drupal_add_js($url."/drupal.js");  

.....

【问题讨论】:

    标签: javascript drupal drupal-6 drupal-templates


    【解决方案1】:

    更简单的是,需要在所有页面上加载的 Javascript 可以添加到主题的 .info 文件中。见http://drupal.org/node/171205#scripts

    【讨论】:

    • +1 有趣...主题信息文件是drupal 7 的要求,您发布的链接还说drupal 6 默认从主题文件夹加载所有.js 文件。如果您启用了 php 输入格式,则可以从模块甚至节点调用 drupal_add_js...
    • 不,这不完全正确。 Drupal 6 和 Drupal 7 都需要主题的 .info 文件。D6 仅自动加载名为“script.js”的文件。 D7 根本不会自动加载 js 文件。就像你说的,可以从节点调用 drupal_add_js(),但不建议这样做,因为你将内容与演示混合。
    【解决方案2】:
      drupal_add_js(path_to_theme().'/js/jquery.cycle.all.js');
      $vars['scripts'] = drupal_get_js();
    

    【讨论】:

    • 那么,这是否意味着 drupal_add_js 函数没有添加脚本标签?因为那是我对drupal帮助的理解。也就是说,我按照你的建议做了,发生的事情是,它添加了这些文件(drupal.js,jquery.js)两次。 :confuse: 这是它的样子 -
    • drupa.js 和 jquery.js 已经被 Drupal 核心添加。因此,将它们添加到您的主题就是创建重复项。可以删除默认值,但不是一个好主意。如果您使用不同的版本,则可能会破坏 Drupal 中依赖于核心版本的某些内容(如果您知道自己要破坏的内容并且可以接受,那很好,但您似乎不知道)。如果您使用相同的版本,移动它们的原因是什么?
    • @Nikki 是的,它在 phptemplate_preprocess_page 里面
    • @Scott 对于我正在阅读的这本书,我也有这种印象,但从未提及手动添加这两个文件。当我通过 Mozilla“页面源”查看输出时,那里没有脚本引用。所以我只能手动添加。
    【解决方案3】:

    如果将javascript文件放在主题目录中,只需将以下内容添加到主题.info文件中

    scripts[] = myJavaScriptFile.js
    

    添加此文件后,您需要停用您的主题,然后对其进行响应。

    【讨论】:

      【解决方案4】:

      正如其他人所指出的,仅使用 hook_preprocess_page() 实现中的 drupal_add_js() 是行不通的。通过多次调用drupal_add_js() 收集的对JavaScript 文件的引用用于从template_preprocess_page() 生成$scripts 变量的相应标记。但是hook_preprocess_page() 的主题实现总是在template_preprocess_page() 之后调用。因此,为了在您的.tpl.php 文件中通过drupal_add_js() 添加文件,您需要覆盖已设置的$scripts 变量:

      function THEME_preprocess_page(&$variables)
        drupal_add_js(...);
        $variables['scripts'] = drupal_get_js();
      }
      

      但是,您不必自己添加jquery.jsdrupal.js,它应该已经由 Drupal 核心自动完成。如果您需要自己做,那么您的网站上出现了问题。您可以(重新)添加文件作为快速修复,但您最好找到问题的根本原因,因为它很可能会产生您尚未发现(或在没有意识到的情况下解决)的其他问题。

      【讨论】:

      • +1,也可以在自己模块的hook_init()hook_preprocess()hook_preprocess_page()实现(或类似的钩子)中添加JS文件。
      【解决方案5】:

      drupal_add_js() 有效,但您将其深入到页面呈现过程中。我建议你像你一样把它放在 template.php 中,但一开始,放在任何函数之外。这就是我们在一些项目中所做的。

      【讨论】:

      • 你是对的。一旦我从函数中取出它并将其放在全局范围之外,它就像一个魅力。:) 不过我还有另一个问题。它只是纯粹的知识缘故。为什么drupal从输出中的两个不同位置两次添加这些文件?知道吗?这是它的外观 -
      • 正如用户 - scott 所建议的,我停止使用我的主题文件夹下的这些文件,而是使用了 drupal 默认值。所以在 drupal_add_js 函数中没有提到路径;换句话说,只是文件名 - drupal_add_js('jquery.js')
      • andew,drupal 应该自动将这两个文件添加到主题中。整个 js 文件集合通过 page.tpl.php 上的 添加到页面
      • 我已经多次被告知同样的事情。但除非我手动添加,否则我似乎无法在输出中找到它。我不知道出了什么问题。 :混淆:
      • 在任何函数之外的任何函数之外添加调用是不好的做法(它会使代码混乱并使其更难维护)并且是一种丑陋的解决方法。有更好的方法来处理这个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 2017-08-11
      • 2018-10-13
      • 1970-01-01
      相关资源
      最近更新 更多