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

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

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

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

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

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

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

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

Ответ 1

Похоже, что у вас может быть код отладки в вашем javascript.

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

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

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

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

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

Ответ 2

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;
        }
    }
}());

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

Ответ 3

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

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

Например:

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

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

Если вы используете AngularJS версии 1.X, вы можете использовать службу $log вместо непосредственного использования console.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!');
 }]);

Angular 2+ не имеет встроенной службы ведения журнала.

Ответ 8

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

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

Ответ 9

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

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

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

Ответ 10

Если вы используете angular и т.е. 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.

Ответ 11

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

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