2012-09-16 35 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, 
); ?>