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 使用手册(六)
Sep 23 Javascript
在JavaScript里嵌入大量字符串常量的实现方法
Jul 07 Javascript
js获取指定日期周数以及星期几的小例子
Jun 27 Javascript
Javascript学习指南
Dec 01 Javascript
JavaScript中setFullYear()方法的使用详解
Jun 11 Javascript
jquery mobile 实现自定义confirm确认框效果的简单实例
Jun 17 Javascript
js 弹出对话框(遮罩)透明,可拖动的简单实例
Jul 11 Javascript
Javascript+CSS3实现进度条效果
Oct 28 Javascript
Bootstrap table表格简单操作
Feb 07 Javascript
JS监控关闭浏览器操作的实例详解
Sep 12 Javascript
node.js微信小程序配置消息推送的实现
Feb 13 Javascript
Vue仿微信app页面跳转动画效果
Aug 21 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
一个简单且很好用的php分页类
2013/10/26 PHP
php保存信息到当前Session的方法
2015/03/16 PHP
微信支付的开发流程详解
2016/09/13 PHP
PHP实现图片批量打包下载功能
2017/03/01 PHP
PHP7如何开启Opcode打造强悍性能详解
2018/05/11 PHP
PHP addslashes()函数讲解
2019/02/03 PHP
Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法
2019/04/02 PHP
Add Formatted Text to a Word Document
2007/06/15 Javascript
文本框只能选择数据到文本框禁止手动输入
2013/11/22 Javascript
基于JavaScript FileReader上传图片显示本地链接
2016/05/27 Javascript
javascript实现的上下无缝滚动效果
2016/09/19 Javascript
微信小程序 Template详解及简单实例
2017/01/05 Javascript
前端构建工具之gulp的配置与搭建详解
2017/06/12 Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
2018/07/24 jQuery
jquery弹窗时禁止body滚动条滚动的例子
2019/09/21 jQuery
Vue实现多标签选择器
2019/11/28 Javascript
js实现鼠标点击页面弹出自定义文字效果
2019/12/24 Javascript
记录微信小程序 height: calc(xx - xx);无效问题
2019/12/30 Javascript
JavaScript编写开发动态时钟
2020/07/29 Javascript
[12:21]VICI vs TNC (BO3)
2018/06/07 DOTA
使用Python的Flask框架来搭建第一个Web应用程序
2016/06/04 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
2016/09/19 Python
Python实现压缩和解压缩ZIP文件的方法分析
2017/09/28 Python
python2使用bs4爬取腾讯社招过程解析
2019/08/14 Python
学生如何注册Pycharm专业版以及pycharm的安装
2020/09/24 Python
python 实现音频叠加的示例
2020/10/29 Python
python多线程和多进程关系详解
2020/12/14 Python
La Senza官网:北美顶尖性感内衣品牌
2018/08/03 全球购物
轻松制作精彩视频:Animoto
2018/09/19 全球购物
同步和异步有何异同,在什么情况下分别使用他们?举例说明
2014/02/27 面试题
中专毕业生自我鉴定
2013/11/21 职场文书
工作表扬信的范文
2014/01/10 职场文书
自我反省检讨书
2014/01/23 职场文书
上市公司财务总监岗位职责
2015/04/03 职场文书
政协常委会议主持词
2015/07/03 职场文书
uwsgi+nginx代理Django无法访问静态资源的解决
2021/05/10 Servers