Restaurando consola.log()

5 minutos de lectura

avatar de usuario de s3v3n
s3v3n

Por alguna razón, el framework prototipo (u otro código JavaScript) que se envía con Magento está reemplazando las funciones estándar de la consola, por lo que no puedo depurar nada. Escribir en la consola de JavaScript console Obtengo el siguiente resultado:

> console
Object
assert: function () {}
count: function () {}
debug: function () {}
dir: function () {}
dirxml: function () {}
error: function () {}
group: function () {}
groupEnd: function () {}
info: function () {}
log: function () {}
profile: function () {}
profileEnd: function () {}
time: function () {}
timeEnd: function () {}
trace: function () {}
warn: function () {}

Estoy usando Google Chrome version 13.0.782.112 en Linux.

Prototype JavaScript framework, version 1.6.0.3

¿Hay una manera rápida de resolver esto?

  • Echa un vistazo a stackoverflow.com/questions/7081433/…

    – Reto Aebersold

    17 de agosto de 2011 a las 7:56

  • Parece que hay un problema abierto con Magento con respecto a esto: magentocommerce.com/bug-tracking/issue/?issue=11312

    – RoccoC5

    17 de agosto de 2011 a las 8:09

  • Sí, parece que tengo este problema, pero no tengo la intención de cambiar el código de Magento y, para desarrolladores, estoy de acuerdo con la solución aceptada.

    – s3v3n

    17 de agosto de 2011 a las 8:13

Avatar de usuario de Xaerxess
Xerxess

Dado que la consola original está en el objeto window.console, intente restaurar window.console de iframe:

var i = document.createElement('iframe');
i.style.display = 'none';
document.body.appendChild(i);
window.console = i.contentWindow.console;
// with Chrome 60+ don't remove the child node
// i.parentNode.removeChild(i);

Funciona para mí en Chrome 14.

  • Para cualquiera que vaya a usar esto, por favor recuerden limpiar después de ustedes mismos. alias: i.parentNode.removeChild(i);

    – Seth Holladay

    23 mayo 2014 a las 15:38


  • Esta respuesta realmente funciona en las versiones actuales de Chrome (52+), mientras que la respuesta aceptada no lo hace.

    – SB

    8 de agosto de 2016 a las 9:29

  • ¡Esta es la respuesta más creativa que he visto! Gracias.

    – sedrán

    5 de diciembre de 2016 a las 13:47

  • @NickCoad Todavía funciona después del último i.parentNode.removeChild(i)¿no es así?

    – Xerxess

    1 de agosto de 2017 a las 9:54

  • Estoy usando Chrome 63 (Canary) y esta respuesta funciona, pero solo sin la línea i.parentNode.removeChild(i);.

    – Vórtice cinco

    21 de septiembre de 2017 a las 14:51

avatar de usuario de pimvdb
pimvdb

Por ejemplo,

delete console.log

también restauraría console.log:

console.log = null;
console.log;         // null

delete console.log;
console.log;         // function log() { [native code] }

  • ¡Sí! ¡Esto es aún mejor! Por eso me encanta stackoverflow 😀

    – s3v3n

    17 de agosto de 2011 a las 8:17

  • probar delete window.console en cambio, eso me funciona en Chrome 30.x;

    – Uno de uno

    19/09/2013 a las 22:45

  • Ya no funciona en Chrome 52. Se puede probar en Twitter, por ejemplo: console.log -> function() {}eliminar console.log o window.console.log simplemente lo eliminará, sin restaurar el comportamiento original.

    – SB

    8 de agosto de 2016 a las 9:26

  • puedo confirmar… no funciona en cromo más nuevo. Estoy trabajando para extender owncloud y eliminaron console.log (¿WTF?)

    – MilMike

    5 de septiembre de 2016 a las 14:18

  • Aquí hay un truco que podría ayudar a que Chrome no restaure la función de registro nativo cuando se usa delete console.log… Si está dispuesto a instalar (o ya tiene) TamperMonkey, entonces solo necesita un script simple… setTimeout(() => { unsafeWindow.console = window.console; }, 2000); Los scripts de Tampermonkey obtienen su propia copia de un window objeto, por lo que todo lo que necesita hacer es restaurar el objeto de la consola original después de un retraso. Modifique según sea necesario… (Asegúrese de eliminar el valor predeterminado // @grant none).

    –Michael Bray

    16 de agosto de 2018 a las 4:49


Magento tiene el siguiente código en /js/varien/js.js – coméntalo y funcionará.

if (!("console" in window) || !("firebug" in console))
{
    var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
    "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];

    window.console = {};
    for (var i = 0; i < names.length; ++i)
        window.console[names[i]] = function() {}
}

Por si alguien se enfrenta a esta misma situación.
No respondí a la respuesta original de Xaerxess porque no tengo suficiente reputación para hacerlo.
Parece que esa es la respuesta correcta, pero por alguna razón me doy cuenta de que a veces funciona en mi software y otras no…

Así que intenté completar la eliminación antes de ejecutar el script y parece que todo funciona bien el 100% de las veces.

if (!("console" in window) || !("firebug" in console))
{

  console.log = null;
  console.log;         // null

  delete console.log;

  // Original by Xaerxess
  var i = document.createElement('iframe');
  i.style.display = 'none';
  document.body.appendChild(i);
  window.console = i.contentWindow.console;

}

Gracias a todos.

avatar de usuario de givekoa
dadokoa

delete window.console restaura el original console objeto en Firefox y Chrome.

¿Como funciona esto? window es un objeto alojado y normalmente se implementa con un prototipo común entre todas las instancias (tienes muchas pestañas en el navegador).

Algunos desarrolladores tontos de bibliotecas/marcos externos (o bicho de fuegoetc.) anulan la consola de propiedades del window instancia, pero no corrompe window.prototype. Por el delete operador estamos de vuelta despachando desde el console.* métodos para prototipo de código.

function restoreConsole() {
  // Create an iframe for start a new console session
  var iframe = document.createElement('iframe');
  // Hide iframe
  iframe.style.display = 'none';
  // Inject iframe on body document
  document.body.appendChild(iframe);
  // Reassign the global variable console with the new console session of the iframe 
  console = iframe.contentWindow.console;
  window.console = console;
  // Don't remove the iframe or console session will be closed
}

Probado en Chrome 71 y Firefox 65

Avatar de usuario de Russ Cam
cámara rusa

Guardar una referencia al original console en una variable al comienzo del script y luego use esta referencia o redefina console para señalar el valor capturado.

Ejemplo:

var c = window.console;

window.console = {
    log :function(str) {
        alert(str);
    }
}

// alerts hello
console.log("hello");

// logs to the console
c.log("hello");

  • Claro que podría hacerlo, inyectando algo de JS justo antes de todo y estoy seguro de que esta solución funciona, pero quería una forma rápida de resolver el problema. Gracias de cualquier manera

    – s3v3n

    17 de agosto de 2011 a las 8:10

¿Ha sido útil esta solución?