2014-12-11 2 views
3

Прочитав this question, я нашел ответы устаревшее/изношено и, следовательно, я прошу, если кто-нибудь есть какие-либо «обновленные» ответы:О создании функции в JQuery

ли JQuery вызов функции, как

$('#myNewDivId').on('create', function(){ 

}); 

для одного DIV или нескольких 'присоединяет':

$('.myNewDivWithClass').on('create', function(){ 

}); 

для динамически созданного DIV?

  • Я предпочел бы не включать плагины (особ. Устаревшие 'из них, как .livequery() плагин)
  • «DOMSubtreeModified», кажется, амортизируется, и поэтому будет ли альтернатива?
  • я должен был бы эту функцию, чтобы быть совместимым с (по крайней мере) IE 10 + 11.

Что я ищу, чтобы сделать это на создание этого «нового элемента», должен иметь ajax перезвонит моему контроллеру, чтобы «заменить» этот div частичным представлением? Однако без использования jquery-метода это кажется более сложным, чем ожидалось.

+0

Это дубликат стольких вопросов. http://stackoverflow.com/questions/9470931/is-there-any-on-dom-change-event или http://stackoverflow.com/questions/3219758/detect-changes-in-the-dom или http: //переполнение стека.com/questions/2844565/is-there-a-jquery-dom-change-listener –

+0

@BarthZalewski: И все же эти ответы устарели? [поскольку DOMSubtreeModified кажется обесценившимся?] (http://stackoverflow.com/questions/6659662/why-is-the-domsubtreemodified-event-deprecated-in-dom-level-3) – jbutler483

+1

Только некоторые мысли: чтобы отправить все взаимодействие Ajax через один плагин, который транслирует событие 'namehere.load' после всех вызовов Ajax, * передает элемент, в который был загружен новый контент *. Затем один обработчик верхнего уровня соединяет любые необходимые коды/плагины на основе классов внутри этой загруженной панели. Это требует единственной замены для ajax, но упростило все наши проекты. Теоретически вы можете обернуть фактическую функцию jQuery '$ .ajax' с помощью этой функции, но я не знаю достаточно о источнике jQuery, чтобы попытаться (пока). –

ответ

2

Не существует волшебного браузера, которое работает для всех старых браузеров, хотя есть несколько обходов с использованием особенностей браузера, но if вы управляете созданием новых элементов, просто передайте пользовательское событие на этот новый элемент (или его контейнер) после его добавления.

например.

var newDiv = $('<div>', {id: myNewDivId}); 
$('#somewhere').append(newDiv); 
newDiv.trigger('myname.loaded');  // trigger event on new element 

и в главных JS прослушивания события:

$(document).on('myname.loaded', function(e){ 
    // e.target is the element added 
    $(e.target).css('color', 'red'); 
}); 

JSFiddle:http://jsfiddle.net/TrueBlueAussie/epg09n4d/3/

Предлагается ниже, вы заключаете эту дополнительную функциональность в функции, но это предполагает вы всегда будете использовать append для добавления элементов. Вместо этого вы можете использовать метод расширения jQuery:

например. добавить метод modified к JQuery

jQuery.fn.modified = function() { 
    this.trigger('myname.loaded'); 
    return this; 
}; 

и призывают родительского контейнера (вместо элемента):

$('#somewhere').append(newDiv).modified(); 

JSFiddle:http://jsfiddle.net/TrueBlueAussie/epg09n4d/7/

Примечание: Targeting контейнер (не добавленный элемент (ы)) представляется более полезным и соответствует шаблону, который мы использовали для обновления панелей Ajax.

+0

Гораздо лучше, чем [оригинальная версия] (http://jsfiddle.net/epg09n4d/) :) И просто упомянуть: если эта логика ('append' +' trigger') будет использоваться во многих местах и для многих элементов рекомендуется переместить его в отдельную функцию (что-то вроде 'function appendElement (jContainer, jElement) {jContainer.append (jElement); jElement.trigger ('myname.loaded');}' – Regent

+0

TrueBlueAussie Спасибо за ваше объяснение. В настоящее время я стараюсь * реализовать это и посмотрю, смогу ли я заставить его работать в моем проекте. Cheers. – jbutler483

+0

@ jbutler483: добавлено более простое обновление для вас. как хорошее имя, как любое. :) –

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