这是一种经常被观察到的行为。 jQuery异步AJAX调用在没有打开Firebug的情况下运行时完美无缺。但是,当Firebug打开并且我通过在代码的其他部分放置一些断点进行调试时,AJAX回调事件不会触发。
我的假设是,由于我已经在另一个不相关的代码部分中逐步调试,因此AJAX响应回调事件正在转义。这个假设是对的吗?如果是,我该如何确保回调始终触发?如果没有,我做错了什么?
答案 0 :(得分:1)
我的假设是,因为我已经逐步调试了 另一个不相关的代码部分,ajax响应回调事件是 逃脱。这个假设是对的吗?
是的,在Firebug 1.x中。虽然在Firebug 2.0中有fixed(在测试阶段写这个答案时)。
E.g。看看下面的代码:
<script type="text/javascript">
function makeRequest()
{
var xhr = new XMLHttpRequest();
xhr.open("GET", "test.php");
xhr.onreadystatechange = function()
{
if (xhr.readyState === XMLHttpRequest.DONE)
console.log("Request finished");
}
xhr.send(null);
debugger;
}
</script>
<button onclick="makeRequest()">Make request</button>
当您点击制作请求按钮时,您希望将Request finished
记录到控制台。
在高达1.12.8的Firebug中,输出不会出现在控制台中,而在2.0中也是如此。
这是因为Firefox公开了Firebug 2.0 adapts new debugger APIs,它解决了这个问题。
虽然请注意不会延迟对onreadystatechange
的异步调用。这意味着即使您在debugger
关键字处停止,它仍会执行。因此,console.log("Request finished")
处的断点将不被击中。
这与Chrome,Opera和Internet Explorer的JavaScript引擎不同,其中异步函数的执行正在等待调试器继续执行脚本。