Domanda Ripristino di console.log ()


Per qualche motivo, la struttura del prototipo (o un altro codice JavaScript) che viene fornito con Magento sta sostituendo le funzioni di console standard, quindi non posso eseguire il debug di alcunché. Scrittura nella console JavaScript console Ottengo il seguente risultato:

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

sto usando Google Chrome version 13.0.782.112 su Linux.

Prototype JavaScript framework, version 1.6.0.3

C'è un modo rapido per risolvere questo?


40
2017-08-17 07:52


origine


risposte:


Per esempio,

delete console.log

ripristinerebbe anche console.log:

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

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

40
2017-08-17 08:14



Poiché la console originale si trova in oggetto window.console, provare a eseguire il ripristino window.console a partire dal iframe:

var i = document.createElement('iframe');
i.style.display = 'none';
document.body.appendChild(i);
window.console = i.contentWindow.console;
i.parentNode.removeChild(i);

Funziona per me su Chrome 14.


47
2017-08-17 08:02



Magento ha il seguente codice in /js/varien/js.js - commentalo e funzionerà.

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

11
2018-02-22 05:58



delete window.console ripristina l'originale console oggetto in Firefox e Chrome.

Come funziona? window è un oggetto ospitato e solitamente è implementato con un prototipo comune tra tutte le istanze (hai molte schede nel browser).

Alcuni sviluppatori stupidi di librerie / framework esterni (o Firebug, ecc.) sovrascrive la console delle proprietà di window istanza, ma non corrotta window.prototype. Dal delete operatore siamo tornati dalla spedizione console.* metodi per prototipare il codice.


6
2017-12-05 11:05



Salva un riferimento all'originale console in una variabile all'inizio della sceneggiatura e quindi utilizzare questo riferimento o ridefinire console per indicare il valore catturato.

Esempio:

var c = window.console;

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

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

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

2
2017-08-17 08:00



Le soluzioni fornite in questa domanda non risolvono più correttamente questo problema nei nuovi browser. L'unico che (sorta) di lavoro sta afferrando la console da un <iframe> come detto da @Xaerxess.

Ho scritto un userscript che protegge la console dalla sovrascrittura. Non infrange nessuno strumento che sovrascrive la console: chiama sia i metodi sovrascritti che quelli originali. Naturalmente può anche essere incluso nella pagina web.

// ==UserScript==
// @name        Protect console
// @namespace   util
// @description Protect console methods from being overriden
// @include     *
// @version     1
// @grant       none
// @run-at      document-start
// ==/UserScript==
{

    /**
      * This object contains new methods assigned to console.
      * @type {{[x:string]:Function}} **/
    const consoleOverridenValues = {};
    /**
      * This object contains original methods copied from the console object
      * @type {{[x:string]:Function}} **/
    const originalConsole = {};
    window.originalConsole = originalConsole;
    // This is the original console object taken from window object
    const originalConsoleObject = console;
    /**
     * 
     * @param {string} name
     */
    function protectConsoleEntry(name) {
        const protectorSetter = function (newValue) {
            originalConsole.warn("Someone tried to change console." + name + " to ", newValue);
            consoleOverridenValues[name] = function () {
                /// call original console first
                originalConsole[name].apply(originalConsoleObject, arguments);
                if (typeof newValue == "function") {
                    /// call inherited console
                    newValue.apply(window.console, arguments);
                }
            }
        }
        const getter = function () {
            if (consoleOverridenValues[name])
                return consoleOverridenValues[name];
            else
                return originalConsole[name];
        }
        Object.defineProperty(console, name, {
            enumerable: true,
            configurable: false,
            get: getter,
            set: protectorSetter
        });
    }

    /*
     *** This section contains window.console protection
     *** It mirrors any properties of newly assigned values
     *** to the overridenConsoleValues
     *** so that they can be used properly
    */

    /** 
      * This is any new object assigned to window.console
      * @type {Object} **/
    var consoleOverridenObject = null;
    /// Separate boolean is used instead
    /// of checking consoleOverridenObject == null
    /// This allows null and undefined to be assigned with 
    /// expected result
    var consoleIsOverriden = false;

    for (var i in console) {
        originalConsole[i] = console[i];
        protectConsoleEntry(i);
    }

    Object.defineProperty(window, "console", {
        /// always returns the original console object
       /// get: function () { return consoleIsOverriden ? consoleOverridenObject : originalConsoleObject; },
        get: function () { return originalConsoleObject; },
        set: function (val) {
            originalConsole.log("Somebody tried to override window.console. I blocked this attempt."
                + " However the emulation is not perfect in this case because: \n"
                + "     window.console = myObject;\n"
                + "     window.console == myObject\n"
                + "returns false."
            )
            consoleIsOverriden = true;
            consoleOverridenObject = val;

            for (let propertyName in val) {
                consoleOverridenValues[propertyName] = val[propertyName];
            }
            return console;
        },
    });
}

0
2017-11-23 22:56