测试IE8兼容性问题

时间:2016-01-24 01:42:19

标签: javascript internet-explorer

TL; DR: 如何在我的网站上测试IE8的兼容性问题?

我为学校写了一个网站,它适用于我测试的每个浏览器,除了< = IE8。

发生了什么以及我尝试了什么:

  • 网站开始加载,然后停止,只显示空白屏幕。
  • 我想我正在使用一种它无法识别的方法,所以我打开了控制台并刷新了。它在控制台中给出0错误或警告。
  • 我启动了内置调试器,并在脚本中的主要加载点放置了断点,用于处理加载站点。单步执行代码,一切都按预期进行,但仍然只显示空白页。

为了测试,我正在使用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。我进入setOnResolveonResolve分配发生,然后退出。

另外

我意识到问题实际上是runLoadersInOrder完全退出而不是递归。我会继续玩它。

1 个答案:

答案 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。我需要做进一步的测试,以确保它始终如一地加载。