Ogólne#

MutationObserver#

W tym miejscu umieszczam powtarzające się specyficzne pojęcia i algorytmy w interfejsie MutationObserver.

Pojęcia#

callback

record queue

Każdy obserwator zmian (obiekt typu MutationObserver) jest skojarzony z następującymi pojęciami:

Każdy węzeł jest skojarzony z listą zarejestrowanych obserwatorów.

registered observer

observer

options

Zarejestrowany obserwator # (registered observer) składa się z obserwatora # (observer) [obiekt typu MutationObserver] oraz opcji # (options) [słownik typu MutationObserverInit].

transient registered observer

source

Przejściowy zarejestrowany obserwator # (transient registered observer) jest specjalnym wariantem zarejestrowanego obserwatora posiadającym źródło # (source), którym jest zarejestrowany obserwator.

Przejściowi zarejestrowani obserwatorzy są używani do śledzenia zmian w potomkach jakiegoś węzła, po tym, jak węzeł został usunięty, więc zmiany te nie zostaną utracone, kiedy właściwość subtree ustawiono na boolowską wartość true w przodkach tego węzła (szczegóły).

Garbage collection#

Specyfikacja DOM4 określa wpływ obserwatorów zmian dla mechanizmu GC.

strong reference

Węzły mają silną referencję (strong reference) do zarejestrowanych obserwatorów na swojej liście zarejestrowanych obserwatorów.

weak reference

Zarejestrowani obserwatorzy na liście zarejestrowanych obserwatorów skojarzonej z węzłem mają słabą referencję (weak reference) do węzła.

Algorytmy#

observer

Każda jednostka powiązanych podobnych względem pochodzenia kontekstów przeglądania # (unit of related similar-origin browsing contexts) posiada flagę kolejkowania złożonego mikrozadania obserwatora zmian # (mutation observer compound microtask queued flag) [początkowo nieustawioną] oraz listę z obiektami typu MutationObserver (początkowo pustą).

queue a mutation observer compound microtask

Aby zakolejkować złożone zadanie obserwatora zmian # (queue a mutation observer compound microtask) należy wykonać następujące kroki:

  1. Jeśli flaga kolejkowania złożonego mikrozadania obserwatora zmian jest nieustawiona, to pomiń kolejne kroki.
  2. Ustaw flagę kolejkowania złożonego mikrozadania obserwatora zmian.
  3. Kolejkuj złożone zadanie dla zgłoszenia obserwatorów zmian.

notify mutation observers

Aby zgłosić obserwatorów zmian # (notify mutation observers) należy wykonać następujące kroki:

  1. Usuń flagę kolejkowania złożonego mikrozadania obserwatora zmian.
  2. Niech notify list będzie kopią listy z obiektami typu MutationObserver skojarzonej z jednostką powiązanych podobnych względem pochodzenia kontekstów przeglądania.
  3. Dla każdego (for each) obiektu typu MutationObserver mo w notify list wykonaj podzadanie złożonego zadania dla uruchomienia następujących podkroków:

    1. Niech queue będzie kopią kolejki zapisu w mo.
    2. Wyczyść kolejkę zapisu w mo.
    3. Usuń wszystkich przejściowych zarejestrowanych obserwatorów, których obserwatorem jest mo.
    4. Jeśli queue nie jest pusta, to wywołaj funkcję zwrotną skojarzoną z mo, z pierwszym argumentem queue oraz drugim argumentem mo (we własnej postaci), i niech wartością this funkcji zwrotnej będzie mo. Jeśli to zrzuci wyjątek, to zgłoś wyjątek.

queue a mutation record

Aby zakolejkować zapis zmian # (queue a mutation record) typu type dla celu target, z jedną lub większą ilością (w zależności od type) nazwą name, przestrzenią nazw namespace, poprzednią wartością oldValue, dodanymi węzłami addedNodes, usuniętymi węzłami removedNodes, bratem poprzedzającym previousSibling oraz bratem następującym nextSibling, należy wykonać następujące kroki:

  1. Niech interested observers będzie początkowo pustym zestawem obiektów typu MutationObserver z opcjonalnie sparowanym łańcuchem znakowym dla każdego z nich.
  2. Niech nodes będą przodkami obejmującymi w target.
  3. Następnie dla każdego (for each) węzła node w nodes, i dla każdego (for each) zarejestrowanego obserwatora registered observer (gdzie options reprezentuje opcje w registered observer) w liście zarejestrowanych obserwatorów skojarzonej z node wykonaj poniższe podkroki:

    1. Jeśli żaden z poniższych warunków nie jest prawdziwy:

      • node nie wskazuje na target i właściwość subtree w options ma boolowską wartość false
      • type to "attributes" i właściwość attributes w options nie ma boolowskiej wartości true
      • type to "attributes", właściwość attributeFilter w options jest obecna, i właściwość attributeFilter w options nie zawiera name lub namespace nie jest wartością null
      • type to "characterData i właściwość characterData w options nie ma boolowskiej wartość true
      • type to "childList i właściwość childList w options ma boolowską wartość false

      to wykonaj poniższe wewnętrzne podkroki:

      1. Jeśli obserwator w registered observer nie jest w interested observers, to dodaj obserwatora w registered observer do interested observers.
      2. Jeśli type to "attributes" i właściwość attributeOldValue w options ma boolowską wartość true, lub type to "characterData i właściwość characterDataOldValue ma boolowską wartość true, to ustaw sparowany łańcuch znakowy dla obserwatora w interested observers z registered observer na oldValue.
  4. Następnie dla każdego (for each) obserwatora observer w interested observers wykonaj poniższe podkroki:

    1. Niech record będzie nowym obiektem typu MutationRecord, ze swoim type ustawionym na type oraz target ustawionym na target.
    2. Jeśli name oraz namespace zostały przekazane, to ustaw attributeName w record na name oraz attributeNamespace w record na namespace.
    3. Jeśli addedNodes został przekazany, to ustaw addedNodes w record na addedNodes.
    4. Jeśli removedNodes został przekazany, to ustaw removedNodes w record na removedNodes.
    5. Jeśli previousSibling został przekazany, to ustaw previousSibling w record na previousSibling.
    6. Jeśli nextSibling został przekazany, to ustaw nextSibling w record na nextSibling.
    7. Jeśli observer ma sparowany łańcuch znakowy, to ustaw oldValue w record na sparowany łańcuch znakowy z observer.
    8. Dodaj record do kolejki zapisu w observer.
  5. Kolejkuj złożone zadanie obserwatora zmian.
Pasek społecznościowy

SPIS TREŚCI AKTUALNEJ STRONY

Ogólne (H1) MutationObserver (H2) Pojęcia (H3) callback (H4) record queue (H4) registered observer (H4) observer (H4) options (H4) transient registered observer (H4) source (H4) Garbage collection (H4) strong reference (H5) weak reference (H5) Algorytmy (H3) unit of related similar-origin browsing contexts (H4) observer (H4) queue a mutation observer compound microtask (H4) notify mutation observers (H4) queue a mutation record (H4)