gpt4 book ai didi

javascript - 处理第三方库发送的ajax请求开始和结束事件

转载 作者:行者123 更新时间:2023-11-29 21:50:34 24 4
gpt4 key购买 nike

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

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

即使已经完成,我也试过了,但没有用:

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

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

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

有什么办法吗?

更新:

不是没有使用 jquery。它通过

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

最佳答案

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

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

jQuery 事件仅帮助处理同样使用 jQuery 的请求。对于不使用该库发起的请求,在包含该库之前或之后,这些事件不会被 jQuery 触发,因为 jQuery 根本不知道请求发生了——你没有全局事件,jQuery 没有全局事件。

这给您留下了最后一个有点极端的选择——干扰原型(prototype)。根据您需要执行的操作,这可以通过两种方式完成。要简单地停止所有请求,您可以替换其他代码将依赖的对象。尝试发出 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 的对象,但允许您挂接到请求。将 XMLHttpRequest(或 IE 对应项)替换为填充对象,然后在工作完成后可选择恢复原始对象。这有点复杂,但不太难。不要让 XMLHttpRequest 为 false,而是让它成为您的功能替换对象。

不过,有些浏览器可能不喜欢您篡改 native 对象,因此请务必在所有目标平台上测试这两种方法。

关于javascript - 处理第三方库发送的ajax请求开始和结束事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29465821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com