Почему 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(...)
, мы смогли продолжить запись дополнительной информации на клиентской консоли и просмотреть ее, когда она была открыта, но в противном случае сохранить ее скрытой от обычного пользователя.