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 计算两个整数的百分比值
Dec 26 Javascript
jQuery 前的按键判断代码
Mar 19 Javascript
JS中处理与当前时间间隔的函数代码
May 23 Javascript
Extjs grid添加一个图片状态或者按钮的方法
Apr 03 Javascript
js事件处理程序跨浏览器解决方案
Mar 27 Javascript
使用jQuery实现WordPress中的Ctrl+Enter和@评论回复
May 21 Javascript
获取jqGrid中选择的行的数据
Nov 30 Javascript
js 文字超出长度用省略号代替,鼠标悬停并以悬浮框显示实例
Dec 06 Javascript
vue学习笔记之给组件绑定原生事件操作示例
Feb 27 Javascript
javascript设计模式 ? 单例模式原理与应用实例分析
Apr 09 Javascript
react-router-dom 嵌套路由的实现
May 02 Javascript
vue使用axios实现excel文件下载的功能
Jul 16 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
深入理解JavaScript定时机制
2010/10/29 Javascript
jQuery数组处理方法汇总
2011/06/20 Javascript
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
JavaScript将取代AppleScript?
2014/09/18 Javascript
javascript表单事件处理方法详解
2016/05/15 Javascript
JavaScript探测CSS动画是否已经完成的方法
2016/08/30 Javascript
JavaScript中关于iframe滚动条的去除和保留
2016/11/17 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
2017/01/04 Javascript
Vue集成Iframe页面的方法示例
2017/12/12 Javascript
详解基于vue-cli3快速发布一个fullpage组件
2019/03/08 Javascript
vue之a-table中实现清空选中的数据
2019/11/07 Javascript
[02:42]岂曰无衣,与子同袍!DOTA2致敬每一位守护人
2020/02/17 DOTA
[54:15]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第二场2月1日
2021/03/11 DOTA
Python操作MySQL数据库9个实用实例
2015/12/11 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
2016/04/24 Python
在centos7中分布式部署pyspider
2017/05/03 Python
socket + select 完成伪并发操作的实例
2017/08/15 Python
Python3模拟curl发送post请求操作示例
2019/05/03 Python
python多线程下信号处理程序示例
2019/05/31 Python
python实现身份证实名认证的方法实例
2019/11/08 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
2020/03/26 Python
python通过cython加密代码
2020/12/11 Python
利用css3 translate完美实现表头固定效果
2017/02/28 HTML / CSS
计算机应用与科学个人的自我评价
2013/11/15 职场文书
酒吧副总经理岗位职责
2013/12/10 职场文书
创业计划书中要认真思考的问题
2013/12/28 职场文书
护士试用期自我鉴定
2014/02/08 职场文书
自荐信的格式
2014/03/10 职场文书
一般基层干部群众路线教育实践活动个人对照检查材料
2014/11/04 职场文书
学生会生活部工作总结2015
2015/03/31 职场文书
2015年小学语文工作总结
2015/05/25 职场文书
《陶罐和铁罐》教学反思
2016/03/03 职场文书
最美劳动诗,致敬所有的劳动者!
2019/07/12 职场文书
CSS3 实现NES游戏机的示例代码
2021/04/21 HTML / CSS
使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
2021/05/14 Python
FFmpeg视频处理入门教程(新手必看)
2022/01/22 杂记