zoukankan      html  css  js  c++  java
  • 记一次使用js中的this关键字在ajax中使用,因传入的this对象不同而引起的问题。

    背景:

      在一次web网站开发维护中,使用手机验证码进行登录。再点击获取手机验证码时,验证码按钮并没有置灰,同时也没有出现倒数读秒的效果。

    设置按钮倒数60秒前端代码:

     var clock = '';
        var nums = 60;
        var btn;
        function sendCode(thisBtn) {
            btn = thisBtn;
            btn.disabled = true; //将按钮置为不可点击
            btn.value = nums + '秒重新获取';
            btn.className = 'regGetcodeBtn1';
            if (clickNumber == 0) {
                clock = setInterval(doLoop, 1000); //一秒执行一次
            }
        }
    function doLoop() {
            nums--;
            if (nums > 0) {
                btn.value = nums + '秒后重新获取';
                clickNumber = 1;
            } else {
                clearInterval(clock); //清除js定时器
                btn.disabled = false;
                btn.value = '获取验证码';
                btn.className = 'regGetcodeBtn1 color';
                nums = 60; //重置时间
                clickNumber = 0;
            }
        }

    在向后端请求获取短信验证码成功之后,调用sendCode()函数,实现如下效果:

    但是在ajax请求,调用时,实际上该效果并没有出现,代码如下:

    $.ajax({
                url: servletUrl,
                type: "post",
                dataType: 'JSON',
                data: { name: name, securityCode: txtsecurityCode1/* strTelphone: strCodeTelphone, securityCode: txtsecurityCode1*/},
                success: function (result) {
                    //已经存在该名字提示用户
                    if (result.status == false) {
                        console.log("传入ajax中的this对象:" + this.location);
                        $('#hdVerifCode').val(0);
                        nums = 0;
                        layer.alert(result.msg, { icon: 2 });
                        layer.close(loadingindex);
                        // 刷新验证码
                        $('#secImg').click();
                    } else {
                        $('#hdVerifCode').val(1);
                        sendCode(this);
    
                    }
                },
    

     这个时候,我i传入一个this,原本意是代替触发的btn对象,但是实际上,在传入sendCode中时,却并不是我所想的。查阅资料,学习了一下js中this这个关键字,好吧,在ajax的success中,this代替了传入到看ajax的bbjcet对象,而不是触发按钮事件的btn了。所以,并没有改变按钮对象的状态。

    解决办法:

      A。在调用ajax方法之前,定义一个对象,接受this指代的对象。var that=this;然后在sendCode(that)传入包装好的this对象即可。

      B。使用bind(this)关键字,绑定当前的this的事件对象。

    总结 this关键字:

      1。全局作用域和普通函数中,指向全局对象window;

    console.log(this) //window
    
    //function声明函数
    function bar () {console.log(this)}
    bar() //window
    
    //function声明函数赋给变量
    var bar = function () {console.log(this)}
    bar() //window
    
    //自执行函数
    (function () {console.log(this)})(); //window
    

     2。方法调用中,谁调用方法,this指向谁

    //对象方法调用
    var person = {
      run: function () {console.log(this)}
    }
    person.run() // person
    
    //事件绑定
    var btn = document.querySelector("button")
    btn.onclick = function () {
      console.log(this) // btn
    }
    //事件监听
    var btn = document.querySelector("button")
    btn.addEventListener('click', function () {
      console.log(this) //btn
    })
    //jqery中的ajax
    $.ajax(object)
    在ajax的succes中,this指向了传入ajax的对象obj
    success:function(){
                $(this).prevAll('p').css("text-decoration","line-through");
          }.bind(this)//使用bind(this)绑定当前this事件

     3.在构造函数和构造函数原型中,this指向构造函数的实例。

    //不使用new指向window
    function Person(name) {
      console.log(this) // window
      this.name = name;
    }
    Person('inwe')
    //使用new
    var people = new Person('iwen')
    function Person(name) {
      this.name = name
      console.log(this) //people
      self = this
    }
    console.log(self === people) //true
    //这里new改变了this指向,将this由window指向Person的实例对象people

    4. 箭头函数中指向外层作用域的 this

  • 相关阅读:
    加入mapstruct后出现 找不到符号 符号: 方法 setXX 的解决方法
    解决docker容器日志导致主机磁盘空间满了的情况
    prometheus安装(docker)
    在Github或Gitee上用hexo搭建个人博客
    解决github打不开
    jenkins更新为国内源
    让sentinel-dashboard的流控配置持久化到nacos
    Yarn和Zookeeper的区别
    flink安装启动(docker)
    jQuery 事件源码定位
  • 原文地址:https://www.cnblogs.com/king-tao/p/13292377.html
Copyright © 2011-2022 走看看