我在我的一个项目中使用Yii框架,我想将jQuery Form plugin与Yii客户端内置验证一起使用。
我不能让他们一起工作。如果我使用这个简单的js代码设置jQuery form plugin
:
$('#myform-id').ajaxForm();
执行客户端验证,但即使验证失败,也不会停止表单提交。我想这与Yii客户端验证库和jQuery表单插件在表单上绑定相同的“submit”事件有关。
仅供参考,我仔细检查过FireBug和Chrome控制台没有js错误。
我想知道是否有人遇到过同样的问题并且解决了这个问题。
答案 0 :(得分:5)
我这样解决了:
Yii Active Form初始代码:
<?php $form = $this->beginWidget('CActiveForm', array(
'id'=>'user-form',
'enableClientValidation'=>true,
'clientOptions' => array(
'validateOnSubmit'=>true,
'validateOnChange'=>false,
'afterValidate'=>'js:submiAjaxForm'
)
)); ?>
在同一页面中,我添加了这个js代码,通过jquery表单插件提交表单:
function submitAjaxForm(form, data, hasError)
{
if(!hasError)
{
$('#user-form').ajaxSubmit(
{
// ajax options here
});
}
}
答案 1 :(得分:0)
尝试在提交事件中停止传播:
$('#your-form').submit(function(e){
e.stopPropagation();
... some other code ...
});
答案 2 :(得分:0)
在客户端,你可以
<?php echo CHtml::activeTextField($model, 'text', array(
'placeholder'=>$model->getAttributeLabel('text'),
'class'=>'form-control'
<script> )); ?>
function Validate(field){
var _this = field;
var errorDiv = _this.parent().find('.errors');
var attr = [];
_this.each(function(){
var match = $(this).attr('name').match(/\[(.*?)\]/);
attr.push(match[1]);
})
jQuery.ajax({
type: 'POST',
url: 'url/',
data: 'ajax=keyup&'+_this.serialize()+'&attr='+attr,
cache: false,
processData: false,
success: function(data){
data=JSON.parse(data);
if(data.success){
_this.addClass('green');
errorDiv.html('');
}else{
_this.addClass('red');
errorDiv.html(data[attr][0]);
}
}
});
}
var delay = (function(){
var Timer = 0;
return function(callback, ms){
clearTimeout (Timer);
Timer = setTimeout(callback, ms);
};
})(); //if you want to delay
$('#traveler_info input').keyup(function(){
var _this = $(this);
timeout = setTimeout(function(){
Validate(_this,'Travelers')
},1000)
});
` 在SiteController中
public function actionAjaxvalidation($type = null)
{
$model = new Travelers;
if( isset($_POST['Travelers'], $_POST['attr']) )
{
/*
* @params Model->value $attr
*
*/
$attr = $_POST['attr'];
$model->$attr = $_POST['Travelers'][$attr];
if( $model->validate(array($attr)) )
{
echo json_encode(['success'=>true]);
}
else
{
echo json_encode( $model->errors );
}
Yii::app()->end();
}
}