2013-05-28 4 views
1

Я заметил странное поведение, при котором мои console.log заявления ничего не делали. Я, наконец, отслеживали его к внешнему сценарию:Внешние javascript hijacks 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> 

К сожалению, этот скрипт используется для запуска только пакет Heatmap для Google диаграмм (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

Где твоя попытка «мелкой резервной копии, но ей не повезло»? Я уверен, что есть более простой способ, но вы могли бы сделать это: var logger = console.log.bind (console); 'перед неудачной частью, а затем использовать' console.log = logger; ', чтобы восстановить его, может быть? – Ian

+2

Я бы открыл ошибку для проекта. [B] ioheatmap.js, строка 682 отключается, если firebug отсутствует. Это игнорирует другие браузеры, такие как Chrome. – gpojd

+0

* «не работает» * означает, что именно? –

ответ

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> 

EDIT: Вы, вероятно, может исправить код в OP, используя привязку:

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

с лога() метод жестко использовать «это» внутренне, мы должны принять " это «с нами, когда мы запоминаем метод.

+0

Эта мелкая копия работает стохастически и только для 'console.log ('test')' (из-за условий гонки, где код systembio еще не выполнен). Более поздние консольные инструкции не работают. – user

+0

каким образом они терпят неудачу? – dandavis

+0

Они не появляются. Пожалуйста, см. Ответ выше (это описано как ошибка в библиотеке). – user

3

Ваш код действительно работает, но только если объект 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 отмечает, что это главная ошибка в библиотеке, которую вы используете. Они должны действительно исправить это ...

Смежные вопросы