编辑:
好吧,您不必那么详细,您可以简单地拥有一个仅代理 ob_start/ob_get_clean 的 php 类/函数,然后将 js 存储在某处,然后将 js 输出到其他地方。不一定要通过php来支持或集成库的功能...
如果可以像下面这样简单:
class UnobtrusiveJsHelper {
protected static $_instance;
protected $_js = array();
protected $_ready = array();
public static function getInstance()
{
}
public static function setInstance(UnobtrusiveJsHelper $instance)
{
}
public function captureStart($key = null)
{
if(null !== $key)
{
$this->_js[$key] = null;
}
ob_start();
}
public function captureEnd($key = null)
{
if(null !== $key)
{
$this->_js[$key] = ob_get_clean();
return;
}
$this->_js[] = ob_get_clean();
public function __toString()
{
return $this->dumpJs() . $this->_dumpReady();
}
public function dumpJs(array $attributes = null)
{
if(!empty($this->_js))
{
return "<script type=\"text/javascript\">". implode("\n", $this->_js) . "</script>";
}
return null;
}
public function dumpReady(array $attributes = null)
{
if(!empty($this->_js))
{
return '<script type="text/javascript">$(document).ready(function(){'. implode("\n", $this->_js) . '});</script>';
}
return null;
}
}
然后在您的控制器中:$js = UnobtrusiveJsHelper::getInstance();
在你看来:
<?php $js->captureStart(); ?>
var myjsvariable = 0;
<?php $js->captureEnd();
在你的布局中(假设这里有两步视图):
<?php echo isset($js) ? $js : null ?>
这就是你使用助手的目的。例如在 Zend_Framework 中,所有这些小的onLoad/Ready sn-ps 都被添加到堆栈中。然后将它们全部输出到头部的一个位置。
我有一个用于 jQ 的特殊助手,它在 Symfony 下也可以做类似的事情。
这些允许像$jq->setVar('myjsvar', 1); 这样的东西,然后当我转储这个时,我得到类似的东西:
var myjsvar = 1; 在头部的脚本标签中。
查看 ZendX_Jquery 和 Zend_Dojo 以及它们各自的视图帮助器类,以获得功能的一个很好的示例。