【发布时间】:2015-04-08 03:19:05
【问题描述】:
我正在使用 jQuery ajax 加载脚本。
这是加载程序代码的一个片段,值得一看。
var resources = ['knockout-3.2.0.js', 'fonts/fontawesome-webfont.eot', ... ];
var retryCount = 0;
load(0);
function load(i) {
if (i == resources.length) {
$("#progBar").width("100%");
$("#progCaption").text("executing App/main...")
var requireScript = document.createElement('script');
requireScript.setAttribute("type", "text/javascript");
requireScript.setAttribute("src", "Scripts/require.js");
requireScript.setAttribute("data-main", "App/main");
head[0].appendChild(requireScript);
}
else {
$("#progBar").width(100 * i / resources.length + "%");
var r = resources[i];
switch (r.substring(r.lastIndexOf('.'))) {
case ".js":
$("#progCaption").text(r);
$.getScript('Scripts/' + r)
.done(function (data) {
retryCount = 0;
load(++i);
})
.error(function (err) {
if (err.status == 404 || retryCount == 3) {
load(++i);
} else {
retryCount++;
console.log('Retry ' + r);
load(i);
}
});
break;
...
getScript 的推荐语法只接受一个参数。它是否是有效的 URL。因为返回了资源的开头,所以我们知道 URL 是有效的。 invoking 代码中没有错误,jQuery 在将其解析为脚本之前未能获取整个响应。
指向同一个面向公众的服务器,即使 err.status 报告 200 OK,$.getScript() 也会引发错误。查资料显示被截断,错误可能是截断导致的JS解析失败。
这仅在 IE11 工作时发生,并且当流量通过 Fiddler 路由时问题停止显现。它根本不会发生在家里的 IE11 上。将'knockout-3.2.0.js', 更改为'knockout-3.2.0.debug.js', 会导致淘汰赛加载顺利,但是bootstrap.js 并没有缩小并且确实可以播放,所以它不像没有换行那么简单。我认为这可能是通过名称更改修复的某种 server 缓存问题(它不可能是浏览器缓存问题,因为 getScript 应用了缓存破坏器参数)但我尝试重命名 knockout-3.2。 0.js 到 knockout-3.2.0.min.js 并没有什么区别。
有类似症状的问题:
IE returns incomplete HTML via Ajax 这很相似,但 IE11 几乎不是“旧”版本,将 Fiddler 添加到等式可以解决此问题,因此问题不太可能是解析打嗝。
Ajax request returns 200 OK, but an error event is fired instead of success 在这种情况下,解析失败是由不正确的响应类型引起的,而不是不完整的响应。
我确认家里和工作的IE都是11.0.9600.17690更新KB3032359。
当我禁用 IIS 压缩时问题消失了。
我不知道是静态压缩还是动态压缩,因为我同时关闭了它们。
如果 Microsoft 的任何人希望调查(如果答案是否定的,我不会感到惊讶,这有点极端)...我有 PCAP 文件表明两者之间的交换失败客户端和服务器。
诊断总结
- 不是网络,它通过我的手机的备用路由失败
- 不是IE的版本,同样的IE在家里建不会失败
- 虽然可能是网络硬件驱动程序,但不是平台(都在 Win81 上)
- 它不是 IIS,可以在家里和我的 WinPhone81 以及所有其他浏览器上工作
- 它是 IIS,关闭服务器压缩修复它
- 这不是 IIS,压缩在其他浏览器上工作得很好,虽然我不认为使用支持压缩的浏览器来捕获流量
- 插入 Fiddler 解决了压缩处于活动状态时的问题
- 这不是浏览器缓存问题,getScript 提供了一个 cache-buster 参数,当我故意允许缓存时,它在捕获文件中很明显是 http 无变化响应。
我有一种最奇怪的感觉,这与Why does IE11 create blank post request except when Fiddler is running? 相关,但我无法说出原因。
一旦文件在缓存中,它们的大小就不再有意义,这就是我运行预加载器的原因 - 对于像我这样的 SPA,它可以有效地安装。 SPA 优于传统应用程序架构的有力论据。但冗长的设置确实会影响第一次体验。
【问题讨论】:
-
它发生在特定脚本或所有脚本中?
-
它发生在大型、缩小的脚本中。特别是 bootstrap.js 和 knockout-3.2.0.js - 有趣的是,knockout-3.2.0.debug,js 更大,处理起来没有任何问题。
-
另一个用于#IEProblems 的堆栈,哈哈
-
也许你应该把它放在 jQuery 错误中?三个浏览器都有问题。由于历史上较高的市场份额,IE 问题在历史上备受瞩目。坦率地说,我在使用 Firefox 时遇到了更多麻烦。
-
您是否对此进行了深入研究,我在使用 Asp.NET、MVC 和 IIS 8.5 为 jQuery 和 jQuery UI 提供服务时遇到了同样的问题。关闭动态内容压缩为我解决了这个问题,但我仍在寻找为什么动态内容压缩会导致 IIS 特别是在提供这两个文件时出错的根本原因。
标签: jquery internet-explorer-11 fiddler getscript