2013-04-18 47 views
0

我正在开发一个iOS的自定义webview,当选择网页上的某些元素时,应该给用户特殊的选择,因此我扩展了UIWebview,并将我自己的按钮添加到sharedMenuController。由于所显示的页面是由xml使用xsl构成的,所以在某些标签中有额外的数据,例如从UIWebview检索HTML标签使用

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

当选择图像时,sharedMenuController弹出,并且如果我按下动作按钮,我想接收包含IMG标签的标签。问题是,使用window.getSelection()。innerHTML.toString()给我一个空字符串和window.getSelection()。getRangeAt(0).commonAncestorContainer.innerHTML.toString()应该是什么p标签,给我整个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 

回答

0
NSString *htmlString = [webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"]; 
+0

没有这个给整个html文件? 编辑:只是检查它,就像我说的,给整个文件 – Andy

1

试试这个:

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

这是调用一个非本地JavaScript函数,所以没有函数的内容,这个答案是不完整的。我只是用代码添加了一个答案。 – Andy

0

发现了什么问题了。显然,当将单个对象放在p-tag中时,可以在选择对象时选择整个p-tag。因此,由于p标签是身体的孩子,因此返回完整的html是正确的。我现在在我的img周围使用了一个简单的自定义标签,并且我正确地获取了这些值。

0

发现了什么,我一直在寻找基于阿贾伊的答案真正的答案:

的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 ''; 
      } 
     };