Я пытаюсь определить пользовательский установщик для свойства innerHTML
. К сожалению, я не могу получить доступ к базовому свойству после того, как я определил функцию установки:
$('body')[0].__defineSetter__("innerHTML",
function (val) {
alert("Setting to: " + val);
this.innerHTML = val;
});
Этот фрагмент заполняет стек вызовов, потому что назначение рекурсивно вызывает сеттер.
Очевидно, innerHTML
уже перегружено в IE8, и вы можете просто сохранить старую пару get / set и использовать ее в дескрипторе нового свойства. Взято из MSDN:
var innerHTMLdescriptor = Object.getOwnPropertyDescriptor(Element.prototype, 'innerHTML');
Object.defineProperty(Element.prototype, 'innerHTML',
{ set: function(htmlVal) {
var safeHTML = toStaticHTML(htmlVal);
innerHTMLdescriptor.set.call(this, safeHTML);
}
});
Однако, похоже, это не относится к Chrome, где getOwnPropertyDescriptor
возвращает неопределенное значение для innerHTML
. В таком случае, как мне получить доступ к базовому свойству?
Дополнительный вопрос: как мне обеспечить, чтобы все объекты, созданные в будущем, имели такое специальное поведение innerHTML
? Возможно ли использовать прототипы DOM для этого? Кажется, что перегрузка функции здесь не то, что мне нужно. Возможно, можно перегрузить конструктор DOM и добавить вызов __defineGetter__/defineProperty
, но похоже, что поддержка конструкторов не распространена, поэтому я хотел бы знать, есть ли альтернатива.