Baseline Widely available
MutationObserver
ã® observe()
ã¡ã½ããã¯ãMutationObserver
ã³ã¼ã«ããã¯ãè¨å®ããä¸ãããããªãã·ã§ã³ã«é©åãã DOM ã¸ã®å¤æ´ã®éç¥ã®åä¿¡ãéå§ãã¾ãã
è¨å®ã«ãã£ã¦ã¯ããªãã¶ã¼ãã¼ã¯ DOM ããªã¼å
ã®åä¸ã®ãã¼ã (Node
) ãç£è¦ãããããã®ãã¼ãã¨ãã®åå«ãã¼ãã®ä¸é¨ã¾ãã¯ãã¹ã¦ãç£è¦ããããã¾ãã åããã¼ãã¯è¤æ°ã®ãªãã¶ã¼ãã¼ã«ãã£ã¦ç£è¦ãããã¨ãã§ããåã MutationObserver
ãè¤æ°å observe()
ãå¼ã³åºããã¨ã§ãDOMããªã¼ã®ãã¾ãã¾ãªé¨åã®å¤æ´ãããã¾ãã¾ãªåã®å¤æ´ãç£è¦ãããã¨ãã§ãã¾ãã
MutationObserver
ã忢ããã«ã¯ãMutationObserver.disconnect()
ãå¼ã³åºãã¦ãã ãããï¼ããã«ããããã®ã³ã¼ã«ããã¯ã¯ãã以éçºçããªããªãã¾ããï¼
target
DOM ããªã¼å
ã§å¤æ´ãç£è¦ããããç£è¦ãããã¼ãã®ãµãããªã¼ã®ã«ã¼ãã«ãªã£ãããã DOM ãã¼ã (Node
)ï¼ãããã¯è¦ç´ (Element
) ã§ããå¯è½æ§ãããã¾ãï¼ã
options
ã©ã® DOM ã®å¤æ´ã mutationObserver
ã® callback
ã«å ±åããããè¨è¿°ãããªãã·ã§ã³ãæä¾ãããªãã¸ã§ã¯ãã observe()
ãå¼ã¶éã«ã¯ãchildList
ãattribute
ãcharacterData
ã®ãã¡ã®å°ãªãã¨ã 1 ã¤ã¯ true
ã§ãªããã°ãªãã¾ããã ããã§ãªãå ´åã¯ãTypeError
ä¾å¤ãçºçãã¾ãã
ãªãã·ã§ã³ã¯æ¬¡ã®éãã§ãã
subtree
çç¥å¯
true
ã«è¨å®ããã¨ãtarget
ãåºç¹ã¨ãããã¼ãã®ãµãããªã¼å
¨ä½ã«ç£è¦ãæ¡å¼µããã¾ãã ä»ã®ããããã£ã¯ãã¹ã¦ãtarget
ãã¼ãã ãã«é©ç¨ãããã®ã§ã¯ãªãããµãããªã¼ã®ãã¹ã¦ã®ãã¼ãã«æ¡å¼µããã¾ããæ¢å®å¤ã¯ false
ã§ãã target
ã®åå«ãé¤å»ãããå ´åããã®åå«ã®ãµãããªã¼ã«å¯¾ãã夿´ã¯ããã®é¤å»ã«é¢ããéç¥ãé
ä¿¡ãããã¾ã§ãå¼ãç¶ãç£è¦ããã¾ãã
childList
çç¥å¯
true
ã«è¨å®ããã¨ã対象ã¨ãããã¼ãï¼ããã³ subtree
ã true
ã®å ´åã¯ãã®åå«ï¼ã«æ°ããåãã¼ãã追å ãããããæ¢åã®åãã¼ããé¤å»ãããããããã©ãããç£è¦ãã¾ãã æ¢å®å¤ã¯ false
ã§ãã
attributes
çç¥å¯
true
ã«è¨å®ããã¨ãç£è¦å¯¾è±¡ã®ãã¼ãã¾ãã¯ãã¼ãã®å±æ§å¤ã®å¤æ´ãç£è¦ãã¾ãã attributeFilter
ã¾ã㯠attributeOldValue
ã®ãããããæå®ããå ´åã¯ãæ¢å®å¤ã¯ true
ã§ãããã以å¤ã®å ´åãæ¢å®å¤ã¯ false
ã§ãã
attributeFilter
çç¥å¯
ç£è¦å¯¾è±¡ã¨ããå ·ä½çãªå±æ§åã®é åã§ãã ãã®ããããã£ãå«ã¾ãã¦ããªãå ´åããã¹ã¦ã®å±æ§ã«å¯¾ãã夿´ã夿´éç¥ãçºçããã¾ãã
attributeOldValue
çç¥å¯
true
ã«è¨å®ããã¨ããã¼ãã¾ãã¯ãã¼ãã®å±æ§å¤æ´ãç£è¦ãã¦ããéã«å¤æ´ããã屿§ã®å¤ãååè¨é²ããå¤ã§ç½®ãæãã¾ãã 屿§ã®å¤æ´ãç£è¦ããå¤ãè¨é²ããä¾ã«ã¤ãã¦ã¯ã屿§å¤ã®ç£è¦ãåç
§ãã¦ãã ããã æ¢å®å¤ã¯ false
ã§ãã
characterData
çç¥å¯
true
ã«è¨å®ããã¨ãæå®ããã¿ã¼ã²ãããã¼ãï¼ããã³ subtree
ã true
ã®å ´åã¯ãã®åå«ï¼ãç£è¦ãããã®ãã¼ãã¾ãã¯ãã¼ãç¾¤ã«æ ¼ç´ããã¦ããæåãã¼ã¿ã«å¤æ´ããã£ããã©ããã確èªãã¾ãã æ¢å®ã§ã¯ãcharacterDataOldValue
ãæå®ããå ´å㯠true
ãæå®ããªãå ´å㯠false
ã§ãã
characterDataOldValue
çç¥å¯
true
ã«è¨å®ããã¨ãç£è¦å¯¾è±¡ã®ãã¼ãã®ããã¹ãã夿´ããããã³ã«ããã®ãã¼ãã®ããã¹ãã®ååå¤ãè¨é²ããã¾ãã æ¢å®å¤ã¯ false
ã§ãã
ãªã (undefined
)ã
TypeError
以ä¸ã®ããããã®ç¶æ³ã§çºçãã¾ãã
options
ããå®éã«ã¯ä½ãç£è¦ããªãããã«è¨å®ããã¦ããå ´åã ï¼ä¾ãã°ãchildList
ãattributes
ãcharacterData
ããã¹ã¦ false
ã®å ´åãï¼options.attributes
ã®å¤ã false
ï¼ããã¯å±æ§ã®å¤æ´ãç£è¦ããªããã¨ã示ãï¼ã§ããã«ãããããããattributeOldValue
㯠true
ã§ããããã¾ãã¯ãattributeFilter
ãåå¨ããå ´åãcharacterDataOldValue
㯠true
ã§ããã«ããããããã characterData
ã false
ï¼ããã¯ãæåã®å¤æ´ãç£è¦ããªããã¨ã示ãï¼ã§ããå ´åããã®ä¾ã§ã¯ãobserve()
ã MutationObserver
ã®ã¤ã³ã¹ã¿ã³ã¹ã«å¯¾ãã¦å¼ã³åºããè¨å®ããå¾ãã¿ã¼ã²ããè¦ç´ ã¨ãªãã·ã§ã³ãªãã¸ã§ã¯ããæ¸¡ãã¨ã©ããªããã示ãã¾ãã
// `MutationObserver` ã®æ°ããã¤ã³ã¹ã¿ã³ã¹ã `observer` ã¨ããååã§ä½æãã
// ã³ã¼ã«ããã¯é¢æ°ã渡ã
const observer = new MutationObserver(() => {
console.log("ãªãã¶ã¼ãã¼ãæ¤åºãè¡ã£ãã¨ãã«å®è¡ãããã³ã¼ã«ããã¯");
});
// `observe()` ãå¼ã³åºããç£è¦ããè¦ç´ ã¨ãªãã·ã§ã³ãªãã¸ã§ã¯ããæ¸¡ã
observer.observe(document.querySelector("#element-to-observe"), {
subtree: true,
childList: true,
});
subtree
ã使ç¨ããéã«åå«ãé¤å»
subtree
ãªãã·ã§ã³ã使ç¨ãã¦ãã¼ããç£è¦ãã¦ããå ´åããã®ãµãããªã¼ã®ä¸é¨ãé¤å»ãããå¾ã§ãããã®ãã¼ãã®åå«ã«å¯¾ãã夿´ã®éç¥ãåãç¶ãããã¨ãã§ãã¾ãã ãã ããé¤å»ã«é¢ããéç¥ãé
ä¿¡ãããå¾ã¯ãåãé¢ããããµãããªã¼ã«å¯¾ãããã以ä¸ã®å¤æ´ã¯ããªãã¶ã¼ãã¼ãæ¤åºãè¡ããªããªãã¾ãã
ããã«ãããæ¥ç¶ãåæãããå¾ãç§»ããããã¼ãã¾ãã¯ãµãããªã¼ã®è©³ç´°ãªå¤æ´ç£è¦ãéå§ããåã«çºçãã夿´ãè¦éããã¨ãé²ãã¾ããçè«çã«ã¯ãçºçãã夿´ãè¨è¿°ãã MutationRecord
ãªãã¸ã§ã¯ãã追跡ãã¦ããã°ã夿´ããå
ã«æ»ãããã¨ãã§ããDOM ãåæç¶æ
ã«å·»ãæ»ããã¨ãã§ããã¯ãã§ãã
<div id="target">
<div id="child"></div>
</div>
const target = document.getElementById("target");
const child = document.getElementById("child");
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
console.log(mutation.type, mutation.target.id, mutation.attributeName);
if (mutation.type === "childList" && mutation.target.id === "target") {
// åè¦ç´ ãé¤å»ãããã¨ããéç¥ãåãåã£ãå¾ãåãé¢ããããµãããªã¼ã«å¯¾ãã
// ãããªã夿´ã«ã¤ãã¦ã¯ããªãã¶ã¼ãã¼ãæ¤åºãè¡ããªããªã
child.setAttribute("data-bar", "");
}
});
});
observer.observe(target, {
attributes: true,
childList: true,
subtree: true,
});
target.removeChild(child);
// ãã®å¤æ´ã¯ "childList" ã対象ã¨ããéç¥ãé
ä¿¡ãããåã«çºçããããã
// ããããªãã¶ã¼ãã¼ãæ¤åºãã¾ãã
child.setAttribute("data-foo", "");
// åºå:
// childList target null
// attributes child data-foo
// "attributes child data-bar" ã®éç¥ã¯ããã¾ããã
attributeFilter
ã®ä½¿ç¨
ãã®ä¾ã§ã¯ã夿´ãªãã¶ã¼ãã¼ãè¨å®ãããã£ããã«ã¼ã ã®ã¦ã¼ã¶ã¼ã®ååã表示ãããµãããªã¼å
ã®è¦ç´ ã® status
㨠username
屿§ã®å¤æ´ãç£è¦ãã¾ããããã«ãããä¾ãã°ãã¦ã¼ã¶ã¼ã®ããã¯ãã¼ã ã®å¤æ´ãã³ã¼ãã«åæ ãããããã¦ã¼ã¶ã¼ããã¼ãã¼ãããé¢ãã¦ãã (AFK) ã¾ãã¯ãªãã©ã¤ã³ã§ãããã¨ããã¼ã¯ããããããã¨ãã§ãã¾ãã
function callback(mutationList) {
mutationList.forEach((mutation) => {
switch (mutation.type) {
case "attributes":
switch (mutation.attributeName) {
case "status":
userStatusChanged(mutation.target.username, mutation.target.status);
break;
case "username":
usernameChanged(mutation.oldValue, mutation.target.username);
break;
}
break;
}
});
}
const userListElement = document.querySelector("#userlist");
const observer = new MutationObserver(callback);
observer.observe(userListElement, {
attributeFilter: ["status", "username"],
attributeOldValue: true,
subtree: true,
});
屿§å¤ã®ç£è¦
ãã®ä¾ã§ã¯ã屿§å¤ã®å¤æ´ãç£è¦ããè¦ç´ ã観å¯ãããã®è¦ç´ ã® dir
屿§ã "ltr"
㨠"rtl"
ã¨ã®éã§åãæ¿ãããã¿ã³ã追å ãã¾ãããªãã¶ã¼ãã¼ã®ã³ã¼ã«ããã¯ã®ä¸ã§ã屿§ã®å¤ãå¤ããã°åºåãã¾ãã
<button id="toggle">æ¹åãåãæ¿ã</button><br />
<div id="container">
<input type="text" id="rhubarb" dir="ltr" value="Tofu" />
</div>
<pre id="output"></pre>
CSS
body {
background-color: paleturquoise;
}
button,
input,
pre {
margin: 0.5rem;
}
JavaScript
const toggle = document.querySelector("#toggle");
const rhubarb = document.querySelector("#rhubarb");
const observerTarget = document.querySelector("#container");
const output = document.querySelector("#output");
toggle.addEventListener("click", () => {
rhubarb.dir = rhubarb.dir === "ltr" ? "rtl" : "ltr";
});
const config = {
subtree: true,
attributeOldValue: true,
};
const callback = (mutationList) => {
for (const mutation of mutationList) {
if (mutation.type === "attributes") {
output.textContent = `${mutation.attributeName} 屿§ã¯ "${mutation.oldValue}" ããå¤åãã¾ããã`;
}
}
};
const observer = new MutationObserver(callback);
observer.observe(observerTarget, config);
çµæ 仿§æ¸ ãã©ã¦ã¶ã¼ã®äºææ§
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4