【问题标题】:How to run a function when any XMLHttpRequest is complete?当任何 XMLHttpRequest 完成时如何运行函数?
【发布时间】:2013-08-18 00:47:23
【问题描述】:

我正在处理一个项目,该项目有几个我无法更改的脚本。这些脚本通过 AJAX 更新页面。更新完成后,我需要运行一些代码。

当任何 XMLHttpRequest 完成时是否会触发任何事件? (或任何 XMLHttpRequest 状态更改?)。

不幸的是,我无法访问用于发出请求的特定 XMLHttpRequest 对象。

谢谢,

【问题讨论】:

  • 如果您将 jQuery 专门用于上述 ajax,是的。 ajaxComplete.
  • @KevinB 的建议只有在不受您控制的脚本依赖 jQuery ajax 时才有效。
  • @Christophe 这就是 KevinB 的评论所说的 - If you're using jQuery exclusively for **said ajax**,
  • @Ian 我的观点是,这不仅与 OP 使用的内容有关,还与他未编写的其他脚本中使用的内容有关。我怀疑其他脚本是否依赖 jQuery,因为 OP 明确提到了 XMLHttpRequest 对象。
  • 我真的必须那么精确吗?我认为我的评论很好地涵盖了这两种情况。说 ajax,作为 ajax 请求,他希望知道它们何时完成。

标签: javascript jquery ajax xmlhttprequest


【解决方案1】:

如果不使用 jQuery,您可以挂钩 open 方法,以便在 XHR 对象被 opened 时为每个 XHR 对象的 readystatechange 事件附加一个侦听器。确保在发生任何 Ajax 之前运行以下代码:

// save the real open
var oldOpen = XMLHttpRequest.prototype.open;

function onStateChange(event) {
    // fires on every readystatechange ever
    // use `this` to determine which XHR object fired the change event
}

XMLHttpRequest.prototype.open = function() {
    // when an XHR object is opened, add a listener for its readystatechange events
    this.addEventListener("readystatechange", onStateChange)

    // run the real `open`
    oldOpen.apply(this, arguments);
}

或者,如果您只关心成功的 load 事件,则可以侦听该事件而不是 readystatechange

【讨论】:

  • Kindof 有效,但在我的情况下并非如此:请求被多次触发,有时完全循环。
猜你喜欢
  • 2016-03-05
  • 2021-12-17
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
相关资源
最近更新 更多