IE8 сбой при перезагрузке только когда сайт на локальном хосте, только когда включен javascript, только в режиме IE8 - PullRequest
2 голосов
/ 25 августа 2011

Вот версии:

  • IE 8.0.6001.18702
  • Visual Studio Web Developer 2010 10.0.40219.1.SP1Rel
  • .Net 4.0.30319 SP1Rel
  • jQuery 1.6.2

Когда я запускаю сайт на локальном хосте через Visual Studio с IE, установленным в режим IE8 и включенным javascript, при перезагрузке страницы происходит сбой браузера. Не происходит сбой при изменении URL или закрытии вкладки / окна. Я получаю следующие сообщения:

VS сообщение JIT:

Произошло необработанное исключение win32 в iexplore.exe [ некоторые PID ].

Ошибка при отладке с VS:

Необработанное исключение в 0x3fa078d8 в iexplore.exe: 0xC0000005: Местоположение чтения нарушения доступа 0x00000008.

Расположение стека вызовов: mshtml.dll! 3fa078d8 ()

3FA078D8 mov eax, dword ptr [ebx + 8]

Когда я отменяю отладку, страница обычно нормально загружается во вкладке. Время от времени я получаю сообщение «Мы не смогли вернуть вас на страницу, которую вы просматривали». сообщение.

Чтобы сделать его еще более увлекательным, это происходит только на главной странице сайта и не может быть воспроизведено на сервере DEV. Переключение в режим IE7 делает сбой никогда не происходит. Или закомментируйте некоторые файлы javascript, загруженные внизу страницы.

Я попытался запустить IE8 с отключенными аддонами, и все еще происходят сбои. Я попытался запустить с включенным Fiddler, и он все еще падает.

1 Ответ

5 голосов
/ 25 августа 2011

Я думаю, что сбои могли быть связаны с использованием window.setTimeout() и window.setInterval(), так как они кажутся единственными общими функциями, используемыми в разных файлах JS, которые приводят к прекращению сбоя проекта при закомментировании. В нашем global.js я добавил этот код для использования вместо:

(function (w) {

    w.windowBind = function (eventName, handler) {
        if (w.attachEvent) {
            w.attachEvent("on" + eventName, handler);
        } else if (w.addEventListener) {
            w.addEventListener(eventName, handler, false);
        } 
    };

    var timeoutsToExpire = [],
        expireTimeouts = function () {
            for (var i = 0, l = timeoutsToExpire.length; i < l; i++) {
                w.clearTimeout(timeoutsToExpire[i]);
            }
            timeoutsToExpire = [];
        },
        intervalsToExpire = [],
        expireIntervals = function () {
            for (var i = 0, l = intervalsToExpire.length; i < l; i++) {
                w.clearInterval(intervalsToExpire[i]);
            }
            intervalsToExpire = [];
        };

    w.setExpiringTimeout = function (func, time) {
        var id = w.setTimeout(func, time);
        timeoutsToExpire.push(id);
        return id;
    };

    w.setExpiringInterval = function (func, time) {
        var id = w.setInterval(func, time);
        intervalsToExpire.push(id);
        return id;
    };

    w.windowBind("unload", function () {
        // expire timers
        expireTimeouts();
        expireIntervals();
    });
    w.windowBind("beforeunload", function () {
        // expire timers
        expireTimeouts();
        expireIntervals();
    });

})(window);

Затем я обновил предыдущие ссылки window.setTimeout() и window.setInterval(), чтобы использовать эти помощники. Кажется, сейчас это исправлено.

Обновление: может быть, я отправил слишком рано, он просто снова потерпел крах для меня. Хотя сейчас они кажутся очень прерывистыми.

Обновление 2: хорошо, похоже, что это происходит надежно, когда я смещаю + обновляю сейчас, тьфу.

Обновление 3: опробовал последнюю версию jQuery RC, и сбои прекратились, в примечаниях к выпуску упоминаются 2 ошибки сбоя IE8: http://blog.jquery.com/2011/08/29/jquery-1-6-3-rc1-released/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...