2

在 Google 的 PageSpeed 报告中,有一些阻塞 Javascript 需要异步。从这篇文章中我知道我必须将 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')了,但它在脚本标签中打印出 0='0'

我怎样才能让它打印async在脚本标签中。另外,我怎样才能让它在css的链接标签中也可用?

注意:我使用的是 CakePHP 1.3x

4

1 回答 1

5

检查源代码表明没有办法实现这样的标签,因为很明显属性的格式是%s="%s"

如果你真的需要这个,我认为现在最简单的方法是HtmlHelper通过扩展 core来提供你自己的定制HtmlHelper,并覆盖_formatAttribute函数:

注意:这仅适用于 CakePHP 1.3.x,它非常混乱,因为它不能className在 helpers 数组中指定。CakePHP 2.x 提供了一种更简洁的方法来轻松覆盖默认核心帮助程序,但这不是 OP 想要的,所以我不会把它放在这里

  1. 创建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);
        }
    }
    
  2. 在您app_controller.php或任何需要此功能的主控制器中,使用CustomHtmlHelperby:

    var $helpers = array('CustomHtml');
    
  3. 在您看来,您现在可以开始使用asyncdefer标记。如果您认为合适,请随意扩展此数组。

    echo $this->CustomHtml->script('test', array('async' => 'async'));
    
于 2013-09-23T02:01:01.770 回答