Как отключить автозагрузку jQuery по запросу Ajax в Yii?

Я использую следующий код для генерации запроса 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 не загружать собственную копию из активов. Как я могу это сделать?

В Yii вы никогда не должны жестко кодировать информацию javascript в основном макете.

Yii может определить, был ли уже включен клиентский скрипт (javascript), но для основных сценариев (например, jquery или jqueryui) вы должны изменить эти пакеты в своем файле конфигурации.

Откройте main.php конфигурации 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 ) ), ), от '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 (или любой другой скрипт) только один раз, даже если вы вызываете его несколько раз в своем коде.

Следуя инструкциям от 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 выше, чем в моем примере! Думаю, это медленное обновление со стороны Google, потому что оно тоже не работает в обычном файле.

Или, может быть, файл js все еще находится в вашем кеше?

Это будет работать

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