function dispatch(value, cancelable = false) {
const bodybgcolorchange = new CustomEvent("bodybgcolorchange", {
detail: {
name: "bodybgcolor",
value
},
cancelable
});
return document.body.dispatchEvent(bodybgcolorchange);
}
function patchStyle() {
// уже попатчен, ничего не делаем
if (Object.hasOwn(HTMLBodyElement.prototype, 'style')) return;
// берём дескриптор style из HTMLElement
const {get, ...rest} = Object.getOwnPropertyDescriptor(
HTMLElement.prototype,
'style'
);
// задаём дескриптор style в HTMLBodyElement
Object.defineProperty(HTMLBodyElement.prototype, 'style', {
...rest,
get() {
// оборачиваем возврат геттера в прокси
return new Proxy(get.call(this), {
// слушаем установку свойств style
set(target, key, value) {
// если нужный ключ и событие отменено - ничего не делаем
if (key === 'backgroundColor' && !dispatch(value, true))
return;
// иначе устанавливаем значение как обычно
target[key] = value;
}
})
}
})
// не хватает обработки set style
// не хватает обработки set style[number]
// не хватает обработки set style.background
// не хватает обработки set cssText
// не хватает подмены setProperty
// ...
}
patchStyle();
document.body.addEventListener("bodybgcolorchange", (event) => {
console.log(event);
if(!confirm(`Разрешить смену цвета на ${event.detail.value}?`)) {
event.preventDefault()
}
});
document.body.style.backgroundColor = '#f00';
setTimeout
\setInterval
и долбить сверяя предыдущее значение с текущим.HTMLBodyElement.prototype
свойства style
, bgColor
и методы setAttribute
\setAttributeNS
и слушать там изменения.getComputedStyle
.clamp(0px, -100000, Npx) = 0px
clamp(0px, 100000, Npx) = Npx
Остаётся только эксперементировать и надеяться на лучшше:
1. Попробуй всё обернуть в
<div lang="ru">
.2. Попробуй в лоб написать
<head><meta charset="windows-1251"></head>
.Кстати пример кракозябров бы не помешал, чтобы понять какая там разница в кодировках.
P.S. Может обратиться к автору приложения, чтоб добавил поддержку мультиязычности?