外部javascript劫持console.log
我注意到一个奇怪的行为,我的外部javascript劫持console.log,javascript,Javascript,我注意到一个奇怪的行为,我的console.log语句没有做任何事情。我最终跟踪到了一个外部脚本: <!-- Load the systems bio heatmap package --> <script type="text/javascript" src="http://systemsbiology-visualizations.googlecode.com/svn/trunk/src/main/js/load.js"></script> <
console.log
语句没有做任何事情。我最终跟踪到了一个外部脚本:
<!-- Load the systems bio heatmap package -->
<script type="text/javascript" src="http://systemsbiology-visualizations.googlecode.com/svn/trunk/src/main/js/load.js"></script>
<script type="text/javascript">
// uncommenting the following line ruins console.log
// systemsbiology.load("visualization", "1.0", {packages:["bioheatmap"]});
</script>
现在我在问一个知道他在做什么的人
提前感谢你的帮助
<!-- backup console log method -->
<script> var temp = console.log.bind(console); </script>
<!-- Load the systems bio heatmap package -->
<script src="http://systemsbiology-visualizations.googlecode.com/svn/trunk/src/main/js/load.js"></script>
<!-- restore console log method -->
<script>
console.log = temp;
console.log('test'); // does work
</script>
由于log()方法是硬编码的,在内部使用“this”,因此在记忆该方法时,我们需要随身携带“this”
由于log()方法是硬编码的,在内部使用“this”,因此在记忆该方法时,我们需要随身携带“this”。您的代码确实有效,但前提是保留了控制台
对象,并替换了其上的方法
var temp = console.log;
// the following line ruins console.log
console.log = function() {};
// put console.log back
console.log = temp;
console.log('test');
相反,如果替换了控制台
对象(我怀疑是这种情况),这将不起作用。那么为什么不保存/恢复整个控制台对象呢
var temp = console;
// the following line ruins console.log
window.console = {};
// Put the whole console object back
window.console = temp;
console.log('test');
但正如@gpojd所指出的,这是您正在使用的库中的一个主要错误。他们应该真的修复…您的代码确实可以工作,但前提是保留
控制台
对象,并替换其上的方法
var temp = console.log;
// the following line ruins console.log
console.log = function() {};
// put console.log back
console.log = temp;
console.log('test');
相反,如果替换了控制台
对象(我怀疑是这种情况),这将不起作用。那么为什么不保存/恢复整个控制台对象呢
var temp = console;
// the following line ruins console.log
window.console = {};
// Put the whole console object back
window.console = temp;
console.log('test');
但正如@gpojd所指出的,这是您正在使用的库中的一个主要错误。他们真的应该解决这个问题……您尝试的“浅备份但没有运气”在哪里?我相信有一种更简单的方法,但您可以这样做:
var logger=console.log.bind(console)代码>在坏零件之前,然后使用console.log=logger代码>可能要恢复它?我会为项目打开一个bug。[B] ioheatmap.js,如果firebug不存在,第682行将关闭它。这忽略了其他浏览器,如Chrome。“不工作”的确切含义是什么?@FelixKling在本例中,我相信“不工作”的意思是TypeError:非法调用
@gpojd+1很好。至少我可以获取我自己的本地版本的文件,并注释掉他们的“帮助”代码。免费代码从网络。。。值得每一分钱。你们的“浅备份但并没有运气”的尝试在哪里?我相信有一种更简单的方法,但您可以这样做:var logger=console.log.bind(console)代码>在坏零件之前,然后使用console.log=logger代码>可能要恢复它?我会为项目打开一个bug。[B] ioheatmap.js,如果firebug不存在,第682行将关闭它。这忽略了其他浏览器,如Chrome。“不工作”的确切含义是什么?@FelixKling在本例中,我相信“不工作”的意思是TypeError:非法调用
@gpojd+1很好。至少我可以获取我自己的本地版本的文件,并注释掉他们的“帮助”代码。免费代码从网络。。。值得每一分钱。这个浅拷贝随机工作,并且仅适用于console.log('test')
(由于竞争条件,systemsbio代码尚未执行)。以后的控制台语句不起作用。它们不会出现。请参阅上面的答案(它被描述为库中的一个bug)。“不显示”有点夸张,但它可能是破坏方法的非法调用,请参阅我更新的答案以获得该修复…此浅拷贝随机工作,仅适用于console.log('test')
(由于竞争条件,systemsbio代码尚未执行)。稍后的控制台语句不起作用。它们不会出现。请参阅上面的答案(在库中被描述为一个bug)。“不出现”有点夸张,但可能是非法调用破坏了该方法,请参阅我更新的答案以获得修复。。。