Получать уведомления, когда обновления target-c dom готовы начать с веб-просмотра - PullRequest
1 голос
/ 16 мая 2010

Я программно обновляю 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);
    });

Обратите внимание, что вам необходимо отменить привязку события, поскольку каждое последующее изменение запускает другое событие, и другое, и другое.

1 Ответ

1 голос
/ 16 мая 2010

См. Аналогичный вопрос, который был задан час назад - Есть ли прослушиватель изменений DOM JavaScript / jQuery?

Чтобы прослушать изменения элемента, используйте что-то вроде:

$("#someDiv").bind("DOMSubtreeModified", function() {
    alert("tree changed");
});

Я не писал сценарии DOM через Objective-C, поэтому не знаю, есть ли способ подписаться на события DOM с помощью оболочек Objective-C.

DOMSubtreeModifiedМодифицированное событие работает на iPhone.Только что протестировано с в этом примере .

...