外部javascript劫持console.log

时间:2013-05-28 19:36:51

标签: 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>
  <script type="text/javascript">
//  uncommenting the following line ruins console.log
//    systemsbiology.load("visualization", "1.0", {packages:["bioheatmap"]});
  </script>

不幸的是,此脚本用于运行谷歌图表(AFAIK)的唯一热图包。

有没有办法以某种方式备份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">
var temp = console.log;
//  the following line ruins console.log
systemsbiology.load("visualization", "1.0", {packages:["bioheatmap"]});

console.log = temp;
console.log('test'); // does not work

  </script>

现在我问的是一个知道自己在做什么的人。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

您的代码可以正常工作,但前提是保留console对象,并替换其中的方法。

var temp = console.log;

//  the following line ruins console.log
console.log = function() {};

// put console.log back
console.log = temp;
console.log('test');

http://jsfiddle.net/CBv2T/

如果替换了console对象,我怀疑是这种情况,这将无效。那么为什么不保存/恢复整个控制台对象呢?

var temp = console;

//  the following line ruins console.log
window.console = {};

// Put the whole console object back
window.console = temp;
console.log('test');

http://jsfiddle.net/CBv2T/1/


但正如@gpojd所说,这是你正在使用的库中的一个主要错误。他们应该真的解决这个问题......

答案 1 :(得分:0)

<!-- 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>

编辑:您可以使用bind修复OP中的代码:

  var temp = console.log.bind(console);

由于log()方法被硬编码为在内部使用“this”,因此我们需要在记忆方法时将“this”与我们一起使用。