2010-03-09 2 views
0

Я хочу привязать событие к определенному классу и идентификатору, когда соответствующие объекты создаются в DOM.Запуск функции при создании элемента DOM

Я делаю это, так как у меня есть код jQuery в ASP UpdatePanel, который заставляет DOM перезагружаться на частичной обратной передаче. Я перезапустил события с помощью live(), однако мне нужно вызвать функцию инициализации 2 строки, как только будут созданы элементы.

Можно ли подключить это к live() или к какой-либо другой функции jQuery, или мне придется написать код, чтобы сделать это сам?

Спасибо, Ed

ответ

1

Если вы используете UpdatePanel вы можете написать функцию под названием:

function pageLoad() { } //Called by ASP.Net javascript code 

Это будет вызываться каждый раз, когда страница первоначально нагрузки и когда он загружает содержимое UpdatePanel, или в качестве альтернативы вы можете подключить любую функцию, которую вы хотите запустить, когда UpdatePanel возвращается, делая это:

$(document).ready(function() { 
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(myFunction); 
}); 
function myFunction() { 
//Do stuff with elements 
} 

Примечание это не будет работать первый PAG e load, только при загрузке UpdatePanel. Просто добавьте вызов в myFunction(); в document.ready, если вам нужно, чтобы он работал и при загрузке.

+0

Извините, что забыл упомянуть, что это предназначено для неконтекстно-ориентированного WebControl, поэтому я не хочу привязывать какой-либо код к самой странице: я знаю о методах обновления скриптов после postback в обновленной панели (хотя раньше я не видел ваш последний вариант), однако это не тот подход, к которому я иду. В идеале, этот код не должен полагаться на внешние методы для уменьшения зависимостей. –

+0

@Ed - Я делаю это в тех местах, где необходим UpdatePanel, но он не обязательно должен быть на странице, второй набор кода, который вы можете использовать в любом внешнем или зарегистрированном файле javascript, и он будет работать нормально, просто get 'Sys.WebForms.PageRequestManager.getInstance()' проверить на null, а если не называть '.add_endRequest (myFunction);' на нем он будет работать с или без UpdatePanel или даже с ScriptManager. Вы просто регистрируете обработчик для точного события, о котором вы заботитесь ... не получается более эффективным, чем это. –

+0

Хм, правда. Определенно более эффективно, чем решение Анурага, я попробую. –

1

A DOMNodeInserted Событие запускается всякий раз, когда узел добавляется в DOM. Попросите тело документа прослушать это событие, и всякий раз, когда он уволен, найдите вставленный узел для селекторов классов и идентификаторов, которые вы ищете.

$(document.body).bind("DOMNodeInserted", function(event) { 
    // element is the newly inserted node 
    var element = $(event.target); 
    // if this element is of interest 
    if($("<selector>", element).length > 0) { 
     // run the initialization code here.. 
    } 
} 

Подробнее о DOM мутационных событий here.

+0

Мне это нравится, но насколько это эффективно? –

+0

Содержимое, которое нужно вставить, будет анализироваться для построения узла DOM. Это неизбежно. Если вас беспокоит эффективность движка селектора jQuery, вы должны подумать о том, как часто и сколько DOM-вставки вы делаете. Эти тесты для jQuery (http://mootools.net/slickspeed/) обычно заканчиваются в миллисекундах или два на моей машине для этой конкретной страницы - 'http://mootools.net/slickspeed/system/template.php?include= jquery.js & function = $ & nocache = 1268138473' .., который я бы сказал, действительно большой. Возможно, это не так в вашем случае. – Anurag

+0

Я понимаю, что, однако, я немного обеспокоен тем, что это будет вызвано при каждой вставке узла, что может привести к множеству вызовов (некоторые страницы, на которых будут использоваться, - это каталоги продуктов с более чем 400 продуктами на странице , все из которых динамически связаны). 1ms все еще много, когда вы делаете это 400 раз :) –

Смежные вопросы