Я работаю над расширением в Chrome, и мне интересно: как лучше узнать, когда элемент появляется? Используя простой javascript, с интервалом, который проверяет, пока элемент не существует, или jQuery имеет какой-то простой способ сделать это?
237
MutationObserver
>DOM Mutation Events
>setTimeout
.setTimeout
совместим, прост в реализации, прост в обслуживании и имеет незначительные накладные расходы.setTimeout
+,jQuery
по моему мнению, менее чем идеален по двум причинам: 1.) раздувание jQuery 2.) вы без необходимости вручную запрашиваете DOM для элементов, события легко справляются с этой скоростью, 3.) он всегда будет медленнее, чем любой нативный реализация. Если вам нужно что-то сделать, основываясь на наличии элемента достаточно быстро, особенно если ваша цель - беспроблемный пользовательский опыт, он уступает.Ответы:
DOMNodeInserted
не рекомендуется, наряду с другими событиями мутации DOM, из-за проблем с производительностью - рекомендуемый подход заключается в использовании MutationObserver для наблюдения за DOM. Это поддерживается только в новых браузерах, поэтому вы должны использовать его,DOMNodeInserted
когдаMutationObserver
он недоступен.источник
if (mutation.addedNodes.length)
так какif (mutation.addedNodes)
все равно вернул бы true, даже если это пустой массив. (2) Вы не можете сделать это,mutation.addedNodes.forEach()
потому что addNodes - это список узлов, и вы не можете перебирать список узлов с помощью forEach. Для решения этой проблемы, см. Toddmotto.com/ditch-the-array-foreach-call-nodelist-hackУ меня была такая же проблема, поэтому я решил написать плагин для нее.
$(selector).waitUntilExists(function);
Код:
источник
window.setInterval
). Я не знаю, работает лиMutationObserver
ответ также путем опроса ...;
в начале функции (;(function ($, window) {
)?Вот основная функция JavaScript для ожидания отображения элемента.
Параметры:
selector
: Эта функция ищет элемент $ {selector}time
: Эта функция проверяет, существует ли этот элемент каждые миллисекунды.В качестве примера настройки
selector="#div1"
иtime=5000
будем искать тег HTML,id="div1"
каждые 5000 миллисекунд.источник
querySelector
? developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorВы можете слушать
DOMNodeInserted
илиDOMSubtreeModified
события, которые запускаются всякий раз, когда новый элемент добавляется в DOM.Существует также плагин LiveQuery jQuery, который определяет, когда создается новый элемент:
источник
Я использовал этот подход, чтобы дождаться появления элемента, чтобы после этого я мог выполнять другие функции.
Скажем
doTheRestOfTheStuff(parameters)
функция должна вызываться только после того, как элемент с идентификаторомthe_Element_ID
появляется или завершает загрузку, мы можем использовать,источник
Ты можешь сделать
Обратите внимание, что это будет работать, только если элемент присутствует в DOM при запросе с сервера. Если элемент добавляется динамически через JavaScript, он не будет работать, и вам, возможно, придется поискать другие ответы.
источник
.ready()
функции работает для большинства ничего (если не что - нибудь), а не простоdocument
. Это просто не будет работать с динамически созданными элементами, даже на.live()
.$(document).ready()
элемент, а не тот элемент, который, как вы думаете, будет применяться. Вот как работает этот специальный слушатель. ПримерЯ думаю, что до сих пор нет никакого ответа здесь с легким и читаемым рабочим примером. Используйте MutationObserver
interface
для обнаружения изменений DOM, например:источник
Просто добавьте нужный селектор. Как только элемент найден, вы можете получить доступ к функции обратного вызова.
источник
Для простого подхода с использованием jQuery я обнаружил, что это хорошо работает:
Здесь мы просто проверяем каждые 500 мс, чтобы увидеть, загружен ли элемент, когда он есть, мы можем его использовать.
Это особенно полезно для добавления обработчиков кликов к элементам, которые были динамически добавлены в документ.
источник
Как насчет вставки Query библиотеки ?
inserttionQuery использует обратные вызовы CSS-анимации, прикрепленные к селекторам, указанным для запуска обратного вызова при создании элемента. Этот метод позволяет выполнять обратные вызовы при каждом создании элемента, а не только в первый раз.
Из GitHub:
источник
Вот функция, которая действует как тонкая оболочка вокруг MutationObserver. Единственное требование - браузер должен поддерживать MutationObserver; нет зависимости от JQuery. Запустите фрагмент ниже, чтобы увидеть рабочий пример.
источник
Вот решение с возвратом обещаний в ванильном Javascript (без грязных обратных вызовов). По умолчанию он проверяет каждые 200 мс.
источник
Вот чистая функция Javascript, которая позволяет вам ждать чего угодно. Установите интервал, чтобы он занимал меньше ресурсов процессора.
Чтобы вызвать это, например, в jQuery, используйте что-то вроде:
источник
Решение, возвращающее
Promise
и позволяющее использовать тайм-аут (совместимо с IE 11+).Для одного элемента (тип Элемент):
Для нескольких элементов (тип NodeList):
Примеры:
Работает как для списка элементов, так и для одного элемента.
источник
element instanceof HTMLElement
? Может ли это быть когда-нибудь, кромеnull
илиHTMLElement
?Element
вместо этого (исправлено). Я просто делаю проверку, потому что хочу убедиться, что у переменнойelement
есть свойство,innerHTML
как указано в документации Element MDN . Не стесняйтесь удалить его, если вам все равно!Более чистый пример использования MutationObserver:
источник
Это простое решение для тех, кто привык к обещаниям и не хочет использовать какие-либо сторонние библиотеки или таймеры.
Я использовал его в своих проектах некоторое время
Чтобы использовать это:
или с асинхронным ожиданием
источник
async
/await
тоже. Вы могли бы также быть в состоянии выжать больше производительности из него делаютmutations.addedNodes.find(node => node.matchesSelector("..."))
Если вы хотите, чтобы через некоторое время (тайм-аут) он перестал искать, то будет работать следующий jQuery. Время ожидания истечет через 10 секунд. Мне нужно было использовать этот код, а не чистый JS, потому что мне нужно было выбрать вход по имени, и у меня были проблемы с реализацией некоторых других решений.
источник
Я обычно использую этот фрагмент для диспетчера тегов:
источник
если у вас есть асинхронные изменения в домене, эта функция проверяет (с ограничением по времени в секундах) на наличие элементов DOM, это не будет тяжелым для DOM и его на основе Promise :)
источник