XMLHttpRequest.onreadystatechange 与 addEventListener
Posted
技术标签:
【中文标题】XMLHttpRequest.onreadystatechange 与 addEventListener【英文标题】:XMLHttpRequest.onreadystatechange vs. addEventListener 【发布时间】:2016-04-26 15:22:11 【问题描述】:阅读 XMLHttpRequest 以在 Google Chrome 扩展中使用,我遇到了一个问题。
MDN specifies usingXMLHttpRequest.addEventListener
,而Google usesXMLHttpRequest.onreadystatechange
在他们的例子中。
在向 Google Apps 脚本发出 GET 请求时,这两种方法之间是否存在偏好?我是异步 javascript 的新手,在此之前我一直在 GAS 工作。
【问题讨论】:
【参考方案1】:首选是浏览器兼容性。来自 MSN 上的 XMLHttpRequest API 文档。
https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#Properties
所有浏览器都支持
onreadystatechange
作为XMLHttpRequest
实例的属性。
https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#Events
除了将
on*
属性设置为处理函数之外,包括 Firefox 在内的最新浏览器还支持通过标准addEventListener
API 侦听XMLHttpRequest
事件。
由于 Apps Script Web Apps 很快将只支持现代浏览器(因为本机和模拟模式已被弃用),您可以使用其中任何一种。
【讨论】:
【参考方案2】:onreadystatechange
触发太多,您可能不需要听它。请改用loadend(所有情况,包括失败/中止)、load(成功)、error
、abort
事件。
更多信息请参见https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest。
【讨论】:
你说得有道理。onreadystatechange
会在每次状态更改时触发,但 addEventListener
会监听特定事件(loadend
、load
、error
、abort
)。【参考方案3】:
此外,如果您可以控制浏览器类型/版本,则可以使用传递给 onreadystatechange 函数的对象进行 polyfill:
var oReq = new XMLHttpRequest();
// This part for modern browsers
oReq.addEventListener("progress", updateProgress, false);
oReq.addEventListener("load", transferComplete, false);
oReq.addEventListener("error", transferFailed, false);
oReq.addEventListener("abort", transferCanceled, false);
// This part for old ones
oReq.onreadystatechange = functionSwitch;
functionSwitch 将调用正确的函数(将在 updateProgress、transferComplete 等之间进行选择)以避免重复代码。
我见过有人在使用 Windows XP,但可能任何 addEventListener 都不起作用。看看:addEventListener Compatibility。我没有通过 addEventListener 找到特定的 xmlhttprequest 事件列表。
【讨论】:
以上是关于XMLHttpRequest.onreadystatechange 与 addEventListener的主要内容,如果未能解决你的问题,请参考以下文章