在 Drupal 6 的 <head> 中加载外部脚本
Posted
技术标签:
【中文标题】在 Drupal 6 的 <head> 中加载外部脚本【英文标题】:Load external script in <head> in Drupal 6 【发布时间】:2010-09-08 14:01:40 【问题描述】:我想在<head>
中加载一个外部脚本。它是特定于模块的,所以我希望我的模块负责加载。
在 Drupal 6 中,函数 drupal_add_js()
不允许在 <head>
中添加外部脚本。它将在Drupal 7 中可用,将"external"
参数传递给函数。 在 D6 中,我可以改用 drupal_set_html_head()
,但它会将给定数据插入到我不想要的 <head>
的开头。 我想在其中附加数据。
原来drupal_html_set_head()
追加了数据。
$stored_head .= $data ."\n";
所以我实验的行为——数据被插入到头部数据的开头——应该来自我在模块的hook_init()
函数中调用drupal_html_set_head()
。
如何将数据附加到 <head>
的和?
【问题讨论】:
你为什么坚持追加它而不是前置? AFAIK 没有办法让浏览器的顺序很重要,因为资源是在 parallel 和 asynchonous 中调用的,所以对我来说,您的附加请求本身似乎有缺陷. @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脚本,创建<script>
元素并将其添加到<head>
使用模板预处理函数来实现
制作你自己的page.tpl.php
【讨论】:
注意:我想在<head>
中插入脚本。
我实现了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 中的新外部选项。
【讨论】:
它告诉我如何正确使用它。 我使用正确。 在<head>
中添加数据是正常行为。我想追加它。
@Török Gábor 那么你运气不好。对不起。 Drupal 使用 .= 运算符,将其放在前面。以正确的方式追加是不可能的。
哦,抱歉,没看到那部分。
@berkes:我错了。它使用.=
运算符,所以它追加。我在hook_init()
中调用drupal_set_html_head()
,可能就是这个原因。以上是关于在 Drupal 6 的 <head> 中加载外部脚本的主要内容,如果未能解决你的问题,请参考以下文章