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 相关文章推荐
图片在浏览器中底部对齐 解决方法之一
Nov 30 Javascript
关于jQuery UI 使用心得及技巧
Oct 10 Javascript
js实现的折叠导航示例
Nov 29 Javascript
jquery实现textarea输入框限制字数的方法
Jan 15 Javascript
手机移动端实现 jquery和HTML5 Canvas的幸运大奖盘特效
Dec 06 Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
Jan 21 Javascript
Angular.Js中过滤器filter与自定义过滤器filter实例详解
May 08 Javascript
微信小程序实现滚动消息通知
Feb 02 Javascript
vue 使用自定义指令实现表单校验的方法
Aug 28 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
Dec 26 Javascript
最简单的vue消息提示全局组件的方法
Jun 16 Javascript
javascript中call,apply,bind的区别详解
Dec 11 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数组函数序列之asort() - 对数组的元素值进行升序排序,保持索引关系
2011/11/02 PHP
PHP设计模式之结构模式的深入解析
2013/06/13 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
2016/03/22 PHP
PHP 将dataurl转成图片image方法总结
2016/10/14 PHP
PHP实现执行外部程序的方法详解
2017/08/17 PHP
jQuery学习5 jQuery事件模型
2010/02/07 Javascript
jQuery的写法不同导致的兼容性问题的解决方法
2010/07/29 Javascript
js获取控件位置以及不同浏览器中的差别介绍
2013/08/08 Javascript
js onclick事件传参讲解
2013/11/06 Javascript
jquery获取复选框被选中的值
2014/04/10 Javascript
2种jQuery 实现刮刮卡效果
2015/02/01 Javascript
深入理解JavaScript系列(50):Function模式(下篇)
2015/03/04 Javascript
AngularJS 中的事件详解
2016/07/28 Javascript
js控住DOM实现发布微博效果
2016/08/30 Javascript
Node.JS段点续传:Nginx配置文件分段下载功能的实现方法
2018/03/12 Javascript
微信小程序之swiper轮播图中的图片自适应高度的方法
2018/04/23 Javascript
详解JavaScript中的坐标和距离
2019/05/27 Javascript
Vue+Element实现网页版个人简历系统(推荐)
2019/12/31 Javascript
vue用elementui写form表单时,在label里添加空格操作
2020/08/13 Javascript
[47:43]Alliance vs KG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
python pygame实现五子棋小游戏
2020/10/26 Python
python实现动态创建类的方法分析
2019/06/25 Python
python的pytest框架之命令行参数详解(上)
2019/06/27 Python
python实现操作文件(文件夹)
2019/10/31 Python
500行python代码实现飞机大战
2020/04/24 Python
Html5新增标签有哪些
2017/04/13 HTML / CSS
应届生新闻编辑求职信
2013/11/19 职场文书
初中军训感想300字
2014/03/05 职场文书
三八妇女节活动主持词
2014/03/17 职场文书
学习优秀党员杨宗兴先进事迹材料思想汇报
2014/09/14 职场文书
考生诚信考试承诺书
2015/04/29 职场文书
2016小学优秀教师先进事迹材料
2016/02/26 职场文书
2016年第十四个公民道德宣传日活动总
2016/04/01 职场文书
用position:sticky完美解决小程序吸顶问题的实现方法
2021/04/24 HTML / CSS
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
2021/10/16 Python
「天才王子的赤字国家重生术」妮妮姆·拉雷粘土人开订
2022/03/21 日漫