JS this关键字在ajax中使用出现问题解决方案


Posted in Javascript onJuly 17, 2020

背景:

在一次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()函数,实现如下效果:

JS this关键字在ajax中使用出现问题解决方案

但是在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的对象objsuccess: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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript setTimeout()传递函数参数(包括传递对象参数)
Apr 07 Javascript
JavaScript的类型转换(字符转数字 数字转字符)
Aug 30 Javascript
jQuery图片轮播的具体实现
Sep 11 Javascript
调用DOM对象的focus使文本框获得焦点
Feb 19 Javascript
浅谈JavaScript中的String对象常用方法
Feb 25 Javascript
JS与Ajax Get和Post在使用上的区别实例详解
Jun 08 Javascript
纯JS单页面赛车游戏制作代码分享
Mar 03 Javascript
vue cli webpack中使用sass的方法
Feb 24 Javascript
Angular模版驱动表单的使用总结
May 05 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【矩形情况】
Dec 13 Javascript
15分钟深入了解JS继承分类、原理与用法
Jan 19 Javascript
NestJs 静态目录配置详解
Mar 12 Javascript
vue中v-for循环选中点击的元素并对该元素添加样式操作
Jul 17 #Javascript
在vue中对数组值变化的监听与重新响应渲染操作
Jul 17 #Javascript
Vue项目中数据的深度监听或对象属性的监听实例
Jul 17 #Javascript
解决vue无法侦听数组及对象属性的变化问题
Jul 17 #Javascript
使用element-ui +Vue 解决 table 里包含表单验证的问题
Jul 17 #Javascript
Vue element-ui父组件控制子组件的表单校验操作
Jul 17 #Javascript
简单了解常用的JavaScript 库
Jul 16 #Javascript
You might like
劣质的PHP代码简化
2010/02/08 PHP
ThinkPHP与PHPExcel冲突解决方法
2011/08/08 PHP
Symfony2学习笔记之模板用法详解
2016/03/17 PHP
javascript js cookie的存储,获取和删除
2007/12/29 Javascript
javascript import css实例代码
2008/07/18 Javascript
使用隐藏的new来创建对象
2011/03/29 Javascript
ie下动态加态js文件的方法
2011/09/13 Javascript
javascript正则匹配汉字、数字、字母、下划线
2014/04/10 Javascript
使用jquery动态加载js文件的方法
2014/12/24 Javascript
JQuery中基础过滤选择器用法实例分析
2015/05/18 Javascript
js改变透明度实现轮播图的算法
2020/08/24 Javascript
jQuery内存泄露解决办法
2016/12/13 Javascript
node.js中express中间件body-parser的介绍与用法详解
2017/05/23 Javascript
es7学习教程之fetch解决异步嵌套问题的方法示例
2017/07/21 Javascript
JS实现登录页密码的显示和隐藏功能
2017/12/06 Javascript
js实现简单掷骰子小游戏
2019/10/24 Javascript
在Vue中实现随hash改变响应菜单高亮
2020/03/09 Javascript
[36:22]VP vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python类定义的讲解
2013/11/01 Python
python编写暴力破解FTP密码小工具
2014/11/19 Python
Python的dict字典结构操作方法学习笔记
2016/05/07 Python
Python内置函数 next的具体使用方法
2017/11/24 Python
《Python学习手册》学习总结
2018/01/17 Python
flask入门之表单的实现
2018/07/18 Python
Python之使用adb shell命令启动应用的方法详解
2019/01/07 Python
python中温度单位转换的实例方法
2020/12/27 Python
德国最大的设计师鞋网上商店:Budapester
2017/12/07 全球购物
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/11/24 面试题
如何写你的创业计划书
2014/01/07 职场文书
个人租房协议书
2014/04/09 职场文书
集中采购方案
2014/06/10 职场文书
高中课前三分钟演讲稿
2014/08/18 职场文书
领导班子四风问题对照检查材料
2014/09/27 职场文书
公司感谢信范文
2015/01/22 职场文书
励志语录:只有自己足够强大,才能不被别人践踏
2020/01/09 职场文书
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
2021/11/11 Python