我正在编写我的HTML组件,它侦听元素上的属性变化,并根据属性的值更新自我模型。这是通过使用Mutation观察者完成的:
var $element = document.createElement('div');
var observer = new MutationObserver(function(mutations) {
for (var i = 0; i < mutations.length; i++){
var mutation = mutations[i];
if (mutation.type === "attributes"){
var attr = mutation.attributeName;
$element[attr] = parseAttr($element.getAttribute(attr));
}
}
})
observer.observe($element, {
attributes: true
})
反向操作继续改变价值:
Object.defineProperty($element, "some_property" ,{
configurable: false,
enumerable: false,
get: function(){ return this._value},
set: function(v){
this._value = v;
//There’s trouble
this.setAttribute("some_property", stringify(v));
}
});
这样设置元素的属性会导致属性观察者触发器,而触发器又会尝试设置值,依此类推。
有没有办法setAttribute
没有突变观察者被触发?
在设置值然后打开它之前关闭观察者是否更好:
observer.disconnect();
setAttribute(name, value);
observer.observe($element, observeConfig);
或设置标志以忽略突变事件:
ignoreOneAttrChange = true;
setAttribute(name, value);
...
//in observer event
if (ignoreOneAttr) { ignoreOneAttr = true; return }
...