0

我正在 iOS 上开发一个自定义 webview,它应该在选择网页上的某些元素时为用户提供特殊选项,因此我正在扩展 UIWebview 并将我自己的按钮添加到 sharedMenuController。因为显示的页面是由使用 xsl 设置样式的 xml 组成的,所以某些标签中有额外的数据,例如

<p data-type="MC"><img src="annotation.png"></p>

选择图像时,会弹出 sharedMenuController,如果我按下 Action 按钮,我想接收包含 img 标签的标签。问题是使用 window.getSelection().innerHTML.toString() 给了我一个空字符串和 window.getSelection().getRangeAt(0).commonAncestorContainer.innerHTML.toString() 什么应该是 p-tag,给了我整个 html。

这是我的课:

@implementation UICustomWebView

+ (void)initialize
{
    [super initialize];
    UIMenuItem *itemA = [[UIMenuItem alloc] initWithTitle:@"Action" action:@selector(a:)];
    [[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObjects:itemA, nil]];    
}

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{    
    if (action == @selector(defineSelection:))
    {
        return YES;
    }
    else if (action == @selector(translateSelection:))
    {
        return YES;
    }
    else if (action == @selector(copy:))
    {
        return NO;
    }
    else if ( action == @selector( a: ) )
    {
        return YES;
    }

    return [super canPerformAction:action withSender:sender];
}

-(void) a:(id)sender
{
    NSLog(@"a %@", [self stringByEvaluatingJavaScriptFromString:@"window.getSelection().getRangeAt(0).commonAncestorContainer.innerHTML.toString()"]);
}
@end
4

4 回答 4

1

尝试这个:

 NSString *htmlString=[[webView stringByEvaluatingJavaScriptFromString:@"getSelectionHtml()"]mutableCopy];
于 2013-04-18T12:50:18.193 回答
0

找出问题所在。显然,将单个对象放入 p-tag 会使您在选择对象时选择整个 p-tag。因此,返回完整的 html 是正确的,因为 p-tag 是 body 的子标签。我现在在我的 img 周围使用一个简单的自定义标签,并且我得到了正确的值。

于 2013-04-18T13:06:11.430 回答
0

根据 Ajay 的回答找到了我正在寻找的真正答案:

NSString *htmlString=[[webView stringByEvaluatingJavaScriptFromString:@"getSelectionHtml()"]mutableCopy];

指向一个非本机函数,因此如果没有它调用的 javascript 函数,它是无用的。我在http://snipplr.com/view.php?codeview&id=10912找到了一个似乎可以满足我要求的功能。因此,通过从我的 xsl 将这个 JS 注入我的页面,我得到了获取数据所需的东西。

这是 JavaScript 函数:

function getSelectionHTML()
        {
            var userSelection;
            if (window.getSelection) 
            {
                // W3C Ranges
                userSelection = window.getSelection ();
                // Get the range:
                if (userSelection.getRangeAt)
                    var range = userSelection.getRangeAt (0);
                else 
                {
                    var range = document.createRange ();
                    range.setStart (userSelection.anchorNode, userSelection.anchorOffset);
                    range.setEnd (userSelection.focusNode, userSelection.focusOffset);
                }
                // And the HTML:
                var clonedSelection = range.cloneContents ();
                var div = document.createElement ('div');
                div.appendChild (clonedSelection);
                return div.innerHTML;
            } 
            else if (document.selection)
            {
                // Explorer selection, return the HTML
                userSelection = document.selection.createRange ();
                return userSelection.htmlText;
            } 
            else 
            {
                return '';
            }
        };
于 2013-04-19T08:18:51.350 回答
0
  NSString *htmlString = [webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"];
于 2013-04-18T12:25:43.657 回答