Ako používať MutationObserver API pre zmeny uzla DOM
Tu je scenár: Rita, spisovateľka časopisu upravuje svoj článok on-line. Uloží svoje zmeny a zobrazí správu “uložené zmeny!” Práve potom si všimla preklep, ktorú stratila. Opravuje to a chystá sa kliknúť “uložiť”, keď dostane rozhnevaný telefonát od svojho šéfa.
Po skončení hovoru sa vráti na obrazovku, vidí “uložené zmeny!” vypne počítač a vyrazí z kancelárie.
Okrem mojej neochoty rozprávať príbeh sme si z tohto krátkeho scenára všimli, aké ťažkosti sa varenie pretrvávajúcej správy. Takže v budúcnosti sa rozhodneme vyhnúť sa, ak je to možné, a použijeme taký, ktorý buď vyzve užívateľa na potvrdenie kliknutím - alebo zaniká sama. Použitie druhého pre rýchle správy je dobrý nápad.
Už vieme, ako urobiť prvok zmiznúť zo stránky, takže by nemal byť problém. Potrebujeme vedieť kedy sa to ukázalo? Takže môžeme zmiznúť po prijateľnom čase.
MutationObserver API
Celkovo, keď prvok DOM (ako správa div
) alebo akýmkoľvek iným uzlom, mali by sme to vedieť. Po dlhú dobu sa vývojári museli spoliehať na hacks a rámce kvôli nedostatku natívneho rozhrania API. Ale to sa zmenilo.
Teraz máme MutationObserver (predtým Mutačné udalosti). MutationObserver
je natívny objekt typu JavaScript s množinou vlastností a metód. Umožňuje to sledovať zmenu v každom uzle ako prvok DOM, dokument, text atď. Mutáciou rozumieme pridanie alebo odstránenie uzla a zmeny atribútu a údajov uzla.
Pozrime sa na príklad pre lepšie porozumenie. Najskôr si vytvoríme nastavenie tam, kde sa po stlačení tlačidla zobrazí správa, podobne ako tá, ktorú Rita videl. Potom to urobíme vytvoriť a prepojiť pozorovateľa mutácie s touto schránkou správ a kód logiky na automatické skrytie správy. pútavé?
Poznámka: Môžete sa v určitom okamihu alebo sa ma už pýtate vo svojej hlave “Prečo nielen skryť správu zvnútra samotnej udalosti click kliknutia v jazyku JavaScript?” V mojom príklade nepracujem so serverom, takže klient je samozrejme zodpovedný za zobrazenie správy a môže ju ľahko skryť. Ale rovnako ako v nástroji Rita na úpravu, ak je server ten, ktorý sa rozhodne zmeniť obsah DOM, klient môže zostať len upozornený a čakať.
Najprv vytvoríme nastavenie na zobrazenie správy po kliknutí na tlačidlo.
var msg = document.querySelector ('# msg'), SUCCESSMSG = "Zmeny uložené!"; / * Pridať tlačidlo tlačidlo udalosti * / document .querySelector ('tlačidlo'). AddEventListener ('kliknite', showMsg); funkcia showMsg () msg.textContent = SUCCESSMSG; msg.style.background = 'teal';
Po spustení pôvodného nastavenia vykonajte nasledovné kroky:
- Vytvor
MutationObserver
objekt s používateľom definovanou funkciou spätného volania (funkcia je definovaná neskôr v príspevku). Funkcia sa bude vykonávať pri každej mutácii pozorovanejMutationObserver
. - Vytvorte konfigurovateľný objekt, ktorý špecifikuje druh mutácií, ktoré majú byť dodržané
MutationObserver
. - Priviazať
MutationObserver
k cieľu, ktorým je "msg"div
v našom príklade.
()), / * 2) Vytvorte objekt config * / config = childList: *) * Vytvorte objekt MutationObserver * / observer = true; / * 3) Glue'em všetko * / observer.observe (msg, config); ) ();
Nižšie je uvedený zoznam vlastností pre config
objekt identifikujúci rôzne druhy mutácií. Vzhľadom k tomu, že v našom príklade sa zaoberáme výhradne uzlovým textovým uzlom vytvoreným pre text správy, použili sme ho podřízenémseznamu
vlastnosť.
Pozorovali sa druhy mutácií
vlastnosť | Keď je nastavené pravdivý |
podřízenémseznamu | Vloženie a odstránenie detských uzlov cieľa sa pozoruje. |
atribúty | Zmeny atribútov cieľa sú pozorované. |
characterData | Zaznamenajú sa zmeny v cieľových údajoch. |
Teraz, na túto funkciu spätného volania, ktorá sa spustí na každú pozorovanú mutáciu.
funkčná mutáciaObserverCallback (mutácie) / * Uchopenie prvej mutácie * / var mutationRecord = mutácie [0]; / * Ak bol pridaný dieťa uzol, skryť msg po 2s * / if (mutationRecord.addedNodes [0]! == undefined) setTimeout (hideMsg, 2000); funkcia hideMsg () msg.textContent = "; msg.style.background = 'žiadne';
Keďže pridávame iba správu div
, jednoducho chystáme prvú mutáciu pozorovanú na ňom a skontrolujeme, či bol vložený textový uzol. Ak sa stane viac ako jedna zmena, môžeme jednoducho prejsť cez mutácie
rad.
Každá mutácia v mutácie
pole je reprezentované objektom MutationRecord
s nasledujúcimi vlastnosťami.
Vlastnosti MutationRecord
vlastnosť | výnos |
addedNodes | Prázdne pole alebo pole pridaných uzlov. |
attributeName | Null alebo názov atribútu, ktorý bol pridaný, odstránený alebo zmenený. |
attributeNamespace | Nulový alebo menný priestor atribútu, ktorý bol pridaný, odstránený alebo zmenený. |
nextSibling | Nulový alebo ďalší súrodenec uzla, ktorý bol pridaný alebo odstránený. |
OldValue | Nulová alebo predchádzajúca hodnota atribútu alebo údajov sa zmenila. |
previousSibling | Nulový alebo predchádzajúci súrodenec uzla, ktorý bol pridaný alebo odstránený. |
removedNodes | Prázdne pole alebo pole uzlov, ktoré boli odstránené. |
terč | Uzel zacielený na MutationObserver |
typ | Typ pozorovanej mutácie. |
A ... to je ono. jednoducho musíme uviesť kód pre posledný krok.
Podpora prehliadača
referencie
- “W3C DOM4 Mutation Observer.” W3C. Web. 19. júna 2015
- “MutationObserver.” Mozilla Developer Network. Web. 19. júna 2015.