Я программно обновляю DOM в веб-просмотре WebKit с помощью объектов DOMElement - для сложного пользовательского интерфейса обычно есть компонент javascript для любого элемента, который я добавляю. Отсюда вытекает необходимость уведомления о завершении обновлений - есть ли такое событие? Я знаю, что обычные div не запускают событие onload или onready, верно? Другое предположение, которое у меня было, которое может быть совершенно неверным, заключается в том, что обновления DOMElement не являются синхронными, поэтому я не могу сделать что-то подобное и быть уверенным, что оно действительно встретится с меткой в DOM:
DOMElement *displayNameLabel = [document createElement:@"div"];
[displayNameLabel setAttribute:@"class" value:@"user-display-name"];
[displayNameLabel setTextContent:currentAvatar.avatarData.displayName];
[[document getElementById:@"user-card-content"] appendChild:displayNameLabel];
id win = [webView windowScriptObject];
[win evaluateWebScript:@"javascriptInstantiateLabel()"];
Это правда?
Я уже использую jquery в теле html, поэтому я не против подписаться на определенный набор событий классов через "live". Я думал, что смогу сделать что-то вроде:
$(".some-class-to-be-added-later").live( "ready", function(){
// Instantiate some fantastic javascript here for .some-class
});
но пока не испытывал радости. Есть ли какой-либо способ с обеих сторон (target-c, так как я не запускаю программно пусковую загрузку javascript или javascript), чтобы получать уведомления, когда элемент находится в DOM?
Спасибо,
Josh
Редактировать: Основываясь на ответе Anurag , вот код, который я придумал (работает):
function onButtonPanelChange() {
console.log( "Button panel subtree modified", 7 );
$(".panel-button").each( function(){
console.log( "Button found " + $(this).attr( "class" ), 7 );
if( !$(this).hasClass( "processed" ) ){
$("#bottom-button-panel").unbind( "DOMSubtreeModified" );
if( $(this).hasClass( "chat" ) ){
console.log( "Found chat button, instantiating", 7);
var chat_button = new Button( $(this), chat_button_def );
$(this).addClass( "processed" );
}
else if( $(this).hasClass( "get" ) ){
var chat_button = new Button( $(this), get_button_def );
$(this).addClass( "processed" );
}
$("#bottom-button-panel").bind( "DOMSubtreeModified", onButtonPanelChange );
console.log( "Done with button change, rebinding", 7 );
}
});
}
$(document).ready( function(){
$("#bottom-button-panel").bind( "DOMSubtreeModified", onButtonPanelChange);
});
Обратите внимание, что вам необходимо отменить привязку события, поскольку каждое последующее изменение запускает другое событие, и другое, и другое.