簡體   English   中英

閱讀console.log()輸出形式的javascript

[英]Read console.log() output form javascript

我正在使用Greasemonkey為一個應用程序編寫覆蓋UI,將JS注入頁面。

現在,我有一個問題要掛在網頁上運行的一些ajax調用上。 但是,該頁面正在生成控制台日志,通知內容已完全加載。 我的問題是:

用普通的javascript,是否有可能讀取完全不同的腳本生成的控制台輸出?

function blackBox(){
   //this is generating come console output.
   //this runs on code layer I have no access to.
}

function readConsole(){
   //read console record by record
   if(console.msg == "something I want"){
      doSomething();
   }

}

提前致謝 :)

正如其他人所述,您可以使用自己的命令覆蓋console.log()函數,並實現自己的實現:

var oldLog = unsafeWindow.console.log;
var messages = [];

unsafeWindow.console.log = function(msg) {
    messages.push(msg);
    oldLog.apply(null, arguments);
}

// Access the entire console.log history in messages

重新定義console.log並在陣列上存儲消息:

var consoleStorage = [];

console.log = function(msg){
   consoleStorage.push(msg);
   console.warn(msg); // if you need to print the output
}

現在您可以閱讀所有日志:

function readConsole(){
   //read console record by record
   consoleStorage.forEach(msg => {
      doSomething(msg);
   });
}

即使有可能,這也是一種不好的做法。 調試時,人眼可以看到控制台。 執行console.log通常需要幾毫秒,因此在生產代碼中執行它不是一個好主意。

我會說用boolean編程(例如ifDidXifDidY )會更好。 但是,如果您確實必須執行此消息歷史記錄操作,則更好的選擇是將消息存儲在其他數組中。 這是一個例子:

 var messagesLog = []; //Since console.log takes several milliseconds to execute, you should tick this to false in production code. const logToConsole = true; function logMessage( message ){ //adds message to JS log. messagesLog.push(message); //performs console.log if not production code if(logToConsole){ console.log(message); } } logMessage("pizza"); logMessage("second to last message"); logMessage("last message"); //checks last message and this will be true if( messagesLog[messagesLog.length - 1] == "last message" ){ logMessage("The last message in the log was 'last message'"); } //checks last message and this will be false if( messagesLog[messagesLog.length - 1] == "pizza" ){ logMessage("This will not occur because the last message was 'last message'"); } //searches through log to find certain message for(let i = 0; i < messagesLog.length; i++){ if(messagesLog[i] == "pizza"){ logMessage("one of the messages in the log was pizza"); } } 

直接無法訪問控制台輸出,但是您可以做的是可以覆蓋console.log,首先檢查您的狀況,然后輸出內容,下面是該示例代碼

console.stdlog = console.log.bind(console);
console.log = function(msg){
    if(msg == "something I want"){
    ...
    }
    console.stdlog.apply(console, arguments);
}

盡管您需要非常小心,因為如果在這種情況下添加任何console.log,它將創建一個無限循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM