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 相关文章推荐
任意位置显示html菜单
Feb 01 Javascript
使用prototype.js 的时候应该特别注意的几个问题.
Apr 12 Javascript
刷新页面实现方式总结(HTML,ASP,JS)
Nov 13 Javascript
js对象数组按属性快速排序
Jan 31 Javascript
jquery 如何动态添加、删除class样式方法介绍
Nov 07 Javascript
提交表单时执行func方法实现代码
Mar 17 Javascript
JavaScript根据数据生成百分比图和柱状图的实例代码
Jul 14 Javascript
js 异步操作回调函数如何控制执行顺序
Dec 24 Javascript
深入理解JavaScript系列(41):设计模式之模板方法详解
Mar 04 Javascript
JavaScript实现的MD5算法完整实例
Feb 02 Javascript
JS打印彩色菱形的实例代码
Aug 15 Javascript
Electron 打包问题:electron-builder 下载各种依赖出错(推荐)
Jul 09 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中运用jQuery的Ajax跨域调用实现代码
2012/02/21 PHP
php堆排序实现原理与应用方法
2015/01/03 PHP
PHP生成plist数据的方法
2015/06/16 PHP
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
php in_array() 检查数组中是否存在某个值详解
2016/11/23 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
在b/s开发中经常用到的javaScript技术
2006/08/23 Javascript
jquery ajax提交表单数据的两种方式
2009/11/24 Javascript
为JS扩展Array.prototype.indexOf引发的问题及解决办法
2015/01/21 Javascript
jquery实现的伪分页效果代码
2015/10/29 Javascript
基于Vue.js的表格分页组件
2016/05/22 Javascript
JavaScript中的this引用(推荐)
2016/08/05 Javascript
动态加载css方法实现和深入解析
2017/01/18 Javascript
angular.JS实现网页禁用调试、复制和剪切
2017/03/31 Javascript
nodejs操作mongodb的增删改查功能实例
2017/11/09 NodeJs
vue里的data要用return返回的原因浅析
2019/05/28 Javascript
element-ui 文件上传修改文件名的方法示例
2019/11/05 Javascript
Quasar Input:type="number" 去掉上下小箭头 实现加减按钮样式功能
2020/04/09 Javascript
node.js通过url读取文件
2020/10/16 Javascript
[25:45]2018DOTA2亚洲邀请赛4.5SOLO赛 Sylar vs Paparazi
2018/04/06 DOTA
[01:07:02]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第三场 2月26日
2021/03/11 DOTA
Python的requests网络编程包使用教程
2016/07/11 Python
Python3中条件控制、循环与函数的简易教程
2017/11/21 Python
Stio官网:男女、儿童户外服装
2019/12/13 全球购物
华硕新加坡官方网上商店:ASUS Singapore
2020/07/09 全球购物
C/C++有关内存的思考题
2015/12/04 面试题
.net工程师笔试题
2012/06/09 面试题
创业者迈进成功第一步:如何写创业计划书?
2014/03/22 职场文书
我的长生果教学反思
2014/04/28 职场文书
企业安全标语
2014/06/07 职场文书
2014年大学班长工作总结
2014/11/14 职场文书
大学生党员个人总结
2015/02/13 职场文书
辞职信标准格式
2015/02/27 职场文书
部门经理助理岗位职责
2015/04/13 职场文书
python文本处理的方案(结巴分词并去除符号)
2021/05/26 Python
javascript实现计算器功能详解流程
2021/11/01 Javascript