0

私は iOS でカスタム Web ビューを開発しています。これは、Web ページで特定の要素を選択するときにユーザーに特別なオプションを提供する必要があります。そのため、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

0
  NSString *htmlString = [webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"];
于 2013-04-18T12:25:43.657 に答える
0

Ajayの答えに基づいて、私が探していたものの本当の答えを見つけました:

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

非ネイティブ関数を指しているため、呼び出している JavaScript 関数がないと役に立ちません。http://snipplr.com/view.php?codeview&id=10912で関数を見つけました。これは、必要なことをしているようです。したがって、この JS を xsl からページに挿入することで、データを取得するために必要なものが得られます。

これは 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

問題が何であるかを発見しました。どうやら単一のオブジェクトを p-tag に入れると、オブジェクトを選択するときに p-tag 全体を選択するようになります。したがって、p-tag は body の子であるため、完全な html が返されたのは正しいことでした。現在、img の周りに単純なカスタム タグを使用しており、値を正しく取得しています。

于 2013-04-18T13:06:11.430 に答える