在 Drupal 6 的 <head> 中加载外部脚本

Posted

技术标签:

【中文标题】在 Drupal 6 的 <head> 中加载外部脚本【英文标题】:Load external script in <head> in Drupal 6 【发布时间】:2010-09-08 14:01:40 【问题描述】:

我想在&lt;head&gt; 中加载一个外部脚本。它是特定于模块的,所以我希望我的模块负责加载。

在 Drupal 6 中,函数 drupal_add_js() 不允许在 &lt;head&gt; 中添加外部脚本。它将在Drupal 7 中可用,将"external" 参数传递给函数。 在 D6 中,我可以改用 drupal_set_html_head(),但它会将给定数据插入到我不想要的 &lt;head&gt; 的开头。 我想在其中附加数据

原来drupal_html_set_head()追加了数据。

$stored_head .= $data ."\n";

所以我实验的行为——数据被插入到头部数据的开头——应该来自我在模块的hook_init()函数中调用drupal_html_set_head()

如何将数据附加到 &lt;head&gt; 的和?

【问题讨论】:

你为什么坚持追加它而不是前置? AFAIK 没有办法让浏览器的顺序很重要,因为资源是在 parallelasynchonous 中调用的,所以对我来说,您的附加请求本身似乎有缺陷. @berkes:顺序很重要。见code.google.com/speed/page-speed/docs/… 【参考方案1】:

默认的page.tpl.php(可以在/modules/system/page.tpl.php中找到是这样的:

<head>
  <title><?php print $head_title; ?></title>
  <?php print $head; ?>
  <?php print $styles; ?>
  <?php print $scripts; ?>
  <script type="text/javascript"><?php /* Needed to avoid Flash of Unstyled Content in IE */ ?> </script>
</head>

当您创建 drupal_set_html_head() 时,它会将内容附加到变量 $head,但仍然会附加更多变量,如您所见。

一种可能的解决方案是将您想要的内容附加到$scripts,而不是$head

怎么做?

使用模块中的预处理功能:

function MYMODULE_preprocess_page(&$variables) 
    $variables['scripts'] .= $your_stuff;

我没有尝试这个解决方案,但如果不起作用可能是因为执行顺序。尝试将模块的权重设置得更高,这样它就会在system_preprocess_page 之后运行

可能无法正常工作的其他原因是因为主题在 page.tpl.php 中以不同的顺序打印变量。但是你不能通过模块的代码来控制它。

【讨论】:

这是我选择的选项。感谢您的详细解释。【参考方案2】:

有多种解决方案可以解决该问题。

使用 hook_footer() 将 js 添加到页脚 制作一个小的jquery脚本,创建&lt;script&gt;元素并将其添加到&lt;head&gt; 使用模板预处理函数来实现 制作你自己的page.tpl.php

【讨论】:

注意:我想在&lt;head&gt;中插入脚本。 我实现了template_preprocess_page() 钩子,效果很好。【参考方案3】:

Drupal 使用.= 运算符创建$head 变量。 $js$css 保存在一个数组中,并允许您重新排序。 $head 是一个字符串,不能重新排序,否则是丑陋的、容易出错的黑客。例如正则表达式爆炸、重新排序和内爆。

$heads = preg_explode("\n", $head);
ksort($heads);
$head = implode("\n", $heads);

在主题的变量预处理器中。

【讨论】:

【参考方案4】:

你看到这个comment了吗?

使用它在D6中设置外部js文件调用时要注意,例如:

drupal_set_html_head('');

如果您不包含完整的脚本结束标记(即 ),它将 闯入 Firefox(可能还有其他浏览器,基于 webkit 的浏览器似乎 美好的)。该标签将无法关闭,并将清除任何其他标题 直到下一个可用标签。这通常会导致所有 您的 css 文件无法加载,以及下一个完全标记的 js 文件。所以 请改用此表单:

drupal_set_html_head('');

这适用于并包括 Drupal 6.16。你可以克服它 D7 与 drupal_add_js 中的新外部选项。

【讨论】:

它告诉我如何正确使用它。 我使用正确。&lt;head&gt; 中添加数据是正常行为。我想追加它 @Török Gábor 那么你运气不好。对不起。 Drupal 使用 .= 运算符,将其放在前面。以正确的方式追加是不可能的。 哦,抱歉,没看到那部分。 @berkes:我错了。它使用.= 运算符,所以它追加。我在hook_init() 中调用drupal_set_html_head(),可能就是这个原因。

以上是关于在 Drupal 6 的 <head> 中加载外部脚本的主要内容,如果未能解决你的问题,请参考以下文章

2 寻呼机在视图中 - Drupal 6

Drupal 6-视图标题中的行计数

如何在 Drupal 6 的视图中创建自定义样式输出?除了 Grid、Table、HTML 列表?

分类的自定义 url > Drupal 6 的词汇表

如何在 drupal 6 中对工作流状态进行批量操作?

module_invoke:使用视图并作为块显示 Drupal 6