今天在用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 行。无法阻止表单提交。
  • 在代码中添加以下代码:

    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>

    版权声明:本文为keatsCoder原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://www.cnblogs.com/keatsCoder/p/11398244.html