在Yii Framework中关闭BODY标记之前移动所有JS?

时间:2013-01-31 00:37:24

标签: php performance yii

我一直想弄清楚如何这样做一段时间而且我很难过。出于某种疯狂的原因,YII违背了最佳实践,并尝试在HEAD标签和整个机构中插入所有这些JS。我希望所有JS都出现在关闭正文标记之前。

我正在使用自己的jQuery(v.1.9.0),Bootstrap等,并将scriptMap设置为false。但是,yiiactiveform仍然插入到HEAD标签中,并且在我的视图中使用了使用enableClientValidation的JS,并且在我的视图底部写的JS仍然显示在BODY中。

如何改变?

1 个答案:

答案 0 :(得分:14)

jquery.yiiactiveform.js registered as a coreScript,因此要更改其位置,您必须覆盖其位置default is the <HEAD>。要覆盖您可以使用coreScriptPosition property of CClientScript的位置,有点像(在您的特定视图中):

Yii::app()->clientScript->coreScriptPosition=CClientScript::POS_END;

我们刚刚将它更改为身体标记末尾的位置。

但是,既然您想对所有视图执行此操作,即对整个应用程序执行此操作,则可以在应用程序配置期间覆盖该位置。为此,您必须更改应用程序加载的配置数组,通常此文件在文件中指定: protected / config / main.php 。您必须更改应用的clientScript组件配置,如下所示:

return array(
    // other properties
    'components'=>array(
        // other components' configurations

        'clientScript'=>array(
            'coreScriptPosition'=>CClientScript::POS_END
        )
    )
);

同样,您可以使用property defaultScriptFilePosition对注册为脚本文件的脚本进行更改,即使用registerScriptFile()

然后,对于使用registerScript()注册的脚本,请使用property defaultScriptPosition

如果要为小部件注册的脚本(如CActiveForm)指定位置,当然您希望为自己的脚本指定位置时(如果使用其中一个registerScript*函数注册),这些属性特别方便。

如果您自己指定了文件/脚本(使用registerScript*函数之一),那么您也可以在调用函数时设置位置。

确保在更改窗口小部件的位置时进行彻底测试,例如CActiveForm有一些在jQuery.ready函数或jQuery(function($) { ...中注册的小脚本,如果指定defaultScriptPosition到POS_END,这些脚本将被移出ready()功能。

您可以按视图再次更改这些属性:

Yii::app()->clientScript->defaultScriptPosition=CClientScript::POS_END;
Yii::app()->clientScript->defaultScriptFilePosition=CClientScript::POS_END;

或系统范围:

return array(
    // other properties
    'components'=>array(
        // other components' configurations

        'clientScript'=>array(
            'coreScriptPosition'=>CClientScript::POS_END,
            'defaultScriptPosition'=>CClientScript::POS_END,
            'defaultScriptFilePosition'=>CClientScript::POS_END
        )
    )
);

如果您的视图中包含带有<script></script>标记的脚本,那么我担心您无法轻易控制其位置,您必须将这些脚本(如果可能)移动到布局文件中(不会一直工作 - 许多不同的情况)。最好的选择是切换到registerScriptFileregisterScript功能,而不是使用<script>