在 Yii 框架中移动所有 BODY 标签之前


Moving all JS before the closing BODY tag in Yii Framework?

我一直在试图弄清楚如何做到这一点一段时间,但被难住了。出于某种疯狂的原因,YII 违背了最佳实践,并试图将所有这些 JS 插入 HEAD 标签和整个身体中。我希望所有 JS 都出现在结束正文标签之前。

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

如何改变这种情况?

jquery.yiiactiveform.js 注册为 coreScript,因此要更改其位置,您必须覆盖其位置,默认情况下为 <HEAD> 。要覆盖位置,您可以使用 CClientScript coreScriptPosition属性,有点像(在您的特定视图中):

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
        )
    )
);

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

然后,对于向registerScript()注册的脚本,请使用属性 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> .