Веб-сайт с JS не работает в IE9 до тех пор, пока не активируются инструменты разработчика

Я разрабатываю сложный веб-сайт, который сильно использует jQuery и ряд скриптов. При загрузке сайта ни один из моих скриптов не работает (хотя я могу подтвердить, что другие скрипты работают нормально). Я бы не стал публиковать такой хромой вопрос здесь, на SE, за исключением одного:

В мгновение ока я нажал F12, чтобы включить инструменты разработчика, чтобы я мог отлаживать мою проблему, все мгновенно работает отлично!

Хуже того, если я выключу браузер, запустите его, сначала включите Dev Tools и зайдите на сайт, все работает так, как ожидалось.

Поэтому я даже не могу отлаживать проклятую проблему, потому что Dev Tools исправляет ее! Что может сделать Dev Tools, что заставляет все работать? Изменяет ли он UA (я обнаружил некоторое обнаружение jQuery.browser)? Делает ли это что-то для doctype?

ИЗМЕНИТЬ

Все мои консольные протоколы завернуты в следующую служебную утилиту оболочки:

   function log(msg){
    if (console){
        console.log(msg);
    }
   }

Любые мысли или предложения, которые я мог бы попробовать, приветствуются. Я отправлю сообщение, если найду решение.

Ответы

Ответ 1

Я ценю, что я очень опаздываю на вечеринку здесь, но у меня есть решение для IE9, которое немного отличается.

(function() {
    var temp_log = [];
    function log() {
        if (console && console.log) {
            for (var i = 0; i < temp_log.length; i++) {
                console.log.call(window, temp_log[i]);
            }
            console.log.call(window, arguments);
        } else {
            temp_log.push(arguments);
        }
    }
})();

В основном вместо console.log используется log. Если console.log существует, то он работает нормально, в противном случае он хранит записи журнала в массиве и выводит их на следующий log, где доступен console.

Было бы неплохо, если бы он подтолкнул данные, как только появится console, но это дешевле, чем настройка пользовательского прослушивателя setInterval.

Обновленная функция (1 октября 2012 г.)

Я обновил этот script для собственного использования и думал, что поделюсь им. Он имеет несколько достойных улучшений:

  • используйте console.log() как обычно, т.е. больше не нужно использовать нестандартные log()
  • поддерживает несколько аргументов, например. console.log('foo', 'bar')
  • вы также можете использовать console.error, console.warn и console.info (хотя выдает их как console.log)
  • script проверяет собственный console каждые 1000 мс и выводит буфер при обнаружении

Я думаю, что с этими улучшениями это стало довольно прочной прокладкой для IE9. Проверьте здесь репозиторий GitHub.

if (!window.console) (function() {

    var __console, Console;

    Console = function() {
        var check = setInterval(function() {
            var f;
            if (window.console && console.log && !console.__buffer) {
                clearInterval(check);
                f = (Function.prototype.bind) ? Function.prototype.bind.call(console.log, console) : console.log;
                for (var i = 0; i < __console.__buffer.length; i++) f.apply(console, __console.__buffer[i]);
            }
        }, 1000); 

        function log() {
            this.__buffer.push(arguments);
        }

        this.log = log;
        this.error = log;
        this.warn = log;
        this.info = log;
        this.__buffer = [];
    };

    __console = window.console = new Console();
})();

Ответ 2

У вас есть консольные вызовы, в IE это не удастся, если инструменты dev не открыты. Простое исправление заключается в том, чтобы обернуть любые вызовы консоли в функции, например:

function log(msg) {
  if(console)
    console.log(msg);
}

Ответ 3

Я взломал его следующим образом

<script type="text/javascript">
    (function () {
        if (typeof console == "undefined") {
            console = {
                log : function () {}
            }
        }
    })();
</script>

И это первый элемент script в.

Ответ 4

Большинство других решений должно работать отлично, но здесь есть короткий один лайнер, если вам не нужно ловить сообщения журнала, если консоль недоступна.

// Stub hack to prevent errors in IE
console = window.console || { log: function() {} };

Это позволяет вам по-прежнему использовать собственную функцию console.log, а не обертывать ее чем угодно или иметь условное значение каждый раз.

Ответ 5

Мне гораздо удобнее просто использовать console && console.log('foo', 'bar', 'baz') вместо использования функции-обертки.

Код, который вы указали:

function logError(msg){
  if (console) {
    console.log(msg);
  } else {
    throw new Error(msg);
  }
}

Возникнет ошибка для IE, когда инструменты разработчика закрыты, потому что console будет undefined.

Ответ 6

Консоль console.log, которую я использовал, была недостаточной для обнаружения консоли в IE9. Здесь обертка, которая работает из связанного с ней вопроса на SE:

function logError(msg){
    try {
        console.log(msg);
    } catch (error) {
        throw new Error(msg);
    }
}

function log(msg){
    try {
        console.log(msg);
    } catch (error) { }
}

Правильный тест на доступность объекта консоли будет следующим: if (typeof console === "undefined" || typeof console.log === "undefined")

Ответ 7

Если у вас несколько параллельных файлов script, возможно, файлы загружаются/выполняются в другом порядке с включенными/выключенными инструментами разработчика.

Ответ 8

Я много раз сталкивался с этой проблемой. В основном с переменными мы делаем это, чтобы проверить, действительны ли они

var somevar;
if (somevar)
 //do code

это работает, потому что somevar решит undefined. Но если вы проверяете свойство окна, например. window.console.

if (console) <---- this throws an exception

Вы не можете выполнить ту же проверку. Браузер рассматривает его по-разному. В основном это делается только

if (window.console) <---- will NOT throw an exception if undefined
//some code

это будет работать так же, как и в первом примере. Поэтому вам нужно изменить свой код на

function log(msg){
 if (window.console){
     console.log(msg);
 }
}