TL; DR: 如何在我的网站上测试IE8的兼容性问题?
我为学校写了一个网站,它适用于我测试的每个浏览器,除了< = IE8。
发生了什么以及我尝试了什么:
为了测试,我正在使用IE11的仿真模式,但我在真正的IE8浏览器中遇到了相同的行为。
我正在使用jQuery 1.11,它支持旧版本的IE。
我无法真正提供代码,因为它有很多代码,但我通过对jQuery的粗略浏览器支持,(通过www.caniuse.com验证)并且再次,我没有收到任何代码错误表明无法找到某种方法。
从这个描述中,有没有人知道可能出现的问题,或者我怎么能去诊断这个问题呢?
我认为调试时一切都很好,但我想这会教会我在工作时进行调试。
我把它缩小到下面的代码:
Resolvable: function() {
var isResolved = false;
var onResolve;
this.resolve = function() {
isResolved = true;
if (typeof onResolve !== 'undefined') {
onResolve();
}
};
this.setOnResolve = function(f) {
if (isResolved) {
f();
} else {
onResolve = f;
}
}
在setOnResolve
内,输入else
区块,分配发生,一切都停止加载(“手表”面板清空,我添加的任何手动手表都显示为“不是可用“)。
setOnResolve
:
/**
* Runs each of the {@SuspendedLoader}s, in the order that they're given.
*
* @param {SuspendedLoader[]} seqOfSuspLoaders An array of {@link SuspendedLoader}s
*/
runLoadersInOrder: function(seqOfSuspLoaders) {
if (seqOfSuspLoaders.length < 1) return;
var currentLoader = seqOfSuspLoaders[0];
var restLoaders = seqOfSuspLoaders.slice(1);
var advance = Loaders.PageLoader.runLoadersInOrder;
var loaderPromise = currentLoader.runLoader();
if (loaderPromise instanceof Loaders.Helpers.Resolvable) {
loaderPromise.setOnResolve(function() { //<--- HERE
advance(restLoaders);
});
} else {
loaderPromise.then(
function() {
advance(restLoaders);
},
function() {
throw new Error("Couldn't run loader (" + currentLoader.constructor.name + "): ");
}
)
}
},
我在runLoadersInOrder
的每一行都设置了断点,但代码永远不会超过调用setOnResolve
。我进入setOnResolve
,onResolve
分配发生,然后退出。
我意识到问题实际上是runLoadersInOrder
完全退出而不是递归。我会继续玩它。
答案 0 :(得分:0)
我解决了。我尽可能地将事件处理程序添加到jQuery,但忽略了处理jQuery脚本标记onload
事件的情况,这显然从未在旧IE中触发。这个功能确实是问题所在:
/**
* Loads a script without using jQuery by inserting a script tag into the page.
*
* @param path The folder the scripts are in.
* @param scriptName The name of the script to load.
* @returns {Resolvable} A {@link Resolvable} indicating when the script tag is loaded.
*/
Loaders.ScriptLoader.loadJQuery = function(path, scriptName) {
var firstExistingScript = document.body.getElementsByTagName('script')[0];
var script = Loaders.ScriptLoader.createScript(path, scriptName);
document.body.insertBefore(script, firstExistingScript);
var res = new Loaders.Helpers.Resolvable();
script.onload = function() {
$.ajaxSetup({cache: true});
res.resolve();
});
return res;
};
请注意我是如何使用onload
检查完成情况的,这与旧版本的IE不兼容。我将那部分改为:
Loaders.Helpers.attachOnLoad(script, function() {
$.ajaxSetup({cache: true});
res.resolve();
});
其中attachOnLoad
=
attachOnLoad: function(element, f) {
if (typeof element.onload === 'undefined') {
element.onreadystatechange = function() {
if (element.readyState === 'loaded') {
f();
}
};
} else {
element.onload = f;
}
},
由于某种原因,就绪状态永远不会变为complete
,但会变为loaded
。我需要做进一步的测试,以确保它始终如一地加载。