2014-10-18 70 views
1

我需要console.log(),但它不工作,因爲有人已經做了一些事情來阻止它在生產站點。有沒有其他方式可以打印到控制檯?或者使用能夠打印完整對象(如console.log())的警報呢?或者重新定義console.log()以便它再次工作的方法?如何在控制檯對象的函數被覆蓋後使用console.log()?

jQuery庫可供我使用。

+0

不太瞭解控制檯,但我認爲控制檯是一個本地接口,因此它可能取決於它們如何阻止它。對於警報,在大多數情況下,如果對象中沒有任何循環指針,則可以嘗試:alert(JSON.stringify(object))。 – 2014-10-18 04:33:57

+1

一種解決方法可能是在執行任何其他腳本之前獲取對控制檯及其方法的引用......就像在頁面標題中添加一個腳本,該腳本將獲得像'var _console = console, _log = _console的引用。 log;'_log.call(_console,'some message')' – 2014-10-18 04:38:42

回答

2

您可以對該對象進行字符串化並將其附加到頁面上。 JSON.stringify有兩個額外的參數,replacer(忽略)和空格數,它會爲你做一些格式化。

像這樣簡單:

document.body.appendChild(document.createTextNode(JSON.stringify(obj, null, 2))); 

稍微複雜一點的例子: http://codepen.io/JAStanton/pen/qehpH

如果你告訴我,你希望得到什麼出來呢,我可以提供更多的幫助。你只關心對象/屬性嗎?你想知道物體上的功能等嗎?

+0

我正在使用jQuery'.find()',期望獲得某個DOM節點。但是當我將它插入到頁面中時,什麼都沒有發生。所以我想看看我從'.find()'回來的東西 – 2014-10-18 05:00:40

7

取決於他們如何阻止它,你可以使用這樣的東西。

console.log = function fake() {}; 
    console.log("oh no! it's not working!") 

    delete console.log; 
    console.log("whew. back again."); 

這隻會刪除所應用的定製定義。

如果他們做了比這更聰明的事情,你可能可以做這樣的事情。這會創建一個全新的iframe,並帶有全新的window對象,您可以從中提取原始文件console。這隻適用於body元素已經存在的情況。

var frame = document.createElement("iframe"); 
    frame.style.display = "none"; 
    document.body.appendChild(frame); 

    var myConsoleLog = function(message) { 
     (frame.contentWindow || frame).console.log(message); 
    } 
    myConsoleLog("this works too!");