2016-02-10 2 views
0

Отрывок из моей Chrome Devtools консоли:Есть ли способ работать вокруг сайт (ы) нарушение console.log

Navigated to https://twitter.com/ 
console.log.toString(); 
"function(){}" 
Navigated to http://linuxfr.org/ 
console.log.toString(); 
"function log() { [native code] }" 

мне удалось внедрить код в основной раме twitter.com, с помощью Chrome Расширение, но мне было трудно понять, почему мой код, похоже, не запускался. Похоже, что мой код работает нормально, кроме console.log производит точно ничего!

Вопрос: есть ли способ назвать «теперь ушел» console.log «собственный код»?

(замечания по поводу такого рода JavaScript «WAT» поведение убирается, вид)

+0

Почему для вашего расширения требуется 'console.log'? – Bergi

+0

@Bergi Мне это не нужно, кроме как инструмент при кодировании/отладке – manuell

+1

Если вы установили сценарий содержимого 'run_at:" document_start "' - вы могли бы (теоретически) «захватить» 'console.log/error/dir/info' и т. д. до того, как твиттер получит свои грязные руки на них: D –

ответ

1

Поскольку это расширение Chrome, вы установили скрипт контента run_at: "document_start" - вы можете (теоретически) «захватить» console.log/error/dir/info и т.д., прежде чем твиттер получает это неряшливые руки на них

на самом деле, ЗНАЯ, что твиттер только заменяет журнал, предупреждаю, информация, ошибки, вы можете просто сделать:

var _console = ['log', 'warn', 'info', 'error'].reduce(function(result, key) { 
    result[key] = console[key].bind(console); 
    return result 
}, {}); 

, то вы можете использовать _console.log и друзей

+0

Не могли бы вы подробнее остановиться на« захвате ». Я использовал 'window.ConsoleLogBackup = Object.getPrototypeOf (console) .log; \t ConsoleLogBackup.apply (console, ["Hello"]); 'и теперь я могу« log »в моем скрипте (и в консоли), но я не уверен, что какой-то код - это правильный способ сделать это (и я хотел бы просто набрать 'ConsoleLogBackup (« Hello »)' – manuell

+0

уверен ... повиснуть на –

+0

Не спешите, это для меня: LUNCH :-) – manuell

1

Насколько я знаю, это зависит от того, насколько глубоко замена была сделана. Например, если он был, как этот

console.log = function() {}; 

оригинальный родной log функция все еще находится в прототипе. Вы можете получить к нему доступ, используя __proto__ или Object.getPrototypeOf.

console.log = null 
Object.getPrototypeOf(console).log 
//log() { [native code] } 

Также вы можете просто удалить замену из исходного объекта консоли

delete console.log 
//true 
console.log 
//log() { [native code] } 

Но все выше код не будет работать, если я заменить функцию журнала, как этот

console.__proto__.__proto__.log = function() {} 

И, к сожалению, я дон Не знаю обходного пути для этого случая.

+1

FYI - 'Object.getPrototypeOf (console) .log.call (console, 'hi')' работает как ожидалось –

+0

@JaromandaX Действительно, на Twitter.com. Вы имеете в виду, что он будет «всегда» работать? – manuell

+0

Я имел в виду в контексте этого вопроса, т. Е. Twitter.com - это может быть все потребности OP в любом случае –

1

Основываясь на обсуждении выше и @JaromandaX и JavaScript: The Definitive Guide ниже, это один простой полиполк.

function log() { 
    if (location.hostname === 'twitter.com'){ 
     Object.getPrototypeOf(console).log.apply(console, arguments); 
    } else { 
     console.log.apply(console, arguments); 
    } 
} 
Смежные вопросы