Обратный вызов DOM для создания узла

Я хочу, чтобы определенный обратный вызов выполнялся каждый раз, когда элемент div, удовлетворяющий определенному селектору, вставляется в DOM. Я порылся в документации по событиям DOM, и самое близкое событие, которое я нашел к тому, что мне нужно, — это «загрузка», но оно работает не совсем так, как я надеюсь.

В идеале я хочу что-то вроде:

$(".myclass").live("load", function(){... do stuff to $(this) ...}

Чтобы дать некоторый контекст тому, что я делаю:

У меня есть событие на веб-странице, которое создает новые формы при каждом нажатии какой-либо кнопки. Изменение этого кода JS крайне нежелательно. Я хочу преобразовать одно из полей формы в jstree, поэтому единственный подход, который я смог придумать, — это прикрепить обратный вызов для события вставки в DOM и прикрепить jstree внутри func.


Обновление: я нашел DOMNodeInserted, но, видимо, он не поддерживается в IE.


person George Karpenkov    schedule 03.11.2011    source источник
comment
Проверьте этот вопрос: the-dom" title="есть ли событие jquery, которое срабатывает, когда новый узел вставляется в dom"> stackoverflow.com/questions/3900151/   -  person rossipedia    schedule 03.11.2011
comment
@BryanRoss, спасибо, liveQuery выглядит почти как то, что мне нужно, сейчас просматриваю его источник - не могу понять, как это работает.   -  person George Karpenkov    schedule 03.11.2011
comment
@cheshire работает, опрашивая состояние DOM каждый период. Затем проходим по дереву по всему DOM и вручную проверяем, что изменилось. то есть это чертовски медленно. Бонус: он работает с jQuery 1.3 и в прошлый раз, когда я смотрел, был заброшен.   -  person Raynos    schedule 03.11.2011
comment
Ржу не могу. да, я так и думал. Хотя спасибо :Р   -  person George Karpenkov    schedule 03.11.2011
comment
@cheshire, вы знаете, что настоящий ответ - рассказать нам о реальной проблеме, которую вы пытаетесь решить, и мы дадим вам решение, которое не требует прослушивания событий вставки узла.   -  person Raynos    schedule 03.11.2011
comment
@Raynos Я думал, что сказал это в разделе контекста. Хотя общие вопросы IMO, как сделать X, более ценны для SO в долгосрочной перспективе, чем очень конкретные вопросы, как решить мою конкретную проблему.   -  person George Karpenkov    schedule 03.11.2011


Ответы (1)


Массовое предупреждение: DOMMutationEvents, определенные на уровне DOM 3, устарели.

document.addEventListener("DOMNodeInserted", function (ev) {
  var node = ev.target;
  if (careAbout(node)) {
    runCode(ev);
  }
});

Событие DOMNodeInserted задокументировано на уровне событий DOM. 2.

Конечно, поддержка браузера посредственная.

Единственный способ эмулировать это в несовместимых браузерах — это опрос всего DOM на предмет того, изменилось ли дерево, и запуск событий вручную. Это также известно как чертовски дорого.

Но ваша настоящая проблема:

Изменение этого кода JS крайне нежелательно

У вас плохой, уродливый, неподдерживаемый код. Игнорирование проблемы не решит. Обходом его не заставишь уйти. Лучше всего делать рефакторинг, рефакторинг, рефакторинг.

person Raynos    schedule 03.11.2011
comment
Спасибо, посмотрите мое обновление. :P Я слышал, что это вообще не работает в IE? И кроме того, документация w3c помечает его как устаревшее?... - person George Karpenkov; 03.11.2011
comment
IE9 по-прежнему не поддерживает события мутации. Чертовски здорово. Я думал, что браузер наконец-то будет соответствовать спецификациям после стольких итераций. - person George Karpenkov; 03.11.2011
comment
конечно, вы правы, но этот плохой, уродливый, неподдерживаемый код был написан не мной, и рефакторинг не всегда возможен. - person George Karpenkov; 03.11.2011
comment
@cheshire это всегда осуществимо, но, вероятно, это очень больно и нежелательно. Этот плохой код никогда не исчезнет волшебным образом, либо вы с ним разберетесь, либо с ним разберется какой-то другой лох. - person Raynos; 03.11.2011