webentwicklung-frage-antwort-db.com.de

Wiederherstellen von console.log ()

Aus irgendeinem Grund ersetzt das mit Magento gelieferte Prototyp-Framework (oder ein anderer JavaScript-Code) die Standard-Konsolenfunktionen, sodass ich nichts debuggen kann. In der JavaScript-Konsole console notiere ich folgende Ausgabe:

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

Ich benutze Google Chrome version 13.0.782.112 unter Linux.

Prototype JavaScript framework, version 1.6.0.3

Gibt es einen schnellen Weg, dies zu lösen?

44
s3v3n

Zum Beispiel,

delete console.log

würde auch console.log wiederherstellen:

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

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

Da sich die ursprüngliche Konsole im window.console-Objekt befindet, versuchen Sie, window.console aus iframe wiederherzustellen:

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);

Funktioniert für mich auf Chrome 14.

56
Xaerxess

Magento hat den folgenden Code in /js/varien/js.js - kommentieren Sie es aus und es wird funktionieren.

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

delete window.console stellt das ursprüngliche console-Objekt in Firefox und Chrome wieder her.

Wie funktioniert das? window ist ein gehostetes Objekt und wird normalerweise mit einem gemeinsamen Prototyp zwischen allen Instanzen implementiert (Sie haben viele Registerkarten im Browser).

Einige dumme Entwickler externer Bibliotheken/Frameworks (oder Firebug usw.) überschreiben die Eigenschaftskonsole der window-Instanz, beschädigen jedoch window.prototype nicht. Mit dem Operator delete schicken wir zurück von den console.*-Methoden zum Prototypcode.

7
gavenkoa

Speichern Sie einen Verweis auf die ursprüngliche console in einer Variablen ganz am Anfang des Skripts und verwenden Sie dann entweder diesen Verweis oder definieren Sie console neu, um auf den erfassten Wert zu zeigen.

Beispiel:

var c = window.console;

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

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

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

Nur für den Fall, dass jemand der gleichen Situation gegenübersteht. Ich habe auf die ursprüngliche Antwort für Xaerxess nicht geantwortet, weil ich nicht genug Reputation habe, um dies zu tun. Sieht so aus, als ob dies die richtige Antwort ist, aber aus irgendeinem Grund stelle ich fest, dass es manchmal in meiner Software und in meiner Software funktioniert manchmal nicht ...

Also habe ich versucht, den Löschvorgang abzuschließen, bevor ich das Skript ausgeführt habe, und es sieht so aus, als ob alles zu 100% funktioniert.

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;

}

Vielen Dank an alle.

1
OnTheFly

Die Lösungen in dieser Frage lösen dieses Problem in neuen Browsern nicht mehr richtig. Das Einzige, das (irgendwie) funktioniert, ist das Ergreifen der Konsole von einem <iframe>, wie von @Xaerxess gesagt.

Ich habe ein Userscript geschrieben, das die Konsole vor dem Überschreiben schützt. Es werden keine Tools beschädigt, die die Konsole überschreiben - es werden sowohl die überschriebenen als auch die ursprünglichen Methoden aufgerufen. Es kann natürlich auch in eine Webseite eingebunden werden.

// ==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
Tomáš Zato
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
}

Getestet auf Chrome 71 und Firefox 65 

0
Marco Cesarato