Hemsida » Kodning » Så här använder du MutationObserver API för DOM Node Changes

    Så här använder du MutationObserver API för DOM Node Changes

    Här är ett scenario: Rita, en tidningsförfattare redigerar en artikel av hennes online. Hon sparar sina förändringar och ser meddelandet “ändringar sparade!” Just då märker hon ett typsnitt som hon saknat. Hon fixar det och är på väg att klicka “spara”, när hon får ett arg telefonsamtal från sin chef.

    När samtalet är över, vänder hon tillbaka till skärmen, ser “ändringar sparade!” stänger av sin dator och stormar ur kontoret.

    Bortsett från min ojämnhet för berättande, så märkte vi från det korta scenariot vilka problem det kvarhållande budskapet bryggde. Så i framtiden bestämmer vi oss för att undvika det när det är möjligt och använd en som antingen uppmanar användaren att erkänna genom att klicka på den - eller försvinner på egen hand. Att använda den andra för snabbmeddelanden är en bra idé.

    Vi vet redan hur man försvinner ett element från en sida, så det borde inte vara ett problem. Vad vi behöver veta är när visade det sig? Så vi kan göra det försvinner efter en rimlig tid.

    MutationObserver API

    Sammantaget när ett DOM-element (som ett meddelande div) eller någon annan nod ändras, borde vi kunna känna till det. Under lång tid hade utvecklarna lita på hack och ramverk på grund av bristen på ett inbyggt API. Men det hade förändrats.

    Vi har nu MutationObserver (tidigare mutationshändelser). MutationObserver är ett JavaScript-inbyggt objekt med en uppsättning egenskaper och metoder. Det låter oss observera en ändring på vilken nod som helst som DOM Element, Document, Text, etc. Med mutation menar vi tillägg eller borttagning av en nod och ändringar i en nods attribut och data.

    Låt oss se ett exempel för bättre förståelse. Vi gör först en uppsättning där ett meddelande visas vid knapptryckning, som den ena Rita-sågen. Då ska vi skapa och länka en mutationsobservatör till den meddelandeboxen och kod logiken för att dölja meddelandet automatiskt. Smart?

    Notera: Du kan någon gång eller har redan frågat mig i ditt huvud “Varför inte bara dölja meddelandet från inuti knappen klicka på händelsen själv i JavaScript?” I mitt exempel arbetar jag inte med en server, så självklart är klienten ansvarig för att visa meddelandet och kan gömma det för lätt. Men som i Ritas redigeringsverktyg om servern är den som bestämmer sig för att ändra DOM-innehållet, kan klienten bara vara alert och vänta.

    Först skapar vi inställningen för att visa meddelandet på knappen klicka.


    var msg = document.querySelector ('# msg'), SUCCESSMSG = "Ändringar sparas!"; / * Lägg till knappen klicka händelse * / dokument .querySelector ('button') .addEventListener ('klicka', visaMsg); funktion showMsg () msg.textContent = SUCCESSMSG; msg.style.background = 'teal';  

    När vi fått den ursprungliga konfigurationen körs, gör följande:

    • Skapa en MutationObserver objekt med en användardefinierad återuppringningsfunktion (funktionen definieras senare i posten). Funktionen kommer att utföras på varje mutation observerad av MutationObserver.
    • Skapa ett konfigurationsobjekt för att ange vilken typ av mutationer som ska observeras av MutationObserver.
    • Binda in MutationObserver till målet, vilket är "msg" div i vårt exempel.
    (funktionsstartObservation () var / * 1) Skapa ett MutationObserver-objekt * / observatör = ny MutationObserver (funktion (mutationer) mutationObserverCallback (mutationer);), / * 2) Skapa ett configobjekt * / config = childList: Sann; / * 3) Lim'em alla * / observer.observe (msg, config); ) (); 

    Nedan är en lista över egenskaper för config objekt som identifierar de olika typerna av mutationer. Eftersom vi i vårt exempel bara handlar om en barntextnod skapad för meddelandetexten, har vi använt listamed fast egendom.

    Typer av mutationer observerade

    Fast egendom När den är inställd på Sann
    listamed Infogning och borttagning av målets barnnoder observeras.
    attribut Ändringar i målets attribut observeras.
    characterData Ändringar i målets data observeras.

    Nu till den återuppringningsfunktionen som utförs på varje observerad mutation.

    funktion mutationObserverCallback (mutationer) / * Ta den första mutationen * / var mutationRecord = mutationer [0]; / * Om en barnnod läggs till döljer du meddelandet efter 2s * / om (mutationRecord.addedNodes [0]! == undefined) setTimeout (hideMsg, 2000);  funktion hideMsg () msg.textContent = "; msg.style.background = 'none'; 

    Eftersom vi bara lägger till ett meddelande till div, vi tar bara den första mutationen som observerats på den och kontrollerar om en textnod infördes. Om vi ​​får fler än en förändring, kan vi bara gå igenom mutationer array.

    Varje mutation i mutationer array representeras av objektet MutationRecord med följande egenskaper.

    Egenskaper hos MutationRecord

    Fast egendom Returer
    addedNodes Tomma array eller array av noder läggs till.
    attribute Null eller namn på attributet som har lagts till, tagits bort eller ändrats.
    attributeNamespace Null eller namespace för attributet som lagts till, tagits bort eller ändrats.
    nextSibling Null eller nästa syskon i noden som lagts till eller tagits bort.
    oldValue Null eller tidigare värde av attributet eller data ändrats.
    previousSibling Null eller föregående syskon i noden som tillsatts eller avlägsnades.
    removedNodes Tomt array eller array av noder som tagits bort.
    mål Node riktad av MutationObserver
    typ Typ av mutation observerad.

    Och det är allt. vi måste bara sätta koden tillsammans för sista steget.

    Webbläsarsupport

    BILD: Kan jag använda. Web. 19 juni 2015

    Referens

    • “W3C DOM4 Mutation Observer.” W3C. Webb. 19 juni 2015
    • “MutationObserver.” Mozilla Developer Network. Webb. 19 juni 2015.