周三,我维护的AJAXy CRM系统为许多用户崩溃了,因为Firefox开始报告"在窗口上下文中的同步模式下不支持使用XMLHttpRequest的超时属性"。其他主要浏览器仍然可以正常工作,因此作为解决方法,我建议人们不要使用Firefox。
据我所知,同步请求是一件坏事,所以我只能假设 Firefox 最近的一些更新已经阻止了它适应坏事。之前的所有讨论(在这里和网络上(都意味着将超时属性与同步 XMLHttpRequest 对象一起使用根本不应该工作,这让我想知道为什么它显然会起作用(除了周三的 Firefox(。
其他浏览器/旧 Firefox 是否真的在"不应该"的地方实现了超时行为,或者他们只是忽略异常并继续执行(而不是像新 Firefox 那样纾困(?
编辑:我现在无法获得代码,但它是这样的: if (c.somekindoftimeouthandler !== "unassigned" && this.timeout) {
其中"this"是复杂的东西,大概是从XMLHTTPRequest继承而来的,而"c"是一个特定的对象,指的是特定的AJAX请求,或者其他东西。我会澄清一下,我对Javascript和这个特定的基于糖的CRM知之甚少,但代码的本质很简单。这是一种通用的面向对象发出请求的方式,当请求超时时,这个特定的 4 行左右处理。我的印象是,这是一个抽象的基础,特定请求(或请求实体(应该从中专门化。Firefox Javascript引擎在
c.timeout = this.timeout
//more stuff about the handler etc...
}this.timeout
上窒息。
我相信我的问题的主旨更笼统 - 鉴于使用超时进行同步 XHR 的"坏处",各种浏览器如何处理它?
IE允许"超时"用于同步XHR。 如果达到超时时间,我相信它会从 send(( 中抛出异常。
Firefox 完全实现了 XHR 规范所说的:异步 XHR 支持超时,但同步 XHR 不支持超时(如果您尝试设置它,则会抛出(。
其他浏览器(和旧的Firefox(根本不支持超时;它们甚至没有这个属性。 由于您的脚本正在嗅探该属性是否存在,因此它甚至不会尝试在其他浏览器中设置超时,这就是它在那里工作的原因:您的脚本不会尝试做坏事,因此这些浏览器最终不会引发异常。
所以所有改变的是 Firefox 添加了对超时属性的支持,但它没有做 IE 做的事情,而是实现了规范所说的。 您的脚本假设任何实现该属性的浏览器都将以 IE 的方式运行......