如果我想使javascript对象的属性不可变,我可以使用defineProperties()
,defineProperty()
和freeze()
之类的Object方法。我的问题是,我如何对HTML元素属性做同样的事情?
我已经尝试过上述方法,虽然它们可以用来防止直接设置元素的属性(例如elem.id = 'foo';
),但正如预期的那样,仍然可以通过{{1}更改基础属性}}
“不,不可能”的答案是可以接受的,但我还没有遇到任何明确的声明。
答案 0 :(得分:4)
您可以使用变异观察器来恢复旧的属性值。
new MutationObserver(callback)
.observe(elem, {attributes: true, attributeOldValue: true});
function callback(mutations, observer) {
var target = mutations[0].target;
observer.disconnect();
mutations.forEach(function(mutation) {
target.setAttribute(mutation.attributeName, mutation.oldValue);
});
observer.observe(target, {attributes: true, attributeOldValue: true});
}
感谢@DoctorDestructo提供了涉及observer.disconnect
的建议,这些建议是避免无限循环所必需的。