我正在使用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是有效的。 调用代码中没有错误,jQuery在将其解析为脚本之前未能获得整个响应。
指向同一个面向公众的服务器,即使err.status报告200 OK,$ .getScript()也会抛出错误。检查数据显示它被截断,并且错误可能是由于截断而导致的JS解析失败。
只有IE11在工作时才会发生这种情况,并且当流量通过Fiddler路由时问题就会停止显现。它在家里的IE11上根本不会发生。将'knockout-3.2.0.js',
更改为'knockout-3.2.0.debug.js',
会导致敲除加载顺利进行,但bootstrap.js不会缩小并且确实会播放,因此不会像没有换行那样简单。我认为这可能是由名称更改修复的某种服务器缓存问题(它不能是浏览器缓存问题,因为getScript应用了cache-buster参数)但我尝试重命名knockout-3.2。 0.js to 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压缩时,问题就消失了。
我不知道它是静态还是动态压缩,因为我同时将它们关闭了。
如果微软的任何人希望进行调查(如果答案是否定的话,我不会感到惊讶,这是一个有点边缘的情况)...我有PCAP文件之间的失败交换客户端和服务器。
我最奇怪的感觉这与Why does IE11 create blank post request except when Fiddler is running?相关,但我不知道为什么。
一旦文件在缓存中,它们的大小就会停止显示,这就是为什么我运行预加载器 - 对于像我这样的SPA来说它是有效的安装。 SPA相对于传统应用程序架构的强大论据。但是,冗长的设置确实在第一次体验时有所损失。
答案 0 :(得分:0)
通过在IIS中禁用压缩来解决此问题。