【问题标题】:Are HTTP requests always cancelled by all browsers if originator iframe is destroyed before it completes?如果发起者 iframe 在完成之前被销毁,HTTP 请求是否总是被所有浏览器取消?
【发布时间】:2017-01-05 08:13:39
【问题描述】:

在 Chrome 上,我注意到如果我在提交表单的请求完成之前销毁 iframe,则该请求将被取消。这在 Firefox 和 IE 中似乎不会发生。

这是规范推荐的吗?其他浏览器是否计划在未来做同样的事情?

【问题讨论】:

  • 可能值得创建一个测试情况,在这种情况下,您可以确定在iframe 被销毁之前提交表单的请求没有完成;否则,浏览器之间的差异可能完全是由于竞争条件。

标签: google-chrome browser http-post request-cancelling


【解决方案1】:

“其他浏览器是否计划在未来做同样的事情?”

没有线索,但我在下面显示的规范链最终依赖于fetch specification,这部分是由服务人员推动的,它们是supported by Chrome and Firefox"In Development" 用于 MS Edge,"Under Consideration" 用于WebKit(截至 2017 年 1 月 17 日)。

WHATWG's iframe section 状态:

当从文档中移除 iframe 元素时,用户代理必须丢弃该元素的嵌套浏览上下文,如果它不为 null,然后将该元素的嵌套浏览上下文设置为 null。

注意这种情况不会触发任何卸载事件(嵌套浏览上下文及其文档被丢弃,而不是卸载)。

WHATWG 的浏览器文档的 discard a Document section 声明:

当浏览上下文要丢弃文档时,用户代理必须运行以下步骤:

将文档的可挽救状态设置为 false。

为本规范和其他适用规范定义的文档运行任何卸载文档清理步骤。

中止文档。 [强调]

删除任何任务源中与文档关联的任何任务,而不运行这些任务。

丢弃 Document 的所有子浏览上下文。

失去从文档的浏览上下文到文档的强引用。

aborting a document 上的同一文档部分指出:

如果文档被中止,用户代理必须运行以下步骤:

中止每个子浏览上下文的活动文档。如果这导致任何 Document 对象的可挽救状态设置为 false,则也将此 Document 的可挽救状态设置为 false。

取消任何获取算法的实例 [强调添加]在本文档的上下文中,丢弃排队等待它们的所有任务,并丢弃从网络为他们。如果这导致 fetch 算法的任何实例被取消或任何排队的任务或任何网络数据被丢弃,则将 Document 的可挽救状态设置为 false。

如果 Document 有一个活动的解析器,则中止该解析器并将 Document 的可挽救状态设置为 false。

鉴于“获取算法”是浏览器发出任何 HTTP 请求的新标准化方式,我解释了由已删除的iframe 发出的任何不完整请求的取消与上述部分一致。

参照。 fetch spec 如果你还没有受够。 :)

再次引用

The iframe element

Discard a Document

Abort a Document

Fetch spec

【讨论】:

    猜你喜欢
    • 2016-10-23
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 2011-01-05
    • 2021-11-25
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    相关资源
    最近更新 更多