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

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

错误代码如下:

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

分析:

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

    在代码中添加以下代码:

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

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



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



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

    以下是完整代码:

    1. <script>
    2. // JQuery 完成表单检验
    3. $(function () {
    4. // 表单提交函数。检查name&age&email&qq等属性符合正则后方可提交
    5. $("form").submit(function () {
    6. return checkName() && checkAge() && checkEmail() && checkQq();
    7. })
    8. //验证姓名
    9. $('#name').blur(checkName);
    10. function checkName() {
    11. // 验证姓名验证正则
    12. var reg = /^[\u4E00-\u9FA5\uf900-\ufa2d·s]{2,20}$/;
    13. var flag = reg.test($('#name').val());
    14. if( !flag ){
    15. $('#error_name').remove();
    16. $('#name').after("<p id='error_name' class='error_msg'>姓名格式不正确 </p>");
    17. } else {
    18. $('#error_name').remove();
    19. }
    20. return flag;
    21. }
    22. //验证年龄
    23. $('#age').blur(checkAge)
    24. function checkAge() {
    25. // 验证姓名验证正则
    26. var reg = /^\d{1,3}$/;
    27. var flag = reg.test($('#age').val());
    28. if (!flag) {
    29. $('#error_age').remove();
    30. $('#age').after("<p id='error_age' class='error_msg'>年龄格式不正确 </p>");
    31. } else {
    32. $('#error_age').remove();
    33. }
    34. return flag;
    35. }
    36. //验证QQ
    37. $('#qq').blur(checkQq)
    38. function checkQq() {
    39. // 验证姓名验证正则
    40. var reg = /^\d{6,20}$/;
    41. var flag = reg.test($('#qq').val());
    42. if( !flag ){
    43. $('#error_qq').remove();
    44. $('#qq').after("<p id='error_qq' class='error_msg'>qq格式不正确 </p>");
    45. } else {
    46. $('#error_qq').remove();
    47. }
    48. return flag;
    49. }
    50. //验证Email
    51. $('#email').blur(checkEmail)
    52. function checkEmail() {
    53. // 验证验证码正则
    54. var reg = /^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,4}$/;
    55. var flag = reg.test($('#email').val());
    56. if (!flag) {
    57. $('#error_email').remove();
    58. $('#email').after("<p id='error_email' class='error_msg'>邮箱格式不正确 </p>");
    59. } else {
    60. $('#error_email').remove();
    61. }
    62. return flag;
    63. }
    64. });
    65. </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. MFC在一个工程中启动其他工程的exe文件

      说明:有的时候把两个工程合并,但是偷懒不想在工程中添加代码,所以想到了这个办法,仅限偷懒哈哈哈哈 方法:新建一个主程序,在主程序的界面中添加按钮,在按钮的程序代码中添加以下语句: void CMain ...

    2. c++小游戏——俄罗斯方块

      #include<cstdio> #include<windows.h> #include<ctime> int a[24][17],i,j,tim=800,ti= ...

    3. 个人永久性免费-Excel催化剂功能第101波-批量替换功能(增加正则及高性能替换能力)

      数据处理无小事,正如没有人活在真空理想环境一下,在数据分析过程中,也没有那么真空理想化的数据源可以使用,数据处理占据数据分析的80%的时间,每一个小小的改善,获益都良多.Excel查找替换,有其局限性 ...

    4. 找bug的过程

      关于昨天程序出差我找bug的过程记录 昨天才程序 https://www.cnblogs.com/pythonywy/p/11006273.html ├── xxxx │ ├── src.py │ └ ...

    5. 深入理解 JavaScript 单例模式 (Singleton Pattern)

      概念 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在. 核心:确保只有一个实例,并提供全局访问. 实现思路 一个类能返回对象一个引用(永远是同 ...

    6. C语言入门9-2-模块大致一览

      字母数字 判断字符是否为英文字母isalpha()判断字符是否为数字isdigit()判断字符是否为英文字母或数字isalnum()判断字符是否为小写字母islower()判断字符是否为大写字母isu ...

    7. [leetcode] 559. Maximum Depth of N-ary Tree (easy)

      原题链接 思路: 简单bfs class Solution { public: int maxDepth(Node *root) { int depth = 0; if (root == NULL) ...

    8. MyBatis-Plus 使用说明介绍

      先看一下和MyBatis 不同点说明: @GetMapping("/select_sql") public Object getUserBySql() { User user=ne ...

    9. 如何在Windows上使用Python进行开发

      本文由葡萄城技术团队于原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 一直以来C#都是微软在编程语言方面最为显著的Tag,但时至今日Python ...

    10. 爬虫之解析库pyquery

      初始化 安装: pip install pyquery 字符串的形式初始化 html = """ <html lang="en"> < ...