今天在用Jquery改造之前的JS代码过程中,遇到了一个让我懵逼了三小时的问题。

问题的关键在 this 的使用。在这里与大家分享一下。并且分享一下我做表单提交的检查代码

错误代码如下:

$("form").submit(function () {
return checkName() && checkAge() && checkEmail() && checkQq();
})
// 验证姓名
$('#name').blur(checkName);
function checkName() {
// 验证姓名验证正则
var reg = /^[\u4E00-\u9FA5\uf900-\ufa2d·s]{2,20}$/;
var flag = reg.test($('#name').val());
if( !flag ){
$('#error_name').remove();
$(this).after("<p id='error_name' class='error_msg'>姓名格式不正确 </p>");
} else {
$('#error_name').remove();
}
return flag;
}

分析:

  • 这段代码在执行过程中,验证姓名的离焦事件是可以成功触发并执行监听器代码,
  • 然而提交事件在执行 checkName() 方法过程中,由于 $(this) 语句在执行过程中,this 对象指代的是并非Input标签对象。因此代码不能执行到 return 行。无法阻止表单提交。
  • 那提交事件执行 checkName 方法时,this指代的是什么呢?我们试着弹一下它:

    在代码中添加以下代码:

        alert("我是谁?"+this);
    $(this).after("<p id='error_name' class='error_msg'>姓名格式不正确 </p>");

    在离焦事件触发后,窗口弹出:



    而当提交事件触发后,窗口弹出:



    至此,问题就真相大白了。在提交事件触发时,监听器代码中 this 对象指代的是 window 对象,程序执行 after()会出异常。导致 return 语句不能执行。 因此解决问题的方法也很明确:修改this。这里我将this改成了'#name'以 id 选择器为 input 标签'造'一个弟弟.

    以下是完整代码:

     <script>
    // JQuery 完成表单检验
    $(function () {
    // 表单提交函数。检查name&age&email&qq等属性符合正则后方可提交
    $("form").submit(function () {
    return checkName() && checkAge() && checkEmail() && checkQq();
    })
    //验证姓名
    $('#name').blur(checkName);
    function checkName() {
    // 验证姓名验证正则
    var reg = /^[\u4E00-\u9FA5\uf900-\ufa2d·s]{2,20}$/; var flag = reg.test($('#name').val()); if( !flag ){
    $('#error_name').remove();
    $('#name').after("<p id='error_name' class='error_msg'>姓名格式不正确 </p>");
    } else {
    $('#error_name').remove();
    } return flag;
    }
    //验证年龄
    $('#age').blur(checkAge)
    function checkAge() {
    // 验证姓名验证正则
    var reg = /^\d{1,3}$/; var flag = reg.test($('#age').val()); if (!flag) {
    $('#error_age').remove();
    $('#age').after("<p id='error_age' class='error_msg'>年龄格式不正确 </p>");
    } else {
    $('#error_age').remove();
    }
    return flag;
    }
    //验证QQ
    $('#qq').blur(checkQq)
    function checkQq() {
    // 验证姓名验证正则
    var reg = /^\d{6,20}$/; var flag = reg.test($('#qq').val()); if( !flag ){
    $('#error_qq').remove();
    $('#qq').after("<p id='error_qq' class='error_msg'>qq格式不正确 </p>");
    } else {
    $('#error_qq').remove();
    }
    return flag;
    }
    //验证Email
    $('#email').blur(checkEmail)
    function checkEmail() {
    // 验证验证码正则
    var reg = /^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,4}$/;
    var flag = reg.test($('#email').val());
    if (!flag) {
    $('#error_email').remove();
    $('#email').after("<p id='error_email' class='error_msg'>邮箱格式不正确 </p>");
    } else {
    $('#error_email').remove();
    }
    return flag;
    }
    });
    </script>

    记录一次Jquery中 this 关键字使用出现的问题的更多相关文章

    1. jQuery中防止表单提交两次的方法

      遇到过表单提交两次的情况,做个记录: 解决场景:首先是表单验证,其次是防止多次提交表单: jQuery中插件:validate_submitHandler_plugin,具体的可以使用关键字搜索: 使 ...

    2. JQuery中的工具函数总结

      前提引入 前提当然也是要引入Jquery啦... <script src="http://libs.baidu.com/jquery/1.9.0/jquery.js" typ ...

    3. JavaScript jQuery 中定义数组与操作及jquery数组操作

      首先给大家介绍javascript jquery中定义数组与操作的相关知识,具体内容如下所示: 1.认识数组 数组就是某类数据的集合,数据类型可以是整型.字符串.甚至是对象Javascript不支持多 ...

    4. JQuery中$.each 和$(selector).each()的区别详解

      PS:晚上在写页面时,发现了一个问题,$.each 和$(selector).each()有哪些区别?百度搜索关键词,首页显示出来一些前人的经验,总结一下,发上来. 1.$(selector).eac ...

    5. jquery中的ajax参数说明

      本文只作为记录,方便以后查阅. 内容原地址:$.ajax( )方法详解及案例_JQuery_wodi0007的博客_程序员博客网 http://u.cxyblog.com/28/article-aid ...

    6. 四、jquery中的事件与应用

      当用户浏览页面时,浏览器会对页面代码进行解释或编译--这个过程实质上是通过时间来驱动的,即页面在加载时,执行一个Load事件,在这个事件中实现浏览器编译页面代码的过程.时间无论在页面元素本身还是在元素 ...

    7. jQuery:详解jQuery中的事件(一)

      之前用过一些jQuery的动画和特效,但是用到的部分也不超过10%的样子,感觉好浪费啊——当然浪费的不是jQuery,而是Web资源.后来就想深入研究下jQuery的内部机理,读过两遍jQuery源代 ...

    8. JQuery中each()的使用方法说明

      JQuery中each()的使用方法说明 对于jQuery对象,只是把each方法简单的进行了委托:把jQuery对象作为第一个参数传递给jQuery的each方法.换句话说:jQuery提供的eac ...

    9. jQuery中的map()方法

      jQuery中map()方法的使用格式为:$(selector).map(callback(index,domElement)). 将在每一个被选元素上执行map()方法中设置的回调函数,在回调函数中 ...

    随机推荐

    1. Spring Bean 的装配方式

      Spring Bean 的装配方式 装配 Bean 的三种方式 一个程序中,许多功能模块都是由多个为了实现相同业务而相互协作的组件构成的.而代码之间的相互联系又势必会带来耦合.耦合是个具有两面性的概念 ...

    2. weblogic10.3.6重置/修改控制台账号密码

      weblogic部署服务后由于交接过程中文档不完整导致有一个域的控制台账号密码遗失, 在此整理记录一下重置控制台账号密码的过程: 注:%DOMAIN_HOME%:指WebLogic Server 域( ...

    3. NOIp2018 TG day1 T2暨洛谷P5020 货币系统:题解

      题目链接:https://www.luogu.org/problemnew/show/P5020 这道题感觉比较水啊,身为普及组蒟蒻都不费力的做出来了,而且数据范围应该还能大一些,n起码几万几十万都不 ...

    4. 个人永久性免费-Excel催化剂功能第21波-Excel与Sqlserver零门槛交互-执行SQL语句篇

      在前两波中,已完成了Excel与Sqlserver的查询和上传功能,但难免许多临时的或更深入地操作数据库需要用Sql语句来操作,对一般用户电脑里,不可能有条件轻易安装一个数据库客户端软件,就算安装了对 ...

    5. Excel催化剂开源第30波-在Excel上尽情地使用LINQ

      对于笔者这样的数据分析工作者来说,对数据库有较深的掌握,当然少不了对SQL查询的深度使用,如果在编程的世界中,可以复用这样的能力,真的是一件多么令人高兴的事情. 在.Net的世界中,恰恰提供了这样的能 ...

    6. Spring_AOP基于AspectJ的注解开发&JDBC的模板使用&事务管理(学习笔记3)

      一:AOP基于AspectJ的注解开发 1,简单的实例: 1)引入相应的jar包 ​ 2)在配置文件里引入相关约束 <beans xmlns="http://www.springfra ...

    7. MYSQL数据库的安装,配置文件,登入

      07.13自我总结 MYSQL数据库 一.MYQL数据库的安装 可以去mysql官网下载mysql压缩包 运行程序:在bin文件夹中,其中客户端运行文件是mysql.exe,服务端运行文件为mysql ...

    8. 一文带你实现RPC框架

      想要获取更多文章可以访问我的博客 - 代码无止境. 现在大部分的互联网公司都会采用微服务架构,但具体实现微服务架构的方式有所不同,主流上分为两种,一种是基于Http协议的远程调用,另外一种是基于RPC ...

    9. Git学习(一):版本控制介绍及安装

      一.VCS(版本控制系统)的演变 1.集中式VCS的特点 1)有集中的版本管理服务器: 2)具备文件版本管理和分支管理能力: 3)集成效率较没有版本控制(如:进行文件夹标注的方式)有明显地的提高: 4 ...

    10. PhpCms V9中的{date('Y-m-d',$r[inputtime])}问题解决方法

      不少朋友会碰到这个问题:在PhpCms V9中的首页或者文章内容页调用发布时间{date('Y-m-d',$r[inputtime])}调用显示1970-01-01,然后尝试用截断的方法也没有成功,应 ...