3

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

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

这怎么能改变?

4

1 回答 1

14

jquery.yiiactiveform.js注册为 coreScript所以要改变它的位置,你必须覆盖它的位置,默认是. 要覆盖位置,您可以使用CClientScript 的属性,有点像(在您的特定视图中):<HEAD>coreScriptPosition

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

我们刚刚将其更改为 body 标签末尾的位置。

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

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

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

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

然后对于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>.

于 2013-01-31T03:19:41.010 回答