Веб-сайт с JS не работает в IE9, пока инструменты разработчика не активированы - PullRequest
59 голосов
/ 11 ноября 2011

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

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

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

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

EDIT

Вся моя консольная регистрация заключена в следующую служебную функцию оболочки:

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

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

Ответы [ 8 ]

34 голосов
/ 10 февраля 2012

Я ценю, что довольно поздно опаздываю на вечеринку, но у меня есть решение для 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 г.)

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

  • использовать console.log() как обычно, т.е. больше не нужно использовать нестандартные log()
  • поддерживает несколько аргументов, например console.log('foo', 'bar')
  • Вы также можете использовать console.error, console.warn и console.info (хотя выводит их как console.log) * Сценарий 1030 *
  • проверяет наличие нативных 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();
})();
13 голосов
/ 11 ноября 2011

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

function log(msg) {
  if(console)
    console.log(msg);
}
2 голосов
/ 17 августа 2012

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

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

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

2 голосов
/ 10 февраля 2012

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

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

И это первый элемент скрипта в.

1 голос
/ 11 ноября 2011

Оболочки 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")

1 голос
/ 11 ноября 2011

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

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

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

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

0 голосов
/ 05 февраля 2013

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

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);
 }
}
0 голосов
/ 11 ноября 2011

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

...