处理第三方库发送的ajax请求的开头和结尾的事件

时间:2015-04-06 05:28:38

标签: javascript jquery ajax

我在我的项目中使用第三方库发送了一些ajax请求。它是一个非常复杂的库,它将它们发送到具有随机GUID的URL,因此我无法预测GUID将是什么,因此确切的URL将是什么。

我希望能够处理它发送的ajax请求的开头和结尾,这样我就可以显示一个ajax微调器或者其他东西 - 告诉用户正在发生的事情。特别是当页面第一次加载时。

即使它已经完成但我没有尝试过,但我尝试了这一点:

$(document).ajaxStop(function () {
  alert('done');
});

document.ready并没有按照我需要的方式工作,因为ajax请求的响应在它之后回来了。

同样,我没有发送那些ajax请求,库发送它们。 为了简单起见,我们可以假设只有一个ajax请求,而不是很多。我无法更改库的源代码。

有什么办法吗?

更新

Isn不使用jquery。它通过

动态创建脚本
    var s = document.createElement('script');
    s.src = url;
    s.async = true;
    s.onreadystatechange = s.onload = function(){
     //.... some stuff

2 个答案:

答案 0 :(得分:1)

没有与AJAX请求相关的本机全局事件。这是部分,因为没有完整的跨浏览器标准可供实施。大多数浏览器使用XMLHttpRequest,IE使用ActiveXObject

正如评论中所述,jQuery实现了Global Ajax Event Handlers,特别是ajaxStart()ajaxStop()。这些为您提供了一个可以访问所有ajax事件的地方,并且由于jQuery为这些事件提供了统一的API,因此您不必担心浏览器之间的实现差异。

jQuery事件仅对也使用jQuery的请求有帮助。对于在不使用库的情况下发起的请求,在包含库之前或之后,这些事件不会被jQuery触发,因为jQuery根本不知道发生了请求 - 没有全局事件,没有jQuery的全局事件。

这让你有一个最后的,有点激烈的选择 - 干扰原型。根据您的需要,可以通过两种方式完成。要简单地停止所有请求,您可以替换其他代码将依赖的对象。尝试发出AJAX请求的脚本将失败。您可以稍后恢复对象。这是一个非跨浏览器的模型:

<head>
    <script>
        var oldXMLHttpRequest = XMLHttpRequest;
        XMLHttpRequest = false; // now all ajax requests fail
    </script>

    <!-- include the problematic library here -->

    <script>
        XMLHttpRequest = oldXMLHttpRequest; // now they work again!
        oldXMLHttpRequest = null;
    </script>

这是一个概念验证(未针对IE进行测试,但应该有效):http://jsfiddle.net/GRMule/wk0f7oeq/

如果目标不是停止请求,而是事先采取某些操作,则可以编写一个行为类似于XMLHttpRequest / ActiveXObject的对象,但允许您挂钩请求。用您的shimmed对象替换XMLHttpRequest(或IE对应物),然后在您的工作完成后选择性地恢复原始对象。这有点复杂,但不是太强硬。而不是让XMLHttpRequest成为假,使它成为你的功能替代对象。

有些浏览器可能不喜欢你篡改本机对象,所以一定要在所有目标平台上测试这两种方法。

答案 1 :(得分:1)

这看起来像是一个jsonp回调。

JSONP的工作方式类似于您在帖子update中编写代码的方式。但是为了更正式的理解,请参阅this

假设您的库的编写方式不允许您在jsonp请求之前的关键阶段调用某些例程(函数),并且在jsonp请求完成之后...您可以覆盖{{1} }例如提到here

您的重点是扩展appendChild的功能。拦截appendChild元素的插入;将处理程序附加到它上面。你完成了......我希望......

当然,将它投入生产是一个坏主意。

http://plnkr.co/edit/ijElm8bQ5u895TMsYJ6D?p=preview

script