【问题标题】:How to capture console.log from external sources?如何从外部来源捕获 console.log?
【发布时间】:2019-02-21 10:05:09
【问题描述】:

我了解如何修改 console.log 函数来拦截日志并将其推送到数组中。但是,这似乎不适用于所有控制台日志。在我的 html 中,我加载了一个 html webapp (\creative\300x600 with video\index.html),它也执行了一个 console.log("click detected"),我可以在我的 chrome 开发工具中看到,但没有被控制台捕获。 ogs(代码示例中的第二个脚本)。我怀疑因为这是一个正在加载的外部文件,所以我无法拦截它。

是否有解决方案可以从任何来源获取所有 console.log 并保存?

<!DOCTYPE html>
<head>
<script>

//add index.html to div on click

function load_home() {
    console.log("Loaded");
    document.getElementById("content").src='creative\\300x600 with video\\index.html';

}
window.addEventListener("click",load_home);
</script>
<script>

//modify console.log

console.defaultLog = console.log.bind(console);
console.logs = [];
console.log = function() {
    console.defaultLog.apply(console, arguments);
    console.logs.push(Array.from(arguments));
};
    </script>
</head>
<html>
<iframe id="content" style="width: 300px; height:600px; background-color:blue"  ></iframe>
</body>
</html>

编辑:

尝试在 div 而不是 iframe 上制作它,同样的问题是无法记录外部 html 的 console.log。只有来自 load_home 函数的console.log("loaded") 被记录。

<!DOCTYPE html>
<head>

<script>
function load_home() {
    console.log("Loaded");
     document.getElementById("content").innerHTML='<object type="text/html" data="creative\\300x600 with video\\index.html" ></object>';


}
window.addEventListener("click",load_home);
</script>
<script>
console.defaultLog = console.log.bind(console);
console.logs = [];
console.log = function() {
    console.defaultLog.apply(console, arguments);
    console.logs.push(Array.from(arguments));
};
    </script>
</head>
<html>


<div id="content" style="width: 300px; height:600px; z-index:-1;" ,"onclick=load_home();" </div>

</body>
</html>

【问题讨论】:

    标签: javascript iframe console.log


    【解决方案1】:

    这里的问题是因为iframeiframes 有一个不同的 window 对象,独立于父级的 window 对象。这意味着您对父级的 window.console 所做的任何修改都不会影响 iframe 的 window.console

    您可以通过contentWindow 获取框架的window 对象并修改其console。但是您必须为每个现在和未来 iframe 执行此操作。此外,您无法访问从另一个域呈现页面的 iframe 的 contentWindow

    如果您尝试捕获所有帧的日志并以某种方式将它们合并到一个大日志中,更好的选择是在您要跟踪的每个页面上都使用相同的 console-altering 脚本。然后将所有日志发送到服务器,按时间戳或其他东西排序。这就是Sentry 的工作原理。

    【讨论】:

    • 我更新了原始问题中的代码以使用 div 而不是 iframe,但仍然遇到同样的问题。为了澄清起见,外部 html 加载了一个控制台日志,该日志在 chrome 开发工具中可见,但没有被我修改的函数记录。这是否意味着我需要访问外部 html 并修改该 console.log 函数?
    • @kevhol 外部页面,无论是加载到&lt;iframe&gt; 还是&lt;object&gt;,都是一个完全不同的文档,具有自己的全局范围。让您的脚本工作的唯一方法是访问该页面(即您可以访问代码,或者托管在同一个域中)。
    • 外部文件托管在同一个域上。我正在研究如何访问该页面并更改该范围内的变量。
    猜你喜欢
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 2015-10-09
    相关资源
    最近更新 更多