2012-09-26 32 views
11

Ir a la página de inicio de sesión de Twitter y escriba lo siguiente en la consola:¿Por qué console.log es una función vacía en algunos sitios en Chrome?

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

(NOTA:. Cómo el tercer parámetro se establece en true que permite la captura de eventos Esto hace que los eventos a ser interceptados por primera vez por la ventana antes de ser consumido por un elemento hijo.)

Intenta presionar algunas teclas. Observe cómo hello no se envía a la consola. Agregar un detector de eventos para keydown o keyup no cambia nada.

hello obtendrá resultados en la mayoría de los sitios web, pero no en sitios como Twitter o Gmail.

¿Por qué? ¿Qué está deteniendo al oyente del evento?

EDITAR: Parece que funciona como se esperaba en Firefox. Pero no Chrome. ¿Por qué Chrome no activa el detector de eventos como se esperaba?

EDIT 2: Según lo deducen algunas personas a continuación, console.log es una función vacía en Chrome para sitios como Twitter y Gmail. ¿Porqué es eso?

+0

¿No deberías añadirlo a '' document' en lugar de ventana ¿? – Bergi

+0

Probablemente estén cancelando el evento usando 'keydown' para algunas teclas. – Shmiddty

+0

¿Por qué? (Y eso aún no resuelve el problema.) – Matm

Respuesta

15

Debido a que estos sitios han fijado específicamente (por webkit aparentemente):

console.log = function(){}; 

Sin embargo, en Chrome puede restaurar la funcionalidad original log() mediante la emisión de este comando en la consola:

console.log = console.__proto__.log 

A continuación, puede hacer esto:

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

Y debería funcionar como se espera

+0

Eso no parece ser el problema. Hice una edición en la publicación original para aclarar: incluso con la captura de eventos activada, todavía no se está llamando al oyente. – Matm

+0

preguntó esto en otra publicación ya: pero ¿por qué console.log es una función vacía en Chrome, pero no en Firefox? – Matm

+0

Específicamente sobrescriben la función para webkit, me imagino. Mirando a través de las secuencias de comandos ahora mismo ... – canon

0

Es un problema con console.log. intente esto en su lugar:

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

Interesante. ¿Está console.log por siempre manguera en este escenario? ¿Hay alguna forma de recuperar su funcionalidad original? – Matm

+0

que todavía me confunde. ¿Por qué console.log es una función vacía en Chrome, pero no en Firefox? – Matm

+0

Específicamente sobrescriben la función para webkit, me imagino ... – canon

0

Este problema no ocurre en Firefox.

He comprobado en Chrome y aparentemente por alguna razón las páginas de Gmail y Twitter terminan reasignando console.log a una función vacía function() {}, por lo que se llama a su controlador pero no hace nada. Si prueba alert() en lugar de console.log, lo verá funcionando.

Interesante.

+0

Oh wow. Muy interesante. – Matm

+0

@ jfriend00, eso me suena a The Right Answer. – Matm

+0

@Matm - OK, puse ese comentario en una respuesta y eliminé mi comentario. – jfriend00

2

A los desarrolladores les gusta poner console.log() declaraciones en su código para la resolución de problemas/depuración. A veces, se olvidan de eliminarlos todos al verificar el código de producción. Una simple protección contra esto es redefinir console.log() en el código de producción para que sea una función vacía que no hace nada, incluso si un desarrollador accidentalmente deja una entrada, no causará ningún resultado o lanzará una excepción cuando no haya un objeto console cuando no esté funcionando el depurador (como en IE).

Algunos navegadores pueden proteger contra la sustitución de esa función por lo que es de sólo lectura tal que no se puede sobrescribir de esta manera, pero si lo hacen, entonces debe existir el objeto de la consola por lo que hay todavía ningún daño de una declaración ocasional console.log().El principal daño de estas declaraciones sobrantes console.log() es en IE donde causa una excepción porque el objeto console no existe a menos que se esté ejecutando el depurador.

+0

Excepto que puedo anular console.log correctamente también en Firefox. Por lo tanto, no puede ser algo específico del navegador: debe ser Twitter específicamente dirigido a Webkit (como se menciona en el canon) – Matm

+0

. Pueden agregar una función vacía en el código de producción, pero no pueden eliminar las declaraciones de registro. Esos son algunos desarrolladores tontos. ¿Crees que esa es realmente la razón? – Rudie

Cuestiones relacionadas