在Google的PageSpeed报告中,有一些阻止Javascript需要异步。从this article我知道我必须将async属性放在我的脚本标记中:
<script async src="http://third-party.com/resource.js"></script>
在cakePHP中,我无法完全实现这一点,我只能得到:
<script async="async" src="http://third-party.com/resource.js"></script>
使用Html的脚本方法如下:
$html->script(array('jsfile1', 'jsfile2'), array('async' => 'async'));
我尝试array('async')
,但在脚本标记
如何在脚本标记中仅打印async
。另外,我怎么能在css的链接标签中提供它呢?
注意:我使用CakePHP 1.3x
答案 0 :(得分:5)
Checking the source code表示无法实现此类标记,因为很明显属性的格式为%s="%s"
。
如果您真的需要这个,我认为现在最简单的方法是通过扩展核心HtmlHelper
来提供您自己的自定义HtmlHelper
,并覆盖_formatAttribute
函数:
注意:这仅适用于CakePHP 1.3.x,并且它非常混乱,因为它无法在helpers数组中指定className
。 CakePHP 2.x提供了一种更简洁的覆盖默认核心助手的方法,但它不是OP想要的,所以我不会把它放在这里
创建app/views/helpers/custom_html.php
:
<?php
App::import('Helper', 'Html');
class CustomHtmlHelper extends HtmlHelper {
function __formatAttribute($key, $value, $escape = true) {
if (in_array($key, array('async', 'defer'))) {
return $key;
}
return parent::__formatAttribute($key, $value, $escape);
}
}
在app_controller.php
或任何需要此功能的主控制器中,使用CustomHtmlHelper
by:
var $helpers = array('CustomHtml');
在您看来,您现在可以开始使用async
或defer
代码。如果您认为合适,请随意扩展此阵列。
echo $this->CustomHtml->script('test', array('async' => 'async'));