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 相关文章推荐
指定位置如果有图片显示图片,无图片显示广告的JS
Jun 05 Javascript
javascript管中窥豹 形参与实参浅析
Dec 17 Javascript
原始XMLHttpRequest方法详情回顾
Nov 28 Javascript
js获取及判断键盘按键的方法
Dec 01 Javascript
DOM操作和jQuery实现选项移动操作的简单实例
Jun 07 Javascript
js只执行1次的函数示例
Jul 20 Javascript
select隐藏选中值对应的id,显示其它id的简单实现方法
Aug 25 Javascript
Vue组件化通讯的实例代码
Jun 23 Javascript
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
Aug 06 Javascript
vue监听对象及对象属性问题
Aug 20 Javascript
webpack4手动搭建Vue开发环境实现todoList项目的方法
May 16 Javascript
详细讲解如何创建, 发布自己的 Vue UI 组件库
May 29 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怎样调用MSSQL的存储过程
2006/10/09 PHP
php Undefined index和Undefined variable的解决方法
2008/03/27 PHP
php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
2014/12/15 PHP
PHP从数组中删除元素的四种方法实例
2017/05/12 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
如何使用jquery控制CSS样式,并且取消Css样式(如背景色,有实例)
2013/07/09 Javascript
代码触发js事件(click、change)示例应用
2013/12/13 Javascript
node.js+Ajax实现获取HTTP服务器返回数据
2014/11/26 Javascript
使用jQuery管理选择结果
2015/01/20 Javascript
jQuery中DOM树操作之复制元素的方法
2015/01/23 Javascript
JS/jQuery判断DOM节点是否存在的简单方法
2016/11/24 Javascript
js窗口震动小程序分享
2016/11/28 Javascript
JavaScript提高加载和执行效率的方法
2017/02/03 Javascript
多个上传文件用js验证文件的格式和大小的方法(推荐)
2017/03/09 Javascript
Node.js中看JavaScript的引用
2017/04/22 Javascript
简单实现jQuery弹幕效果
2017/05/06 jQuery
Angular.js项目中使用gulp实现自动化构建以及压缩打包详解
2017/07/19 Javascript
10种JavaScript最常见的错误(小结)
2019/06/21 Javascript
js实现超级玛丽小游戏
2020/03/18 Javascript
微信小程序实现列表滚动头部吸顶的示例代码
2020/07/12 Javascript
vue+element_ui上传文件,并传递额外参数操作
2020/12/05 Vue.js
python基础教程之序列详解
2014/08/29 Python
详解python while 函数及while和for的区别
2018/09/07 Python
python根据时间获取周数代码实例
2019/09/30 Python
python 邮件检测工具mmpi的使用
2021/01/04 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
PatPat德国:妈妈的每日优惠
2019/10/02 全球购物
护士自我评价范文
2014/01/25 职场文书
2014年班主任自我评价范文
2014/04/23 职场文书
新闻编辑专业自荐信
2014/07/02 职场文书
2015年植树节活动总结
2015/02/06 职场文书
公司员工宿舍管理制度
2015/08/03 职场文书
创业计划书之面包店
2019/09/17 职场文书
IDEA 链接Mysql数据库并执行查询操作的完整代码
2021/05/20 MySQL
原型和原型链 prototype和proto的区别详情
2021/11/02 Javascript
CSS 实现磨砂玻璃(毛玻璃)效果样式
2023/05/21 HTML / CSS