• 记录一次Jquery中 this 关键字使用出现的问题


    今天在用Jquery改造之前的JS代码过程中,遇到了一个让我懵逼了三小时的问题。
    问题的关键在 this 的使用。在这里与大家分享一下。并且分享一下我做表单提交的检查代码

    错误代码如下:

    $("form").submit(function () {
                return checkName() && checkAge() && checkEmail() && checkQq();
            })
            // 验证姓名
            $('#name').blur(checkName);
            function checkName() {
                // 验证姓名验证正则
                var reg = /^[u4E00-u9FA5uf900-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-u9FA5uf900-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-zd]+([-_.][A-Za-zd]+)*@([A-Za-zd]+[-.])+[A-Za-zd]{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>
    
  • 相关阅读:
    使用尾递归对斐波那契优化?
    Ajax是什么?包含什么技术?有什么作用?
    Ajax的乱码解决问题?
    Ajax的核心的对象是什么?
    为什么Java中不支持多重继承?
    vue-router的原理,例如hashhistory和History interface?
    JSP是什么?有什么特点?
    forward 和redirect的区别?
    Listener是什么?有什么作用?
    请说一说Servlet的生命周期?
  • 原文地址:https://www.cnblogs.com/keatsCoder/p/11398244.html
  • Copyright © 2020-2023  润新知