xhr.send()不会触发ajaxComplete / ajaxSuccess,但$ .get会触发。为什么?

时间:2015-01-07 15:47:45

标签: javascript jquery ajax

想象一下,我有这三个功能:

$( document ).ajaxSuccess(function( event, xhr, settings ) {
  console.log('ajaxSuccess fired');
});

function doCall1 () {
    var xhr = new XMLHttpRequest();
    xhr.open('get', 'someurl.com', true);
    xhr.send();
}

function doCall2 (){
    $.get('someurl.com');
}

当我致电doCall1时,ajaxSuccess不会触发。但是,当我致电doCall2时,ajaxSuccess会触发。

我理解这与事实上jQuery实际上是对$ .ajax()的各种方法使用回调函数而不是查看XMLHttpRequest的onreadystatechange / readyState(如果我不在标记时纠正我)这一事实有关,但我还是不完全明白。

有人可以给我一个快速的解释,或者直接告诉我一些文件,这些文件可以让我完成剩下的工作吗?

4 个答案:

答案 0 :(得分:3)

正如其他人所说,ajaxSuccessajaxComplete是jQuery添加的非本机事件。如果由于某种原因你想要jQuery和vanilla js之间的互操作,你可以自己发送事件(需要注意的是CustomEvent的浏览器支持是有限的):

var event = new CustomEvent("ajaxComplete");
document.dispatchEvent(event);

答案 1 :(得分:1)

这是因为ajaxSuccessajaxComplete方法是jQuery的一部分,它们只是由jQuery函数触发。

XMLHttpRequest是一个原生的javascript对象,它与jQuery无关。

答案 2 :(得分:0)

触发ajaxSuccess / ajaxComplete的代码写在$.ajax()$.get()$.post()等的末尾。上述事件与jQuery和$.ajax()$.get()$.post()函数是jQuery函数。

XHR是本机JavaScript,与jQuery无关。

答案 3 :(得分:-1)

一方面是具有deferrers的jQuery对象,另一方面是本机JavaScript对象,您必须自己附加回调并将其转发到jQuery的ajaxSuccess(jQ包装本机XMLRequest对象并执行此操作)。