jquery+ajax验证不通过也提交表单问题处理


Posted in Javascript onDecember 12, 2014

validationEngine给我们为前端的表单验证减少了很大的工作量.大部分情况我们使用validationEngine验证表单的形式有几种方式:

1 使用正常的表单提交.这种情况validationEngine验证不通过是不会提交表单的.

2 使用ajax提交表单,但是没有使用ajax验证.

         这种方式也比较简单,在我们使用ajax请求前检查验证是否通过就可以,例如:

//验证不通过时return  

    if(!$("form#ajaxForm").validationEngine("validate")) return ;  

    $.ajax({  

       type: "POST",  

       url: $("#ajaxForm").attr("action"),  

       data: $("#ajaxForm").serialize(),  

       dataType: "html",  

       success: function(data){  

          xxxx     }  

    }); 

3 使用正常表单提交,但是有使用ajax验证,这种方式有点让人纠结了.当我们提交表单时ajax验证不通过也能提交表单,关于这种情况,网上很多例子是改源码的,下面是截图:

.这种方法对于目前这种情况可行,这种修改的方式本身就不建议,可能对其它地方产生影响.我发现的其中一个就是当下面这种情况时:

function beforeCall(form,options){  

    if(window.console){  

        console.log("表单提交验证通过后,Ajax 提交之前的回调");  

    };  

    return true;  

};  

//   

function ajaxValidationCallback(status,form,json,options){  

    if(window.console){  

        console.log(status);  

    };  

    if(status === true){  

        alert("the form is valid!");  

    }  

};  

jQuery(document).ready(function(){  

    jQuery("#formID").validationEngine({  

        ajaxFormValidation: true,  //是否使用 Ajax 提交表单  

        ajaxFormValidationMethod: 'post',  //设置 Ajax 提交时,发送数据的方式  

        onAjaxFormComplete: ajaxValidationCallback,  //表单提交,Ajax 验证完成后  

        onBeforeAjaxFormValidation: beforeCall  //表单提交验证通过后,Ajax 提交之前的回调  

    });  

}); 

beforeCall 这个方法是不会调用的是不会调用的,所以还是不能使用

4 使用ajax验证并且使用ajax提交表单,这个方式就让人纠结了,上面修改源码的方式就不好用了.

对于第三种和第四种方式,解决方式如下:

在使用ajax验证的表单form标签上加上自定义属性control="userName,email" 属性值为要使用ajax验证的控件id(多个控件使用逗号分隔开).

<form method="post" id="ajaxForm2Controls" action="admin/user/savePro.htm" control="userName">

在每个需要验证的控件上加上两个属性url(ajax请求的地址)和errror(不通过时的提示信息)

<input class="textBox validate[required,minSize[6],maxSize[128],custom[onlyLetterNumber]]" type="text" name="userName" id="userName" maxlength="128" url="admin/user/uniqueName.htm" error="用户已存在..."/> 

javascript当中声明两个全局数组

var controlId = new Array();  //保存验证不通过的控件ID

var errors = new Array() ;  //保存验证不通过的提示信息

思路是这个的获取form标签上的control属性上的值(使用逗号分隔获取每个控件ID),使用ajax遍历请求,当验证不通过时 将控件ID和提示信息添加到controlId 和 errors 中,并且提示信息.当提交表单时判断controlId 是否为空,不为空则循环显示提示信息.

$(function() {    

    var ajaxForm2Controls = $("form#ajaxForm2Controls") ;  

    //表单提交时  

    $(ajaxForm2Controls).submit(function() {  

        ajaxForm2Control(ajaxForm2Controls) ;  

        return false ;  

    }) ;  

    //失去焦点时验证控件  

    valControls(ajaxForm2Controls) ;  

}); 

 表单提交方法:

function ajaxForm2Control(obj) {  

    //当存在错误信息时返回,找显示错误信息  

    if(controlId.length > 0) {  

        alertinfo() ;  

        return false ;   

    }  

    if(!$(obj).validationEngine("validate")) return false;  //验证没有使用ajax验证的控件(不是ajax验证的字段是可以正常验证的, 不通过就返回)  

    $.ajax({  

       type: "POST",  

       url: $(obj).attr("action"),  

       data: $(obj).serialize(),  

       dataType: "html",  

       success: function(data){  

           xxxxxx  

       }  

    });  

} 

 为表单添加焦点事件

//表单需要验证的控件  

function valControls(ajaxForm2Controls) {  

    //获取需要使用ajax验证的控件  

    var controlsStr = ajaxForm2Controls.attr("control") ;  

    //属性未定义时返回  

    if(typeof(controlsStr) === "undefined" || controlsStr.length <= 0) return ;  

    //分隔获取控件ID  

    var controls = controlsStr.split(/,/g) ;  

    for(var i in controls) {  

        //添加焦点离开事件  

        $("#" + controls[i]).blur(function() {  

          if($(this).val().length <= 0) return false;  

            //重新设置数组  

            controlId.length = 0;   

            errors.length = 0 ;  

            //错误信息  

            var error = $(this).attr("error") ;  

            $.ajax({  

               type: "GET",  

               url: $(this).attr("url"),  

               data: $(this).serialize(),  

               dataType: "text",  

               success: function(data){  

                   if(data==="true") {  

                     //验证不通过将错误信息放入数组中  

                       controlId.push(controls[i]);  

                       errors.push(error) ;  

                       //提示信息  

                       alertinfo() ;  

                   }  

               }  

            });  

        }) ;  

    }  

} 
  

错误提示信息:

//弹出信息  

function alertinfo() {  

    if(controlId.length > 0) {  

        for(var i in controlId) {  

            //validationEngine方法,为指定ID弹出提示.  

                        //用法:<span style="">$("#id").validationEngine("showPrompt","提示内容","load");  

                           //<span style="">在该元素上创建一个提示,3 种状态:"pass", "error", "load"</span></span>  

            $("#" + controlId[i]).validationEngine("showPrompt", errors[i], "error");  

        }   

    }  

} 

这样当我们无论是第三种方式还是第四种方式提交表单,提交前调用controlId是否有值就可以了.

Javascript 相关文章推荐
JQuery学习笔录 简单的JQuery
Apr 09 Javascript
js获取时间(本周、本季度、本月..)
Nov 22 Javascript
浅谈javascript中call()、apply()、bind()的用法
Apr 20 Javascript
浅谈JavaScript中运算符的优先级
Jul 07 Javascript
Node.js的Express框架使用上手指南
Mar 12 Javascript
深入解析JavaScript中的arguments对象
Jun 12 Javascript
jQuery使用Layer弹出层插件闪退问题
Dec 22 Javascript
VUE-Table上绑定Input通过render实现双向绑定数据的示例
Aug 27 Javascript
Javascript call及apply应用场景及实例
Aug 26 Javascript
VUE Elemen-ui之穿梭框使用方法详解
Jan 19 Javascript
教你使用vscode 搭建react-native开发环境
Jul 07 Javascript
前端实现滑动按钮AJAX与后端交互的示例代码
Feb 24 Javascript
js 左右悬浮对联广告代码示例
Dec 12 #Javascript
原生JavaScript+LESS实现瀑布流
Dec 12 #Javascript
jquery禁止回车触发表单提交
Dec 12 #Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
Dec 12 #Javascript
windows8.1+iis8.5下安装node.js开发环境
Dec 12 #Javascript
jQuery 和 CSS 的文本特效插件集锦
Dec 12 #Javascript
js使用递归解析xml
Dec 12 #Javascript
You might like
解析mysql left( right ) join使用on与where筛选的差异
2013/06/18 PHP
php微信支付之APP支付方法
2015/03/04 PHP
php函数传值的引用传递注意事项分析
2016/06/25 PHP
Laravel 5.4前后台分离,通过不同的二级域名访问方法
2019/10/13 PHP
解决在laravel中auth建立时候遇到的问题
2019/10/15 PHP
Thinkphp集成抖音SDK的实现方法
2020/04/28 PHP
setInterval,setTimeout与jquery混用的问题
2013/04/08 Javascript
js动态设置鼠标事件示例代码
2013/10/30 Javascript
Jquery对数组的操作技巧整理
2014/03/25 Javascript
jquery-syntax动态语法着色示例代码
2014/05/14 Javascript
javascript中sort() 方法使用详解
2015/08/30 Javascript
理解javascript定时器中的单线程
2016/02/23 Javascript
JS函数的定义与调用方法推荐
2016/05/12 Javascript
jquery把int类型转换成字符串类型的方法
2016/10/07 Javascript
微信小程序(三):网络请求
2017/01/13 Javascript
Vue通过input筛选数据
2020/10/26 Javascript
BootStrap selectpicker后台动态绑定数据
2017/06/01 Javascript
Vue非父子组件通信详解
2017/06/12 Javascript
vue自动路由-单页面项目(非build时构建)
2019/04/30 Javascript
关于Layui Table隐藏列问题
2019/09/16 Javascript
详解webpack的文件监听实现(热更新)
2020/09/11 Javascript
Vue实现菜单切换功能
2020/11/08 Javascript
python中self原理实例分析
2015/04/30 Python
python里使用正则的findall函数的实例详解
2017/10/19 Python
Python cv2 图像自适应灰度直方图均衡化处理方法
2018/12/07 Python
python在回调函数中获取返回值的方法
2019/02/22 Python
Python定时任务随机时间执行的实现方法
2019/08/14 Python
史上最详细的Python打包成exe文件教程
2021/01/17 Python
CSS3实现粒子旋转伸缩加载动画
2016/04/22 HTML / CSS
经理秘书找工作求职信
2013/12/19 职场文书
大学生蛋糕店创业计划书
2014/01/13 职场文书
霸王洗发水广告词
2014/03/14 职场文书
2014年商场国庆节活动策划方案
2014/09/16 职场文书
爱的承诺书
2015/01/20 职场文书
如何解决springcloud feign 首次调用100%失败的问题
2021/06/23 Java/Android
CentOS7安装GlusterFS集群以及相关配置
2022/04/12 Servers