Я пытаюсь кодировать крошечное расширение, чтобы в нижней части страницы отображалось всплывающее окно, указывающее, есть ли какие-либо предупреждения или ошибки в консоли (без открытых инструментов dev, которые могут раздражать на небольших мониторах).
После некоторых исследований я обнаружил, что нет прямого способа чтения с консоли. Но было предложено заменить console.log
, console.warn
и т. Д. Новыми методами, которые будут перехватывать вызовы и только затем вызывать оригинальные методы.
Вот где я сейчас нахожусь в моем content.js
:
window.onload = () => {
const logs = []
let listener = null
const methods = ['log', 'info', 'warn', 'error']
methods.forEach(method => {
// Saving the old method
const save = console[method].bind(console)
// Replacing the old method
console[method] = (...args) => {
save(...args)
logs.push({ method, args })
listener && listener()
}
})
const popup = document.createElement('div')
popup.classList.add('pinned-console-popup')
document.body.appendChild(popup)
const apply = () => {
popup.classList.remove('warn')
popup.classList.remove('error')
const warnCount = logs.filter(({ method }) => method === 'warn').length
const errorCount = logs.filter(({ method }) => method === 'error').length
if(warnCount)
popup.classList.add('warn')
if(errorCount)
popup.classList.add('error')
popup.textContent = `${errorCount || warnCount || 0}`
}
apply()
listener = apply
}
Я не знаю почему, но происходит нечто странное: методы заменяются, если я проверяю их сразу после forEach
, я вижу, что они заменяются. Но затем, если я запускаю журнал или предупреждение из другого места, console
все еще имеет старые методы, поэтому здесь ничего не сработает. Почему?