2012-09-16 38 views
9

我使用下面的代碼來生成一個Ajax請求:如何在Yii的Ajax請求中禁用jQuery自動加載?

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不從資產加載自己的副本。我怎樣才能做到這一點?

回答

17

在Yii中你不應該在主佈局中硬編碼任何javascript信息。如果你已經包含了一個客戶端腳本(javascript),但是對於核心腳本(如jquery或jqueryui),你必須在配置文件中修改這些包。

打開main.php配置文件,並添加你需要的所有CClientScript組件內的JS包(你應該增加它裏面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的(或其他腳本)只有一次,即使你把它幾次在你的代碼。

+0

哇!感謝一百萬...在這裏,我認爲我現在知道Yii的一些東西:) –

+0

對於其他JS文件(不是那些在配置中定義爲'核心腳本'),你可以使用isScriptFileRegistered()參見:http:// www .yiiframework.com/DOC/API/1。1/CClientScript#isScriptFileRegistered-detail – taseenb

+1

如果使用registerScript(File)和POS_READY,則不必手動註冊jquery,它會自動註冊。但是,您必須手動註冊jquery-ui。 – Narretz

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文件仍然在你的緩存?

+0

的感謝!不是我正在查找的內容,而是很高興瞭解CGoogleApi - 您在文檔中看到了哪些內容? –

+0

我有我的答案中包含的鏈接,只需向下滾動一下。這是官方文檔,所以我想有更多的方法可以做到,儘管e.a.的答案更清晰,因爲它可以與寄存器函數一起使用。 – Narretz

+0

'CGoogleApi :: load('jquery','1.7.2')。 「\ n」.'不存在。你將如何加載最新的jQuery? – shorif2000

2

這將工作

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