同步 XHR 弃用
Synchronous XHR deprecation
根据 xhr specs async: false
已弃用,现代用户代理应该开始警告甚至抛出异常。
Synchronous XMLHttpRequest outside of workers is in the process of being removed from the web platform as it has detrimental effects to the end user's experience. (This is a long process that takes many years.) Developers must not pass false for the async argument when the JavaScript global environment is a document environment. User agents are strongly encouraged to warn about such usage in developer tools and may experiment with throwing an InvalidAccessError exception when it occurs.
我理解并同意关于 "detrimental" 影响的争论。关于此弃用的要点是您可以使用异步 XHR 解决您的任何任务。但是,我在浏览器中至少可以看到两个sync XHR的应用:
1) window.onbeforeunload。任何异步 xhr 在这里都是无用的,因为浏览器选项卡将立即关闭。 onbeforeunload 事件中使用 XHR 的示例是文档 "lock"。用户在新选项卡中打开了文档,文档现在被他锁定了。每个人都可以以只读方式查看此文档。然后用户关闭选项卡,文档应该解锁。我没有看到任何异步请求的解决方案,直到用户代理保证异步请求将被执行,并且,甚至在选项卡关闭后不会中止。
2) 点击锚点事件(<a>
标签)。它与以前的情况很接近,因为它还在同一选项卡中创建新的时关闭当前 window。假设我只想跟踪页面上关键链接的点击(但我相信有更多关于此事件同步用法的好例子)。一种解决方法是在处理程序中执行 e.preventDefault(),然后手动分配位置,但这会破坏鼠标中键的行为(强制打开新选项卡)。
问题是:
1) 用户代理是否 必须 完成异步 XHR,即使选项卡已经关闭?
2) 我的示例是否有更智能的解决方案?
对于保证在页面卸载之前发送 HTTP 数据的具体情况,请查看讨论此用例的实验性 Beacon API. MDN even has a specific article。
它是一个异步 API 但它保证即使在页面卸载后通过它发送的任何数据也会被发送。
根据 xhr specs async: false
已弃用,现代用户代理应该开始警告甚至抛出异常。
Synchronous XMLHttpRequest outside of workers is in the process of being removed from the web platform as it has detrimental effects to the end user's experience. (This is a long process that takes many years.) Developers must not pass false for the async argument when the JavaScript global environment is a document environment. User agents are strongly encouraged to warn about such usage in developer tools and may experiment with throwing an InvalidAccessError exception when it occurs.
我理解并同意关于 "detrimental" 影响的争论。关于此弃用的要点是您可以使用异步 XHR 解决您的任何任务。但是,我在浏览器中至少可以看到两个sync XHR的应用:
1) window.onbeforeunload。任何异步 xhr 在这里都是无用的,因为浏览器选项卡将立即关闭。 onbeforeunload 事件中使用 XHR 的示例是文档 "lock"。用户在新选项卡中打开了文档,文档现在被他锁定了。每个人都可以以只读方式查看此文档。然后用户关闭选项卡,文档应该解锁。我没有看到任何异步请求的解决方案,直到用户代理保证异步请求将被执行,并且,甚至在选项卡关闭后不会中止。
2) 点击锚点事件(<a>
标签)。它与以前的情况很接近,因为它还在同一选项卡中创建新的时关闭当前 window。假设我只想跟踪页面上关键链接的点击(但我相信有更多关于此事件同步用法的好例子)。一种解决方法是在处理程序中执行 e.preventDefault(),然后手动分配位置,但这会破坏鼠标中键的行为(强制打开新选项卡)。
问题是: 1) 用户代理是否 必须 完成异步 XHR,即使选项卡已经关闭? 2) 我的示例是否有更智能的解决方案?
对于保证在页面卸载之前发送 HTTP 数据的具体情况,请查看讨论此用例的实验性 Beacon API. MDN even has a specific article。
它是一个异步 API 但它保证即使在页面卸载后通过它发送的任何数据也会被发送。