Я успешно использовал шаблон, подобный следующему:
Сначала мы должны определить плагин .query ().
// jQuery.fn.query() emulates the behavior of .querySelectorAll()
// by allowing a full/complex selector to be matched against
//a small slice of the dom.
$.fn.query = function ( selector ) {
var scopeElms = this,
scopeIsDoc = scopeElms.length === 1 && scopeElms.is('html') ,
// check for obviously simple selectors.... (needs more elegance)
isComplexSelector = /\s/.test( selector.replace(/\s*([|~*$\^!]?=|,)\s*/g, '$1') ),
elms;
if ( scopeIsDoc || isComplexSelector )
{
elms = $(selector);
if ( scopeElms[0] )
{
elms = elms.filter(function(){
var i = scopeElms.length;
while (i--) {
if ( scopeElms[i] === this || $.contains(scopeElms[i], this) )
{
return true;
}
}
return false;
});
}
}
else
{
elms = scopeElms.filter( selector )
.add( scopeElms.find(selector) );
}
return $(elms);
};
Затем мы пишем нашу функцию init и связываем еена «готовое» событие, а также на наше пользовательское «domupdated» событие.В функции init мы используем .query()
, чтобы найти элементы из всего документа или только из обновленного фрагмента ...
// Here we define our DOM initializations
$(document).bind('ready domupdated', function (e, updatedFragment) {
var root = $( updatedFragment || 'html' );
// Begin imaginary initialization routines
root.query('form').validate();
root.query('.sidebar .searchform input#search').autocomplete();
// etc...
});
Затем всякий раз, когда мы внедряем блоки новых элементов в DOM (например, когда Ajaxзапрос завершен) мы затем запускаем событие domupdated
и передаем обновленный фрагмент DOM в качестве параметра - например, так:
...
var ajaxedDom = $(xhr.resultText).find('#message');
ajaxedDom.appendTo( '#modal' );
$(document).trigger('domupdated', [ajaxedDom]);
Для меня эта настройка снимает с себя всю боль при инициации DOM.Это позволяет мне поддерживать единый набор процедур инициализации и сосредоточиться на забавных вещах.