遇到了一个有点棘手的情况,我似乎无法控制。基本上,我试图实现的是能够在不同的页面上注入不同的Javascript文件。
一些简单、随机的例子:
- 第1页:导入jquery.js
- 第2页:导入mootools.js
所以我所做的是,我创建了一个名为addScript()
的函数,如下所示:
function addScript($file) {
$script = '';
$script .= '<script src="'. REL_PATH . '/path/to/file/' . $file . '">';
$script .= '</script>';
return $script;
}
所以如果我调用addScript('jquery.min');
,它就会正确输出。
我现在想做的是用上面函数的输出替换关闭的</head>
标记。如果我做了以下操作,那么它可以正常工作:
ob_start();
require_once("models/header.php");
$contents = ob_get_contents();
ob_end_clean();
echo str_replace('</head>', addScript('jquery.js') . '</head>', $contents);
然而,我希望这是一个更动态的,因为可能有多个脚本,我需要在每个页面上注入,如下所示:
addScript('script.js');
addScript('script2.js');
addScript('script3.js');
然后我想创建一个内部有foreach循环的getHead()
函数,并在那里返回str_replace
,但这并没有奏效。
有人能指导我根据需要动态注入尽可能多的脚本并输出头的最后一位吗?
为什么不这样做:
class Assets {
private static $css = array();
private static $js = array();
static function add_style($path) {
self::$css[] = $path;
}
static function add_script($path) {
self::$js[] = $path;
}
static function get_styles() {
$output = '';
foreach(self::$css as $path) {
$ouput .= '<link rel="stylesheet" href="'. $path .'" />' . "'n";
}
return $ouput;
}
static function get_scripts() {
$output = '';
foreach(self::$js as $path) {
$ouput .= '<script type="text/javascript" src="'. $path .'"></script>' . "'n";
}
return $ouput;
}
}
然后在你的项目中的任何地方:
Assets::add_style('path/to/style.css');
Assets::add_script('path/to/jquery.js');
在header.php中:
<head>
<!-- other header stuff -->
<?php echo Assets::get_styles(); ?>
<?php echo Assets::get_scripts(); ?>
</head>
更方便,而且你可以扩展类来做更花哨的事情。
免责声明:关于使用静态变量有很多争论,因为它们看起来像全局变量。我同意,但无论你使用什么样的框架,这都是快速而肮脏的。您也可以将变量设置为oldschool实例变量,但随后您还必须将assets对象传递给header.php。
以下内容有什么问题??
echo str_replace('</head>',
addScript('jquery.js').
addScript('jquer1.js').
addScript('jquer2.js').
addScript('jquer3.js').
'</head>', $contents);
把ob_start();
放在header.php
里怎么样。那么你的功能是:
function addScript($file) {
$script = '<script src="'. REL_PATH . '/path/to/file/' . $file . '"></script>';
echo str_replace('</head>', addScript('jquery.js') . '</head>', ob_get_clean());
}
然后:
addScript('script.js');
此方法保持输出缓冲区的运行,并且您可以在稍后的脚本中随时对其进行操作。就像使用addScript()
一样。