Почему console.log пустая функция на некоторых сайтах в Chrome?

Перейдите на страницу входа в Twitter и введите в консоли следующее:

window.addEventListener('keypress', function(e){console.log('hello')}, true)

(ПРИМЕЧАНИЕ: как третий параметр установлен на true, который позволяет захватывать события. Это приводит к тому, что события сначала перехватываются окном перед тем, как его потребляет дочерний элемент.)

Попробуйте нажать несколько клавиш. Обратите внимание, что hello не выводится на консоль. Добавление прослушивателя событий для keydown или keyup ничего не меняет.

hello будет отображаться на большинстве веб-сайтов, но не на таких сайтах, как Twitter или Gmail.

Почему? Что останавливает прослушиватель событий?

EDIT: Кажется, работает в Firefox. Но не Chrome. Почему Chrome не запускает прослушиватель событий, как ожидалось?

ИЗМЕНИТЬ 2: Как показано несколькими людьми ниже, console.log является пустой функцией в Chrome для таких сайтов, как Twitter и Gmail. Почему это?

Ответ 1

Поскольку эти сайты специально настроены (видимо, для webkit):

console.log = function(){};

Однако в Chrome вы можете восстановить исходную функциональность log(), выпустив эту команду в консоли:

console.log = console.__proto__.log

Затем вы можете сделать это:

window.addEventListener('keypress', function(e){console.log('hello')}, true)

И он должен работать как ожидалось.

Ответ 2

Разработчикам нравится размещать в своем коде инструкции console.log() для устранения неполадок/отладки. Иногда они забывают вытащить их всех при проверке производственного кода. Простая защита от этого заключается в том, чтобы переопределить console.log() в производственном коде как пустую функцию, которая ничего не делает, даже если разработчик случайно покидает ее, это не вызовет никакого вывода или не выдаст исключение, если нет console объект, когда не запущен отладчик (например, в IE).

Некоторые браузеры могут защитить от замены этой функции, сделав ее доступной только для чтения, чтобы ее нельзя было перезаписать таким образом, но если они это сделают, тогда объект консоли должен существовать, чтобы по-прежнему не было никакого вреда от случайный console.log(). Основной вред этих оставшихся console.log() операторов в IE, где он вызывает исключение, потому что объект console не существует, если не запущен отладчик.

Ответ 3

Это проблема с console.log. попробуйте это вместо:

window.addEventListener('keypress', function(e){alert('hello')}, true)

Ответ 4

Эта проблема не возникает в Firefox.

Я проверил Chrome и, по-видимому, почему-то страницы Gmail и Twitter в конечном итоге переназначают console.log пустой функции function () {}, поэтому ваш обработчик вызывается, но ничего не делает. Если вы попробуете alert() вместо console.log, вы увидите, что он работает.

Интересно.

Ответ 5

Получите его из iframe:

function setConsole() {
  var iframe = document.createElement('iframe');
  iframe.style.display = 'none';
  document.body.appendChild(iframe);
  console = iframe.contentWindow.console;
  window.console = console;
}

(и затем назовите его)

setConsole()

источник: https://gist.github.com/cowlicks/a3bc662b38c36483b35f74b2b54e37c0