我在我的项目中使用第三方库发送了一些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
答案 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