热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

jquery.validate1.7版本(remote方法)bug修复方法(二)

前几天向大家介绍了关于jquery.validate1.7版本(remote方法)bug修复方法,那段时间恰逢一个产品上线,在表单验证时,唯独remote验证不能正常工作.因此在网上找到了

     前几天向大家介绍了关于jquery.validate 1.7版本(remote方法)bug修复方法,那段时间恰逢一个产品上线,在表单验证时,唯独remote验证不能正常工作.因此在网上找到了该解决办法.说实话,外国友人的这个解决方法,还是不太懂,但还是感谢他才能顺利交付任务.今天有时间,做了一些自己的分析,与大家分享.

     使用工具:firefox,firebug.

     以下是一个简单的执行环境(引用库:jquery-1.5.1.js,jquery.validate-1.7.js):

客户端:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>





    
    
    
    


    
    

服务端:

<%@ WebHandler Language="C#" Class="Handler" %>

using System;
using System.Web;

public class Handler : IHttpHandler {
    
    public void ProcessRequest (HttpContext context) {
        context.Response.COntentType= "text/plain";
        string key = context.Request["key"];
        if (key == "abc@qq.com")
        {
            context.Response.Write("false");
        }
        else
        {
            context.Response.Write("true");
        }
    }
 
    public bool IsReusable {
        get {
            return false;
        }
    }

}

先做一个非空测试,不输入任何内容,点击提交,如下结果.

QQ截图未命名

 

非空验证正常,再来测试remote验证,输入cdf@qq.com,点击提交,如下结果

邮箱测试

 

没有任何反应,我们尝试检测抛出的异常,因为remote的核心是ajax到远程服务器验证.如下代码检测jquery抛出异常:

$(function (){
            $("#form1").validate({
                rules:{
                    email:{
                        required:true
                        ,remote:{
                            url:"Handler.ashx"
                            ,type:"post"
                            ,data:{"key":function (){
                                return $("#email").val() ;
                            }
                            ,error:function (a,b,c){
                                alert(a + " " + b + " " + c);
                            }
                         }
                         
                       }
                    }
                }
                ,messages:{
                    email:{
                        remote:"该邮箱已存在"
                    }
                } 
            })
        })

在error代码块中捕获到了错误,但没有任何提示,如下:

捕获异常

     可能作者并没有把异常具体信息抛出来.没关系,我们可以在jquery.validate源码中去捕获.打开jquery.validate源文件,找到如下部份,在底部添加捕获异常代码:

//935左右
				$.ajax($.extend(true, {
					url: param,
					mode: "abort",
					port: "validate" + element.name,
					dataType: "json",
					data: data,
					success: function(response) {
						validator.settings.messages[element.name].remote = previous.originalMessage;
						var valid = respOnse=== true;
						if ( valid ) {
							var submitted = validator.formSubmitted;
							validator.prepareElement(element);
							validator.formSubmitted = submitted;
							validator.successList.push(element);
							validator.showErrors();
						} else {
							var errors = {};
							var message = (previous.message = response || validator.defaultMessage( element, "remote" ));
							errors[element.name] = $.isFunction(message) ? message(value) : message;
							validator.showErrors(errors);
						}
						previous.valid = valid;
						validator.stopRequest(element, valid);
					}
					//添加捕获异常部分(959行左右)
					,error:function (a,b,c){
					    alert(b + " " + c) ;
					}
				}, param));

保存后,重新测试,如下结果:

成功异常

这是一个类型转换错误,重新检查一下jquery.validate ajax部份源份,发现一个奇怪的地方:

$.ajax($.extend(true, {
	url: param,
	mode: "abort",
	port: "validate" + element.name,
	dataType: "json",

       看dataType参数部份,作者已经将服务端响应格式固定为json格式.同时查阅官方remote 文档,其中对返回值部份解释的很模糊,虽然强调了返回值应该为json格式,但也提到使用true, false, 或着一个字符串,undefined做为返回,这与dataType:json有冲突.

remote解释

  为了确定该冲突是否存在,使用firebug做了一些测试,分别在如下部份打断点:

  1.      jquery.validate.js源文件, 935行,951
  2.      jquery.1.51.js源文件 6564行

jquery.validate断点

jquery.js断点

会依次命中 935,6564,(951暂不会命中).

       其中在命中6564行时,我们可以确定服务端响应正常,同时在此处发生类型转换错误,抛出异常.该异常正是我们在jquery.validate 源码中捕获的那个异常.

     因为服务端返回的是true或者false,是文本格式,因此我们将jquery.validate源文件中,dataType的json类型改为text,如下:

json改为text

我们再次测试,已经没有错误了,此时在success方法中打断点能够命中.如图:

全等提示

     如代码  var valid = respOnse=== true; response 为字符型, valid会永远为false.做如下修改:

validator.settings.messages[element.name].remote = previous.originalMessage;
var valid = respOnse== "true";

    此时,验证一个合法邮箱的逻辑测试结果正常.我们再来看看不合法邮箱提示:

false

直接输出false了,此时951处断点命中了

优先使用不合法

在知道输出false的原因了后,我们再把服务端做如下修改:

public void ProcessRequest (HttpContext context) {
        context.Response.COntentType= "text/plain";
        string key = context.Request["key"];
        if (key == "abc@qq.com")
        {
            context.Response.Write("该邮箱已存在");
        }
        else
        {
            context.Response.Write("true");
        }
    }

  此时非法提示结果:

服务端输出不合法原因

    写到此外,jquery.validate的remote方法修复过程完成了.

      当然大家或许也有疑问,例如在messages中remote 提示信息岂不是多余了. 这个取决于使用者的偏好.如果大家和作者想法一样,希望在服务端提示非法原因.那就不用修改了.如下是客户端控置remote异常提示的修改方法:

//var message = (previous.message = response || validator.defaultMessage( element, "remote" ));
  var message =  validator.defaultMessage( element, "remote" );

推荐阅读
  • 本文探讨了如何利用 jQuery 的 JSONP 技术实现跨域调用外部 Web 服务。通过详细解析 JSONP 的工作原理及其在 jQuery 中的应用,本文提供了实用的代码示例和最佳实践,帮助开发者解决跨域请求中的常见问题。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 本文探讨了使用JavaScript在不同页面间传递参数的技术方法。具体而言,从a.html页面跳转至b.html时,如何携带参数并使b.html替代当前页面显示,而非新开窗口。文中详细介绍了实现这一功能的代码及注释,帮助开发者更好地理解和应用该技术。 ... [详细]
  • 在使用 jQuery 的 `html()` 方法时,我发现了一个奇怪的现象:该方法无法完整地插入指定的字符串内容。具体来说,当尝试插入较长或包含特殊字符的字符串时,部分内容可能会被截断或丢失。这一问题可能与 jQuery 对字符串的处理方式有关,建议在实际应用中进行充分测试以确保数据完整性。 ... [详细]
  • 尝试在数据库中查询数据并在datatables中异步显示时总是报错。有人帮我看下吗,好像是这个json的格式出问题,我看了firebug,应该是servlet返回的json数据格式问题,但因为新 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 本文最初发表在Thorben Janssen的Java EE博客上,每周都会分享最新的Java新闻和动态。 ... [详细]
  • 为开发者提供了一系列实用的参考网站和资源链接,包括HTML速查手册( 和 ),帮助开发者快速查找和学习相关技术知识。此外,还涵盖了其他重要的开发工具和文档,为编程工作提供全面支持。 ... [详细]
  • 基于Java和SSM框架的志愿者管理平台源代码分析与实现
    本研究针对基于Java和SSM框架的志愿者管理平台进行了详细的源代码分析与实现。该平台属于Java Web项目,采用Java EE技术栈,并结合了Spring、Spring MVC和MyBatis三大核心框架(非开源)。项目名称为“基于SSM的志愿者管理系统”,旨在提升志愿者管理的效率和规范性。通过对系统架构、模块设计及关键代码的深入解析,本文为开发者提供了全面的技术参考和实践指导。 ... [详细]
  • 在HTML5应用中,Accordion(手风琴,又称抽屉)效果因其独特的展开和折叠样式而广泛使用。本文探讨了三种不同的Accordion交互效果,通过层次结构优化信息展示和页面布局,提升用户体验。这些效果不仅增强了视觉效果,还提高了内容的可访问性和互动性。 ... [详细]
  • Thisquestionalreadyhasananswerhere:这个问题已经有了答案:HowcanIdisplayaJavaScriptobje ... [详细]
author-avatar
hustjs
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有