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 面向对象 重载
May 13 Javascript
用jQuery中的ajax分页实现代码
Sep 20 Javascript
zShowBox 图片放大展示jquery版 兼容性
Sep 24 Javascript
Firefox中beforeunload事件的实现缺陷浅析
May 03 Javascript
jQuery Mobile页面跳转后未加载外部JS原因分析及解决
Mar 18 Javascript
js/html光标定位的实现代码
Sep 23 Javascript
jquery中常用的SET和GET$(”#msg”).html循环介绍
Oct 09 Javascript
JavaScript 闭包机制详解及实例代码
Oct 10 Javascript
js构建二叉树进行数值数组的去重与优化详解
Mar 26 Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
Jul 20 Javascript
判断“命令按钮”是否被鼠标单击详解
Jul 31 Javascript
解决三元运算符 报错“SyntaxError: can''t assign to conditional expression”
Feb 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 显示客户端IP与服务器IP的代码
2010/10/12 PHP
php 目录与文件处理-郑阿奇(续)
2011/07/04 PHP
解析PHP中的内存管理,PHP动态分配和释放内存
2013/06/28 PHP
PHP中的按位与和按位或操作示例
2014/01/27 PHP
php截取字符串之截取utf8或gbk编码的中英文字符串示例
2014/03/12 PHP
php实现的Cookies操作类实例
2014/09/24 PHP
js 获取中文拼音,Select自动匹配字母获取值的代码
2009/09/23 Javascript
javascript 动态修改样式和层叠样式表代码
2010/04/27 Javascript
javascript 进阶篇2 CSS XML学习
2012/03/14 Javascript
基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
2013/05/07 Javascript
JavaScript实现自动生成网页元素功能(按钮、文本等)
2015/11/21 Javascript
关于微信中a链接无法跳转问题
2016/08/02 Javascript
js弹出窗口简单实现代码
2017/03/22 Javascript
vue+springboot实现项目的CORS跨域请求
2018/09/05 Javascript
从vue源码看props的用法
2019/01/09 Javascript
微信小程序wxs实现吸顶效果
2020/01/08 Javascript
用js实现放大镜效果
2020/10/28 Javascript
JavaScript语法约定和程序调试原理解析
2020/11/03 Javascript
Python多线程编程(三):threading.Thread类的重要函数和方法
2015/04/05 Python
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
Python检测生僻字的实现方法
2016/10/23 Python
python使用PIL模块获取图片像素点的方法
2019/01/08 Python
python_mask_array的用法
2020/02/18 Python
keras输出预测值和真实值方式
2020/06/27 Python
Python wordcloud库安装方法总结
2020/12/31 Python
CSS3 text-shadow实现文字阴影效果
2016/02/24 HTML / CSS
Hotels.com中国区:好订网
2016/08/18 全球购物
荷兰睡眠专家:Beter Bed
2020/11/23 全球购物
服装公司总经理岗位职责
2013/11/30 职场文书
商业房地产广告语
2014/03/13 职场文书
教育实践活动对照检查材料
2014/09/23 职场文书
幼儿教师师德师风自我评价
2015/03/05 职场文书
中标通知书格式
2015/04/17 职场文书
标准版个人借条怎么写?以及什么是借条?
2019/08/28 职场文书
导游词之泉州崇武古城
2019/12/20 职场文书
Python turtle编写简单的球类小游戏
2022/03/31 Python