9

我正在使用以下代码生成 ajax 请求:

echo CHtml::dropDownList('teamA', '', EnumController::getTeamOption(), array(
        'empty' => '(Team / Single)',
        'ajax' => array(
            'type'=>'POST',
            'url'=> $url,
            'update'=>"#resultA",
            //'data'=>"js:$('#teamA').hide().fadeIn()" 
        )
    )
);

在我的主要布局中,我有以下内容:

<?php Yii::app()->clientScript->scriptMap=array('jquery.js'=>false);?>
<?php Yii::app()->clientScript->scriptMap=array('jquery.min.js'=>false);?>

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.7/jquery-ui.min.js"></script>

Yii 正在从资产中加载 jQuery 副本,然后——另一个副本,直接来自 Google。我只想使用 Google 副本并强制 Yii 不从资产中加载自己的副本。我怎样才能做到这一点?

4

3 回答 3

17

在 Yii 中,你不应该在主布局中硬编码任何 javascript 信息。

Yii 可以确定是否已经包含客户端脚本(javascript),但是对于核心脚本(如 jquery 或 jqueryui),您必须在配置文件中修改这些包。

打开main.php配置文件,在组件中添加你需要的所有js包CClientScript(你应该在里面添加components),像这样:

'clientScript'=>array(
  'packages'=>array(
    'jquery'=>array(
      'baseUrl'=>'//ajax.googleapis.com/ajax/libs/jquery/1.8/',
      'js'=>array('jquery.min.js'),
      'coreScriptPosition'=>CClientScript::POS_HEAD
    ),
    'jquery.ui'=>array(
      'baseUrl'=>'//ajax.googleapis.com/ajax/libs/jqueryui/1.8/',
      'js'=>array('jquery-ui.min.js'),
      'depends'=>array('jquery'),
      'coreScriptPosition'=>CClientScript::POS_BEGIN
    )
  ),
),

然后,每次您需要 jquery 时,只需在您的代码之前添加:

$cs = Yii::app()->getClientScript();
$cs->registerCoreScript('jquery');

Yii 将只包含一次 jquery(或任何其他脚本),即使您在代码中多次调用它。

于 2012-09-17T14:12:48.387 回答
6

按照Yii Special Topics Performance的说明,我做了一个快速测试,结果如下:

在主布局的顶部:

<?php
$cs=Yii::app()->clientScript;
$cs->scriptMap=array(
    'jquery.js'=>false,
    'jquery.ui.js' => false,
);?>

<head>主布局部分:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.7/jquery-ui.min.js"></script>

或者

<?php echo CGoogleApi::init(); ?>

<?php echo CHtml::script(
    CGoogleApi::load('jquery','1.7.2') . "\n" .
    CGoogleApi::load('jqueryui','1.8.17') 
); ?>

我实际上会使用 CGoogleApi 助手,但 jsapi 显然无法加载比我的示例中更高的 jquery 版本!我想这对谷歌来说更新很慢,因为它也不能在普通文件中工作。

或者也许 js 文件仍在您的缓存中?

于 2012-09-16T21:39:46.313 回答
2

这将起作用

 <?php     
       $cs=Yii::app()->clientScript;
       $cs->scriptMap=array(
         'jquery.js'=>false,
         'jquery.ui.js' => false,
); ?>
于 2014-02-08T19:59:57.740 回答