Почему JavaScript работает только после открытия инструментов разработчика в IE один раз?

ошибка IE9-JavaScript работает только после открытия инструментов разработчика один раз.

наш сайт предлагает бесплатные загрузки pdf для пользователей, и он имеет простую функцию "введите пароль для загрузки". Однако он не работает вообще в Internet Explorer.

вы можете сами убедиться в этом пример.

пропуском загрузки является "makeuseof". В любом другом браузере он работает нормально. В IE, обе кнопки ничего не делают.

самое любопытное, что я установлено, что если вы открываете и закрываете панель инструментов разработчика с помощью F12, все это внезапно начинает работать.

мы пробовали режим совместимости и такие, ничего не имеет значения.

Как сделать эту работу в Internet Explorer?

12 ответов


похоже, у вас может быть какой-то отладочный код в вашем javascript.

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

на console объект активируется только при открытии панели инструментов Dev. До этого вызов объекта консоли приведет к тому, что он будет сообщаться как undefined. После открытия панели инструментов консоль будет существовать (даже если панель инструментов впоследствии будет закрыта), поэтому ваши консольные вызовы будут работать.

есть несколько решений этого:

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

если вы хотите сохранить ссылки на консоль, вы можете обернуть их в if() оператор или другое условие, которое проверяет, существует ли объект консоли, прежде чем пытаться вызвать его.


HTML5 Boilerplate имеет хороший предварительный код для устранения проблем консоли:

// Avoid `console` errors in browsers that lack a console.
(function() {
    var method;
    var noop = function () {};
    var methods = [
        'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error',
        'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log',
        'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd',
        'timeStamp', 'trace', 'warn'
    ];
    var length = methods.length;
    var console = (window.console = window.console || {});

    while (length--) {
        method = methods[length];

        // Only stub undefined methods.
        if (!console[method]) {
            console[method] = noop;
        }
    }
}());

Как @plus-указано в комментариях, последняя версия доступна на их страница GitHub


вот еще одна возможная причина, кроме console.log проблема (по крайней мере в IE11):

когда консоль не открыта, IE делает довольно агрессивное кэширование, поэтому убедитесь, что любой $.ajax звонки или XMLHttpRequest вызовы кэширование значение false.

например:

$.ajax({cache: false, ...})

когда консоль разработчика открыта, кэширование менее агрессивно. Похоже, баг (а может фича?)


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

<script type="text/javascript">
    // IE9 fix
    if(!window.console) {
        var console = {
            log : function(){},
            warn : function(){},
            error : function(){},
            time : function(){},
            timeEnd : function(){}
        }
    }
</script>

кроме 'console " проблема использования, упомянутая в принятом ответе и других,есть, по крайней мере, еще одна причина, почему иногда страницы в Internet Explorer работают только с активированными инструментами разработчика.

когда инструменты разработчика включены, IE действительно не использует свой http-кэш (по крайней мере, по умолчанию в IE 11), как в обычном режиме.

это означает, что если у вашего сайта или страницы есть проблема с кэшированием (если он кэширует больше, чем должен, например, - это был мой случай), вы не вижу этой проблемы в режиме F12. Поэтому, если javascript выполняет некоторые кэшированные запросы AJAX, они могут работать не так, как ожидалось в обычном режиме, и работать нормально в режиме F12.


Я думаю, это может помочь, добавив это перед любым тегом javascript:

try{
  console
}catch(e){
   console={}; console.log = function(){};
}

Если вы используете AngularJS версии 1.X вместо консоли можно использовать службу $log.войти напрямую.

простой сервис для ведения журнала. Реализация по умолчанию безопасно записывает сообщение в консоль браузера (если таковая имеется).

https://docs.angularjs.org/api/ng/service / $log

Так что если у вас есть что-то похожее на

angular.module('logExample', [])
  .controller('LogController', ['$scope', function($scope) {
    console.log('Hello World!');
 }]);

можно заменить на

angular.module('logExample', [])
  .controller('LogController', ['$scope', '$log', function($scope, $log) {
    $log.log('Hello World!');
 }]);

угловой 2+ не имеет встроенного лог-сервиса.


Это произошло в IE 11 для меня. И я звонил в jquery .функция загрузки. Поэтому я сделал это по-старому и поместил что-то в url, чтобы отключить кэширование.

$("#divToReplaceHtml").load('@Url.Action("Action", "Controller")/' + @Model.ID + "?nocache=" + new Date().getTime());

если вы используете angular и ie 9, 10 или edge использование :

myModule.config(['$httpProvider', function($httpProvider) {
    //initialize get if not there
    if (!$httpProvider.defaults.headers.get) {
        $httpProvider.defaults.headers.get = {};    
    }    

    // Answer edited to include suggestions from comments
    // because previous version of code introduced browser-related errors

    //disable IE ajax request caching
    $httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT';
    // extra
    $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
    $httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
}]);

полностью отключить cache.


У меня есть еще одна альтернатива для решений, предлагаемых рунекс и todotresde Это также позволяет избежать подводных камней, обсуждаемых в комментариях к приятель'ы ответ:

        try {
            console.log(message);
        } catch (e) {
        }

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


Я поставил разрешение и исправить мою проблему . Похоже, запрос AJAX, который я поместил в свой javascript, не обрабатывался, потому что у моей страницы была проблема с кэшем. если у вашего сайта или страницы есть проблема с кэшированием, вы не увидите эту проблему в режиме developers / F12. мои кэшированные запросы JavaScript AJAX могут работать не так, как ожидалось, и привести к нарушению выполнения, которое F12 не имеет никаких проблем. Поэтому просто добавил новый параметр, чтобы сделать кеш false.

$.ajax({
               cache: false,
});

выглядит как IE в частности, это должно быть ложным, чтобы активность AJAX и javascript работала хорошо.


мы столкнулись с этой проблемой в IE 11 на Windows 7 и Windows 10. Мы обнаружили, что именно проблема была, включив возможности отладки для IE (IE > Свойства обозревателя > вкладка Дополнительно > просмотр > снимите флажок отключить отладку скриптов (Internet Explorer)). Эта функция обычно проверяется в нашей среде администраторами домена.

проблема была в том, что мы использовали console.debug(...) метод в нашем коде JavaScript. Предположение, сделанное разработчик (я) не хотел ничего писать, если консоль инструментов разработчика клиента не была явно открыта. В то время как Chrome и Firefox, казалось, согласны с этой стратегией, IE 11 не понравилось это один бит. Изменяя все console.debug(...) заявления console.log(...) операторы, мы смогли продолжить регистрировать дополнительную информацию в клиентской консоли и просматривать ее, когда она была открыта, но в противном случае держать ее скрытой от обычного пользователя.