JavaScript: 监听属性变化?
JavaScript: Listen for attribute change?
是否可以在 JavaScript 中监听属性值的变化?例如:
var element=document.querySelector('…');
element.addEventListener( ? ,doit,false);
element.setAttribute('something','whatever');
function doit() {
}
我想对 something
属性的任何更改做出回应。
我已经阅读了 MutationObserver
对象及其替代方法(包括使用动画事件的方法)。据我所知,它们是关于对实际 DOM 的更改。我对特定 DOM 元素的属性更改更感兴趣,所以我认为不是这样。当然在我的实验中它似乎不起作用。
我想这样做 没有 jQuery。
谢谢
你需要MutationObserver,在代码片段中我使用了setTimeout
来模拟修改属性
var element = document.querySelector('#test');
setTimeout(function() {
element.setAttribute('data-text', 'whatever');
}, 5000)
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.type === "attributes") {
console.log("attributes changed")
}
});
});
observer.observe(element, {
attributes: true //configure it to listen to attribute changes
});
<div id="test">Dummy Text</div>
这个问题已经回答了,但我想分享我的经验,因为突变观察者没有给我带来所需的见解。
注意这是某种 hacky 解决方案,但(至少)用于调试目的非常好。
您可以覆盖特定元素的 setAttribute
功能。这样您还可以打印调用堆栈,并了解“谁”更改了属性值:
// select the target element
const target = document.querySelector("#element");
// store the original setAttribute reference
const setAttribute = target.setAttribute;
// override setAttribte
target.setAttribute = (key: string, value: string) => {
console.trace("--trace");
// use call, to set the context and prevent illegal invocation errors
setAttribute.call(target, key, value);
};
是否可以在 JavaScript 中监听属性值的变化?例如:
var element=document.querySelector('…');
element.addEventListener( ? ,doit,false);
element.setAttribute('something','whatever');
function doit() {
}
我想对 something
属性的任何更改做出回应。
我已经阅读了 MutationObserver
对象及其替代方法(包括使用动画事件的方法)。据我所知,它们是关于对实际 DOM 的更改。我对特定 DOM 元素的属性更改更感兴趣,所以我认为不是这样。当然在我的实验中它似乎不起作用。
我想这样做 没有 jQuery。
谢谢
你需要MutationObserver,在代码片段中我使用了setTimeout
来模拟修改属性
var element = document.querySelector('#test');
setTimeout(function() {
element.setAttribute('data-text', 'whatever');
}, 5000)
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.type === "attributes") {
console.log("attributes changed")
}
});
});
observer.observe(element, {
attributes: true //configure it to listen to attribute changes
});
<div id="test">Dummy Text</div>
这个问题已经回答了,但我想分享我的经验,因为突变观察者没有给我带来所需的见解。
注意这是某种 hacky 解决方案,但(至少)用于调试目的非常好。
您可以覆盖特定元素的 setAttribute
功能。这样您还可以打印调用堆栈,并了解“谁”更改了属性值:
// select the target element
const target = document.querySelector("#element");
// store the original setAttribute reference
const setAttribute = target.setAttribute;
// override setAttribte
target.setAttribute = (key: string, value: string) => {
console.trace("--trace");
// use call, to set the context and prevent illegal invocation errors
setAttribute.call(target, key, value);
};