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 相关文章推荐
setTimeout和setInterval的深入理解
Nov 08 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
Dec 18 Javascript
了不起的node.js读书笔记之mongodb数据库交互
Dec 22 Javascript
js调用webservice构造SOAP进行身份验证
Apr 27 Javascript
Javascript中的迭代、归并方法详解
Jun 14 Javascript
JCrop+ajaxUpload 图像切割上传的实例代码
Jul 20 Javascript
JAVA Web实时消息后台服务器推送技术---GoEasy
Nov 04 Javascript
JavaScript中Array对象用法实例总结
Nov 29 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
Dec 13 Javascript
BootStrap表单宽度设置方法
Mar 10 Javascript
实现单层json按照key字母顺序排序的示例
Dec 06 Javascript
解决Vue @submit 提交后不刷新页面问题
Jul 18 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读取目录下所有文件的代码
2008/01/07 PHP
php smarty的预保留变量总结
2008/12/04 PHP
适用于抽奖程序、随机广告的PHP概率算法实例
2014/04/09 PHP
为百度UE编辑器上传图片添加水印功能
2015/04/16 PHP
php根据用户语言跳转相应网页
2015/11/04 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
2020/08/07 PHP
JQuery扩展插件Validate—6 radio、checkbox、select的验证
2011/09/05 Javascript
分页栏的web标准实现
2011/11/01 Javascript
js数组转json并在后台对其解析具体实现
2013/11/20 Javascript
JavaScript中Math对象方法使用概述
2014/01/02 Javascript
5种处理js跨域问题方法汇总
2014/12/04 Javascript
jqueryMobile使用示例分享
2016/01/12 Javascript
javascript实现任务栏消息提示的简单实例
2016/05/31 Javascript
Angular设置title信息解决SEO方面存在问题
2016/08/19 Javascript
实例浅析js的this
2016/12/11 Javascript
利用js定义一个导航条菜单
2017/03/14 Javascript
JS ES6中setTimeout函数的执行上下文示例
2017/04/27 Javascript
JQuery Ajax 异步操作之动态添加节点功能
2017/05/24 jQuery
JavaScript实现多叉树的递归遍历和非递归遍历算法操作示例
2018/02/08 Javascript
vue父子模板传值问题解决方法案例分析
2020/02/26 Javascript
Layer UI表格列日期格式化及取消自动填充日期的实现方法
2020/05/10 Javascript
[48:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第二场 1月29日
2021/03/11 DOTA
python多进程操作实例
2014/11/21 Python
Python中解析JSON并同时进行自定义编码处理实例
2015/02/08 Python
总结python爬虫抓站的实用技巧
2016/08/09 Python
Python实现的文本编辑器功能示例
2017/06/30 Python
Python3使用正则表达式爬取内涵段子示例
2018/04/22 Python
python__new__内置静态方法使用解析
2020/01/07 Python
Python定义一个Actor任务
2020/07/29 Python
HTML5 的新的表单元素(datalist/keygen/output)使用介绍
2013/07/19 HTML / CSS
Smilodox官方运动服装店:从运动服到健身配件
2020/08/27 全球购物
医生自荐信
2013/10/11 职场文书
机械系大学毕业生推荐信
2013/11/27 职场文书
高一历史教学反思
2014/01/13 职场文书
写给父母的感谢信
2015/01/22 职场文书