今天遇到一个奇怪的事情:我给一个按钮注册了一个单击事件,单击后使用this调用当前对象对button进行修改并且发送ajax请求,然后在success方法里面再次使用this操作当前的按钮对象无效?
场景还原
<!--页面上的一个按钮,就是要操作的当前对象-->
<button id="btn">按钮一</button>
$("#btn").click(function(){
$(this).text("禁用按钮一"); //this获取当前对象,修改按钮一的内容
$.ajax({
url:"json/data.json",
type:"get",
dataType:"json",
success:function(data){
$(this).text("恢复按钮一");
console.log("看看进来没有?");
}
}); //ajax结尾
});
结果
按照执行的顺序来说:jquery监听到按钮的单击事件之后,首先调用当前对象修改button按钮内容为“禁用按钮一”,然后发送ajax请求到"json/data.json"路径,成功后再次调用当前对象修改button按钮内容为“恢复按钮一”且输出一条语句。事实是:第二次修改button内容为“恢复按钮一”并没有执行,而打印的语句正常执行。这是不是就是说success回调正常进入,但是$(this).text(“恢复按钮一”);是无效的?
然后我对ajax执行进行了调试:给ajax发送设置断点,发现执行步骤是ajax直接到结尾,过程中并没有执行success回调方法,而是跳入到jquery中执行了一些其他方法,回来之后执行的success回调方法。这是不是this已经不再success方法里面了,所以获取不到?
不会js代码调试?看看这里
之后,我不采用this获取当前对象了,而是使用button的id。
$("#btn").click(function(){
$("#btn").text("禁用按钮一"); //修改按钮一的内容
$.ajax({
url:"json/data.json",
type:"get",
dataType:"json",
success:function(data){
$("#btn").text("恢复按钮一");
console.log("看看进来没有?");
}
});
});
结果
O! M! G! 成功了!
看来以后能用id的绝不使用this调用当前对象了。
这是不是和ajax的异步请求有关系呢?有没有大神评论区回答一下!