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限制textarea每行输入字符串长度的代码
Oct 31 Javascript
使用JS获取当前地理位置方法汇总
Dec 18 Javascript
EasyUI,点击开启编辑框,并且编辑框获得焦点的方法
Mar 01 Javascript
javascript实现客户端兼容各浏览器创建csv并下载的方法
Mar 23 Javascript
JavaScript中的toDateString()方法使用详解
Jun 12 Javascript
跟我学习javascript的基本类型和引用类型
Nov 16 Javascript
easyUI下拉列表点击事件使用方法
May 18 Javascript
jQuery Layer弹出层传值到父页面的实现代码
Aug 17 jQuery
zTree异步加载展开第一级节点的实现方法
Sep 05 Javascript
详解VUE 数组更新
Dec 16 Javascript
Vue CLI 3搭建vue+vuex最全分析(推荐)
Sep 27 Javascript
利用 JavaScript 构建命令行应用
Nov 17 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
ThinkPHP表单自动提交验证实例教程
2014/07/18 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
Jquery封装tab自动切换效果的具体实现
2013/07/13 Javascript
跟我学习JScript的Bug与内存管理
2015/11/18 Javascript
Dojo获取下拉框的文本和值实例代码
2016/05/27 Javascript
基于JavaScript实现树形下拉框
2016/08/10 Javascript
Bootstrap的基本应用要点浅析
2016/12/19 Javascript
详解Python中logging日志模块在多进程环境下的使用
2016/12/26 Javascript
js获取json中key所对应的value值的简单方法
2020/06/17 Javascript
jQuery实现div跟随鼠标移动
2020/08/20 jQuery
360doc网站不登录就无法复制内容的解决方法
2018/01/27 Javascript
Vuejs 2.0 子组件访问/调用父组件的方法(示例代码)
2018/02/08 Javascript
Angular使用动态加载组件方法实现Dialog的示例
2018/05/11 Javascript
js与jQuery实现获取table中的数据并拼成json字符串操作示例
2018/07/12 jQuery
vue在index.html中引入静态文件不生效问题及解决方法
2019/04/29 Javascript
layui动态绑定事件的方法
2019/09/20 Javascript
javascript实现函数柯里化与反柯里化过程解析
2019/10/08 Javascript
jquery ajax 请求小技巧实例分析
2019/11/11 jQuery
JSONP 的原理、理解 与 实例分析
2020/05/16 Javascript
vue使用echarts画组织结构图
2021/02/06 Vue.js
详解Python3.1版本带来的核心变化
2015/04/07 Python
Python Matplotlib实现三维数据的散点图绘制
2019/03/19 Python
python异步存储数据详解
2019/03/19 Python
Python使用numpy模块实现矩阵和列表的连接操作方法
2019/06/26 Python
python3中eval函数用法使用简介
2019/08/02 Python
使用Python测试Ping主机IP和某端口是否开放的实例
2019/12/17 Python
巴西在线鞋店:Shoestock
2017/10/28 全球购物
Java中compareTo和compare的区别
2016/04/12 面试题
linux面试题参考答案(3)
2012/09/13 面试题
校长岗位职责
2013/11/26 职场文书
暑期社会实践方案
2014/02/05 职场文书
在校大学生自我评价范文
2014/09/12 职场文书
2016七一建党节慰问信
2015/11/30 职场文书
筑梦中国心得体会
2016/01/18 职场文书
python - asyncio异步编程
2021/04/06 Python
Python学习之包与模块详解
2022/03/19 Python