防止在 Yii 框架上使用 ajaxButton/ajaxSubmitButton 加载 jQuery 资产
Posted
技术标签:
【中文标题】防止在 Yii 框架上使用 ajaxButton/ajaxSubmitButton 加载 jQuery 资产【英文标题】:Prevent loading of jQuery assets with ajaxButton/ajaxSubmitButton on Yii framework 【发布时间】:2012-06-20 03:25:33 【问题描述】:我的布局上有 jQuery 加载资源,我想使用 Chtml::ajaxButton/ajaxSubmitButton
。
但是当我在运行时将它与另一个渲染一起使用时,它会再次加载 jQuery 资产并出错。
如何防止脚本加载?
<?php echo CHtml::ajaxSubmitButton( 'Submit',
CHtml::normalizeUrl(array('site/AjaxRequest/30')),
array(
'error'=>'js:function()
alert(\'error\');
',
'beforeSend'=>'js:function()
alert(\'beforeSend\');
',
'success'=>'js:function(data)
alert(\'data from server: \'+data);
',
'complete'=>'js:function()
alert(\'complete\');
',
//'update'=>'#response',
)
);
?>
【问题讨论】:
请向我们展示您的 jquery 资产布局加载。 【参考方案1】:这也是 IMO 的一个非常烦人的问题。我解决的方法是创建 CClientScript 的派生类并将其用作 clientScript 组件(您可以覆盖配置文件中的类类型):
'clientScript' => array
(
'class' => 'MyClientScript',
),
我的类重写了“registerCoreScript”函数,该函数用于注册 jQuery 和 Yii 包含的其他基本脚本。 我在那里所做的几乎就是添加对ajax的检查,如果是的话,不要将其传递给父类。 它看起来像这样:
public function registerCoreScript($sName)
if (Yii::app()->request->isAjaxRequest)
return $this;
return parent::registerCoreScript($sName);
这可以防止在 ajax 调用期间加载任何核心脚本(并再次添加资产)。
您也可以对其中的其他函数执行相同的操作(例如 registerScriptFile)
希望对您有所帮助。
【讨论】:
【参考方案2】:Yii::app()->clientScript->scriptMap=array(
'jquery.js'=>false,
'jquery.ba-bbq.js'=>false,
'jquery.yiilistview.js'=>false
);
使用这种方式来防止加载已经加载的javascript文件。
【讨论】:
Ajax 启动的部分呈现始终是新的页面浏览量,因此脚本始终“未加载”。但是,如果将它与一些 isAjaxRequest 魔术结合使用,则可以使用它。【参考方案3】:这是绕过这个烦人问题的另一种方法:在 de 'render' 调用之前禁用脚本:
Yii::app()->clientScript->corePackages = array();
Yii::app()->clientScript->scriptMap = array('jquery.yiigridview.js' => false,
'CGridView.css' => false,
'pager.css' => false,
...
'jquery-ui-i18n.min.js'=> false,);
echo $this->renderPartial('myView',array('model'=>$model, 'dataProvider'=>$dataProvider),true,true);
您必须手动放置您不想插入到 html 中的任何 .js 和 .css 文件。这使您可以启用和禁用您想要/需要的任何东西。
【讨论】:
以上是关于防止在 Yii 框架上使用 ajaxButton/ajaxSubmitButton 加载 jQuery 资产的主要内容,如果未能解决你的问题,请参考以下文章
在提交Wicket&ŧ039;s AjaxButton的脚本之前