我正在使用 jQuery ajax 加载脚本。
这是加载程序代码的一个片段,它的值(value)。
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;
...
Recommended syntax for getScript only takes one parameter. Either it's a valid URL or not. Because the start of the resource is returned we know the URL is valid . There is no error in the invoking code, jQuery is failing to get the entire response before parsing it as a script.
指向同一个面向公众的服务器,即使 err.status 报告 200 OK,$.getScript() 也会抛出错误。检查数据发现被截断,错误可能是截断导致的JS解析失败。
这只发生在 IE11 工作时,当流量通过 Fiddler 路由时,问题就不再出现。在家里的IE11上根本不会出现这种情况。将 'knockout-3.2.0.js',
更改为 'knockout-3.2.0.debug.js',
会导致 knockout 顺利加载,但 bootstrap.js没有缩小并且确实播放了,所以它不像没有换行那么简单。我认为这可能是某种通过名称更改解决的服务器缓存问题(它不可能是浏览器缓存问题,因为 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 提供了一个缓存破坏器参数,当我故意允许缓存时,它在捕获文件中很明显是 http 无更改响应。
我有一种最奇怪的感觉,这是相关的Why does IE11 create blank post request except when Fiddler is running?但我无法说出原因。
一旦文件进入缓存,它们的大小就不再有意义,这就是为什么我运行预加载器 - 对于像我这样的 SPA,它是有效的安装。 SPA 相对于传统应用程序架构的有力论据。但冗长的设置确实会影响第一次体验。
最佳答案
通过在 IIS 中禁用压缩可以解决该问题。
关于jquery - 来自 IIS 的压缩 XHR 响应不完整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29505327/