使用Yii的Ajax验证,无需自动加载Jquery

时间:2013-01-24 13:03:40

标签: yii

我想使用CActiveFormAjaxValidation

在启用AjaxValidation之前,

我的布局视图文件是这样的:

<html lang="tr-TR" dir="ltr">
<head>
<script src="<?php echo Yii::app()->request->baseUrl; ?>/js/jquery.js"></script>
</head>

如您所见,我在布局页面上调用了jquery框架(因为我在每个页面都使用它)。

我决定使用CActiveForm的ajax验证。首先在调用它时启用enableAjaxValidation

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'otel-form',
    'enableAjaxValidation'=>true,
)); ?>

然后在我的控制器上取消注释

$this->performAjaxValidation($model);

但是我遇到$(...).yiiactiveform is not a function错误。当我检查页面的源代码时:

如您所见,还包括一个jquery库。所以页面上有2个jquery文件。因为这个我得到错误。接下来我把这样的事情用于禁用jquery。

Yii::app()->clientscript->scriptMap['jquery.js'] = false;

现在jquery只加载一次。但结果是:

<html lang="tr-TR" dir="ltr">
<head>
<script type="text/javascript" src="/istanbulcityhotels/assets/cb2686c8/jquery.yiiactiveform.js"></script>
<script src="/istanbulcityhotels/js/jquery.js"></script>
</head>

jquery.yiiactiveform.js jquery.js 之前调用。它应该叫做AFTER jquery.js。 它有点困惑。我该怎么办?

其他 是的,我读了this个问题因为标题非常相似,但问题是相同。

谢谢。

3 个答案:

答案 0 :(得分:3)

您不应该在布局中手动包含jQuery。而不是这样做,而是从Controller基类中包含它:

public function init() {
    Yii::app()->clientScript->registerCoreScript('jquery');
}

不要忘记从具体的控制器中调用parent::init()

答案 1 :(得分:1)

似乎CActiveForm使用title常量在CClientScript::POS_HEAD标记之前插入脚本。因此,解决方法是添加此代码

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

到主布局文件的顶部,以阻止它加载jquery,然后在加载jquery文件后放入title标记

<script src="<?php echo Yii::app()->request->baseUrl; ?>/js/jquery.js"></script>

这样jquery.yiiactiveform.js将在jquery之后立即加载。

答案 2 :(得分:-2)

只需将自己的jquery放在标签标题上, 就像这样:

<script src="/istanbulcityhotels/js/jquery.js"></script>
<title>your title</title>