如何在 Yii 中禁用 Ajax 请求的 jQuery 自动加载?
Posted
技术标签:
【中文标题】如何在 Yii 中禁用 Ajax 请求的 jQuery 自动加载?【英文标题】:How to disable jQuery autoloading on Ajax request in Yii? 【发布时间】:2012-09-08 20:33:17 【问题描述】:我正在使用下面的代码来生成一个 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 不从资产中加载自己的副本。我该怎么做?
【问题讨论】:
【参考方案1】:这会起作用
<?php
$cs=Yii::app()->clientScript;
$cs->scriptMap=array(
'jquery.js'=>false,
'jquery.ui.js' => false,
); ?>
【讨论】:
【参考方案2】:在 Yii 中,你不应该在主布局中硬编码任何 javascript 信息。
Yii 可以确定是否已包含客户端脚本 (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(或任何其他脚本),即使您在代码中多次调用它。
【讨论】:
哇!谢谢一百万...在这里我想我现在对 Yii 有所了解:) 对于其他 JS 文件(不是那些在配置中定义为“核心脚本”的文件),您可以使用 isScriptFileRegistered() 参见:yiiframework.com/doc/api/1.1/… 如果你使用 registerScript(File) 和 POS_READY,你不需要手动注册 jquery,它是自动注册的。但是,您必须手动注册 jquery-ui。 这将 jquery 放在所有包含脚本的末尾。你是怎么做到的?【参考方案3】:按照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文件可能还在你的缓存中?
【讨论】:
谢谢!不是我想要的,但很高兴了解 CGoogleApi - 你在文档中哪里看到的? 我的答案中包含链接,只需向下滚动一点。这是官方文档,所以我想还有更多方法可以做到这一点,尽管 e.a. 的答案更简洁,因为它适用于 register 函数。CGoogleApi::load('jquery','1.7.2') . "\n" .
不存在。你将如何加载最新的 jquery?
很好的答案,真的很有帮助!以上是关于如何在 Yii 中禁用 Ajax 请求的 jQuery 自动加载?的主要内容,如果未能解决你的问题,请参考以下文章