2009-05-21 4 views
2

Чтобы быть ясным: я не спрашиваю, как установить существующие крючки на новые элементы DOM. Я знаю о функции live() и старом плагине livequery. Я спрашиваю что-то еще.Крюк на добавление новых элементов DOM с помощью jQuery (или простой JS)

Я хочу знать, как подключиться к самому созданию новых элементов DOM. Причина, по которой я спрашиваю, я создаю скрипт JS стороннего пользователя, который не имеет контроля над сторонними скриптами. Эти сторонние скрипты (которые запутаны) периодически обновляют страницу, добавляя новые элементы DOM. Я хочу выполнить код после добавления этих элементов.

Использование $ ('...') .bind ('ajaxSuccess', function() .....) работает для некоторых дополнений, но не для всех.

ответ

1

Я не уверен, почему вы спрашиваете, знаете ли вы о livequery. Livequery позволит вам подключаться к произвольным новым элементам DOM. Вне этого единственное, что я знаю, это зацепиться за методы DOM (например, appendChild и т. Д.)

Функция live(), которая была интегрирована в jQuery, на самом деле не является полной реализацией реального запроса. (Resig думал, что это было слишком много функциональности должны быть интегрирован без обдува размера коды слишком далеко)

В прямом эфире(), что отсутствует является следующей функцией типа:

$('*').livequery(function() { 
// do something 
}); 

Используйте это, и должны поймать любые дополнения.

+0

Можете ли вы расширить это? Есть ли функция livequery, которая выходит за рамки новой функции 1.3 live()? – Pistos

+0

Обновлено с примером. – cgp

+0

live() не разрешает произвольные селекторы (пока). Это основное ограничение. Есть также некоторые проблемы с жизненным циклом; они все в примечаниях к выпуску jquery 1.3. –

2

Если они всегда добавляются с помощью метода document.createElement, вы можете просто заменить его и сделать свое отслеживание там.

document.replacedCreateElement = document.createElement; 
document.createElement = function(tagName) { 
    this.replacedCreateElement(tagName); 
    //do your tracking 
} 
+0

Интересно! Я не знал, что мы можем просто псевдонимы/переопределять основные функции. – Pistos

+1

Это именно то, что делает livequery. – cgp

+0

Когда я это пробовал, браузер (ы) стреляет в использование ЦП. Я думаю, это слишком много DOM spidering. – Pistos

1

Ну, я пошел с этой парой, которая, кажется, стрелять в нужных обновлений DOM в течение 20 секунд или меньше:

$('#someid').bind('ajaxSuccess', function() { ... }); 
$('#someid').ajaxSuccess(function(e, r, s) { ... }); 

Я предпочел бы не замедлить загрузку страниц в зависимости от livequery, а решение replaceCreateElement разбило CPU.