Какой самый эффективный способ обнаружения, когда элемент с определенным идентификатором вставлен в DOM

Как следует из заголовка, я хочу определить точную метку времени, когда элемент с определенным идентификатором или CSS-классом вставлен в DOM (и, возможно, определить, когда он будет удален). Наиболее очевидный способ - периодически опрашивать документ, вызывая document.getElementById с идентификатором элемента, который я хочу найти, но этот метод не очень точен и может быть очень ресурсоемким, если у меня есть несколько элементов, которые я хочу обнаружить.

Я взглянул на Mutation Events и Mutation Observers, но из того, что я понимаю, чтобы определить, вставлен или удален элемент, мне нужно добавить слушатель к корневому элементу DOM, который может сильно повлиять на производительность, если мне нужно выполнять дополнительный JS каждый раз, когда элемент вставляется или удаляется со страницы.

Есть ли более оптимизированное решение, о котором я не знаю? Кроме того, я бы предпочел, если бы я не использовал внешнюю библиотеку JS, даже jQuery.

2 ответа

Решение

Оказывается, существует более эффективный способ определения, когда конкретный узел вставлен, с помощью событий анимации CSS.

Вы можете определить незаметную анимацию для класса, который вы слушаете, скажем, widget_inserted:

@keyframes widget_inserted {  
    from { z-index: 1; }
    to { z-index: 1; }   
}

.widget {
    animation-duration: 0.001s;
    animation-name: widget_inserted;
}

Я выбрал свойство z-index, потому что в большинстве случаев оно практически не должно иметь никакого влияния на вставляемый элемент. В сочетании с очень короткой продолжительностью анимации эти добавленные свойства CSS не должны приводить к дополнительным изменениям исходного документа.

Так что теперь, если вы прикрепите animationstart слушатель документа, вы должны быть в состоянии поймать точный момент, когда элемент с widget класс вставляется:

document.addEventListener('animationstart', function(event) {
    if (event.animationName == 'widget_inserted') {
        ...
    }
});

Вы можете посмотреть живое демо здесь

iframe триггер элементов load/unoad События. Вы можете вставить тупой iframe в элементе, который вы хотите просмотреть... И сами инициируйте событие load в исходном элементе.

function watch($ele){
    var $iframe = document.createElement('iframe');
    $iframe.style.display = 'none';
    $ele.appendChild($iframe);
    $iframe.addEventListener('load', function(){
      var event = new CustomEvent('load');
      $ele.dispatchEvent(event);
    });
}

Полный пример

Другие вопросы по тегам