从webview开始准备Objective-c dom更新时收到通知

时间:2010-05-16 17:45:41

标签: javascript objective-c dom javascript-events webkit

我通过DOMElement对象以编程方式更新WebKit webview上的DOM - 对于复杂的UI,我添加的任何元素通常都有一个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()"];

这是真的吗?

我已经在html的主体中使用了jquery,所以我不介意通过“live”订阅特定类的事件集。我想我可能会做类似的事情:

$(".some-class-to-be-added-later").live( "ready", function(){
    // Instantiate some fantastic javascript here for .some-class
});
到目前为止,却没有经历任何快乐。有没有任何方法(objective-c,因为我没有以编程方式触发javascript post load或javascript),当元素在DOM中时会被通知?

谢谢, 约什

编辑:根据 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);
    });

请注意,hella需要取消绑定事件,因为每次后续更改都会触发另一个事件,另一个事件和另一个事件。

1 个答案:

答案 0 :(得分:1)

查看一小时前提出的类似问题 - Is there a JavaScript/jQuery DOM change listener?

要收听元素的更改,请使用以下内容:

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

我没有通过Objective-C编写DOM脚本,所以不知道是否有方法使用Objective-C包装器订阅DOM事件。

DOMSubtreeModified已修改的事件适用于iPhone。刚刚使用this example进行了测试。