转自 http://mylfd.iteye.com/blog/2007227

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

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

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

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

  1. //验证不通过时return
  2. if(!$("form#ajaxForm").validationEngine("validate")) return ;
  3. $.ajax({
  4. type: "POST",
  5. url: $("#ajaxForm").attr("action"),
  6. data: $("#ajaxForm").serialize(),
  7. dataType: "html",
  8. success: function(data){
  9. xxxx     }
  10. });

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

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

  1. function beforeCall(form,options){
  2. if(window.console){
  3. console.log("表单提交验证通过后,Ajax 提交之前的回调");
  4. };
  5. return true;
  6. };
  7. //
  8. function ajaxValidationCallback(status,form,json,options){
  9. if(window.console){
  10. console.log(status);
  11. };
  12. if(status === true){
  13. alert("the form is valid!");
  14. }
  15. };
  16. jQuery(document).ready(function(){
  17. jQuery("#formID").validationEngine({
  18. ajaxFormValidation: true,  //是否使用 Ajax 提交表单
  19. ajaxFormValidationMethod: 'post',  //设置 Ajax 提交时,发送数据的方式
  20. onAjaxFormComplete: ajaxValidationCallback,  //表单提交,Ajax 验证完成后
  21. onBeforeAjaxFormValidation: beforeCall  //表单提交验证通过后,Ajax 提交之前的回调
  22. });
  23. });

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

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

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

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

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

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

  1. <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
是否为空,不为空则循环显示提示信息.

  1. $(function() {
  2. var ajaxForm2Controls = $("form#ajaxForm2Controls") ;
  3. //表单提交时
  4. $(ajaxForm2Controls).submit(function() {
  5. ajaxForm2Control(ajaxForm2Controls) ;
  6. return false ;
  7. }) ;
  8. //失去焦点时验证控件
  9. valControls(ajaxForm2Controls) ;
  10. });

表单提交方法:

  1. function ajaxForm2Control(obj) {
  2. //当存在错误信息时返回,找显示错误信息
  3. if(controlId.length > 0) {
  4. alertinfo() ;
  5. return false ;
  6. }
  7. if(!$(obj).validationEngine("validate")) return false;  //验证没有使用ajax验证的控件(不是ajax验证的字段是可以正常验证的, 不通过就返回)
  8. $.ajax({
  9. type: "POST",
  10. url: $(obj).attr("action"),
  11. data: $(obj).serialize(),
  12. dataType: "html",
  13. success: function(data){
  14. xxxxxx
  15. }
  16. });
  17. }

为表单添加焦点事件

  1. //表单需要验证的控件
  2. function valControls(ajaxForm2Controls) {
  3. //获取需要使用ajax验证的控件
  4. var controlsStr = ajaxForm2Controls.attr("control") ;
  5. //属性未定义时返回
  6. if(typeof(controlsStr) === "undefined" || controlsStr.length <= 0) return ;
  7. //分隔获取控件ID
  8. var controls = controlsStr.split(/,/g) ;
  9. for(var i in controls) {
  10. //添加焦点离开事件
  11. $("#" + controls[i]).blur(function() {
  12. if($(this).val().length <= 0) return false;
  13. //重新设置数组
  14. controlId.length = 0;
  15. errors.length = 0 ;
  16. //错误信息
  17. var error = $(this).attr("error") ;
  18. $.ajax({
  19. type: "GET",
  20. url: $(this).attr("url"),
  21. data: $(this).serialize(),
  22. dataType: "text",
  23. success: function(data){
  24. if(data==="true") {
  25. //验证不通过将错误信息放入数组中
  26. controlId.push(controls[i]);
  27. errors.push(error) ;
  28. //提示信息
  29. alertinfo() ;
  30. }
  31. }
  32. });
  33. }) ;
  34. }
  35. }

错误提示信息:

  1. //弹出信息
  2. function alertinfo() {
  3. if(controlId.length > 0) {
  4. for(var i in controlId) {
  5. //validationEngine方法,为指定ID弹出提示.
  6. //用法:<span style="">$("#id").validationEngine("showPrompt","提示内容","load");
  7. //<span style="">在该元素上创建一个提示,3 种状态:"pass", "error", "load"</span></span>
  8. $("#" + controlId[i]).validationEngine("showPrompt", errors[i], "error");
  9. }
  10. }
  11. }

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

jquery validationEngine 使用ajax验证不通过也提交表单的更多相关文章

  1. Jquery Ajax自定义无刷新提交表单Form

    Jquery的$.ajax方法可以实现ajax调用,要设置url,post,参数等. 如果要提交现有Form需要写很多代码,何不直接将Form的提交直接转移到ajax中呢. 以前的处理方法 如Form ...

  2. Jquery Validate不是用submit按钮提交表单,使用a标签js代码都可以

    不多说,上代码. $("#form").validate(); $("#btn").click(function() { if($("#form&qu ...

  3. 无法在提交表单前通过ajax验证解决办法

    博主在一个小项目中,要实现注册表单无刷新验证用户名或密码,但是发现不管怎么样都无法在先通过ajax验证之前不提交表单. 例如:一个简单的验证函数 function check(){ $.post(&q ...

  4. jquery ajax异步提交表单数据

    使用jquery的ajax方法可以异步提交表单,成功后后台返回json数据,回调函数处理,可以不用刷新页面,达到异步的目的: 处理表单的数据可以用serialize()方法进行序列化,而如果提交的数据 ...

  5. JQuery - 提交表单

    [JavaScript] JQuery异步提交表单与文件上传 Jquery.form.js是一个可以异步提交表单及上传文件的插件. 文档地址:http://jquery.malsup.com/form ...

  6. php 提交表单

    滴答…滴答…的雨,欢迎大家光临我的博客. 学习是快乐的,教育是枯燥的. 博客园   首页   博问   闪存     联系   订阅  管理 随笔-58  评论-2017  文章-5  trackba ...

  7. 关于ajax直接提交表单jQuery .validator验证不起作用问题

    之前用$.ajax(function(){});直接提交表单,而表单验证不通过也能提交. $(document).ready(function(){ $.ajax({       url:" ...

  8. 第一百八十六节,jQuery,验证表单插件,Ajax 表单插件,验证和提交表单

    jQuery,验证表单插件,Ajax 表单插件,验证和提交表单 HTML <form id="reg" method="post" action=&quo ...

  9. JQuery ajax提交表单及表单验证

    JQuery ajax提交表单及表单验证 博客分类: jsp/html/javascript/ajax/development Kit 开源项目   注:经过验证,formValidator只适合一个 ...

随机推荐

  1. Java代码整理

  2. CSS的W3C标准的盒子模型和低版本IE浏览器的盒子模型

    CSS中盒子模型的组成由内容区(content).内边距(padding).边框(border).外边距(margin)组成.内边距可细分为 padding-top.padding-right.pad ...

  3. leetcode Valid Sudoku python

    #数独(すうどく,Sūdoku)是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个粗线宫内的数字均含1-9,不重复.#数独盘 ...

  4. Oracle数据库的启动和关闭

    深刻理解Oracle数据库的启动和关闭 Oracle数据库提供了几种不同的数据库启动和关闭方式,本文将详细介绍这些启动和关闭方式之间的区别以及它们各自不同的功能. 一.启动和关闭Oracle数据库 对 ...

  5. Viewing the Raw SQL Statement(xcode で)

    Thanks to Core Data. Even without learning SQL and database, you’re able to perform create, select, ...

  6. TCP 监控工具 TCPMonitor

    1, membrane monitor Download: http://www.membrane-soa.org/downloads/archive/monitor-archive.htm 2, a ...

  7. MYSQL中的普通索引,主健,唯一,全文索引区别

    MYSQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录.表里面的记 ...

  8. 从零开始PHP学习 - 第四天

    写这个系列文章主要是为了督促自己  每天定时 定量消化一些知识! 同时也为了让需要的人 学到点啥~! 本人技术实在不高!本文中可能会有错误!希望大家发现后能提醒一下我和大家! 偷偷说下 本教程最后的目 ...

  9. 分享一个自用的 Inno Setup 软件打包脚本

    此脚本支持打包mysql.安装mysql服务.安装windows服务.操作ini文件.操作注册表.高效压缩文件等功能,基本能满足常用的软件打包需求. ;定义各种常量 #define MyAppName ...

  10. Oracle EBS-SQL (SYS-15):查询表空间2.sql

    /*表空间查询*/ SELECT d.status "状态", d.tablespace_name "名称", d.contents "类型" ...