我正在使用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();
}
}
先谢谢您了:)
答案 0 :(得分:1)
正如其他人所述,您可以使用自己的函数覆盖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
答案 1 :(得分:1)
重新定义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);
});
}
答案 2 :(得分:0)
即使有可能,这也是一种不好的做法。调试时,人眼可以看到控制台。执行console.log
通常需要几毫秒,因此在生产代码中执行它不是一个好主意。
我想说用布尔语言(例如ifDidX
和ifDidY
)进行编程会更好。但是,如果您确实必须执行此消息历史记录操作,则更好的选择是将消息存储在其他数组中。这是一个示例:
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");
}
}
答案 3 :(得分:0)
直接无法访问控制台输出,但是您可以做的是可以覆盖console.log,首先检查您的状况,然后输出内容,下面是该示例代码>
console.stdlog = console.log.bind(console);
console.log = function(msg){
if(msg == "something I want"){
...
}
console.stdlog.apply(console, arguments);
}
尽管您需要对此非常小心,因为如果在这种情况下添加任何console.log,它将创建一个无限循环。