use MutationObserver when available