在JavaScript中动态选择和添加标签

rel*_*wer 4 html javascript iphone selection uiwebview

我需要一些关于iPhone上的JavaScript的帮助UIWebView;
我有以下HTML:

<html>
   <head>
      <title>Example</title>
   </head>
   <body>
     <span>this example for selection <b>from</b> UIWebView</span>
   </body>
</html>
Run Code Online (Sandbox Code Playgroud)

我想进行选择,并<span>在HTML中为所选文本添加带颜色的标签,以便像电子书阅读器一样编写注释.

这是我获取所选文本的JavaScript代码:

NSString *SelectedString = [NSString stringWithFormat:@"function getSelText()"
                     "{"
                     "var txt = '';"
                     " if (window.getSelection)"
                     "{"
                     "txt = window.getSelection();"
                     " }"
                     "else if (document.getSelection)"
                     "{"
                     "txt = document.getSelection();"
                     "}"
                     "else if (document.selection)"
                     "{"
                     "txt = document.selection.createRange().text;"
                     "}"
                     "else return;"
                     "alert(txt);"
                     "}getSelText();"];
[webView stringByEvaluatingJavaScriptFromString:SelectedString];
Run Code Online (Sandbox Code Playgroud)

这很好用,并返回选定的文本.

这个用于添加新标记的JS代码:

NSString *AddSpanTag = [NSString stringWithFormat:@"function selHTML() {"
                 "if (window.ActiveXObject) {"
                 "var c = document.selection.createRange();"
                 "return c.htmlText;"
                 "}"
                 "var nNd = document.createElement(\"span\");"
                 "var divIdName = \'myelementid\';"
                 "var ColorAttr = \"background-color: #ffffcc\";"
                 "nNd.setAttribute(\'id\',divIdName);"
                 "nNd.setAttribute(\'style\',ColorAttr);"
                 "var w = getSelection().getRangeAt(0);"
                 "w.surroundContents(nNd);"
                 "return nNd.innerHTML;"
                 "}selHTML();"];
[webView stringByEvaluatingJavaScriptFromString:AddSpanTag];
Run Code Online (Sandbox Code Playgroud)

我的问题是如此:
如果我选择"示例"(查看HTML文本)文本WebView,它可以工作,因为它不包含任何标记.
但是,如果我从中选择"选择"(查看HTML文本)文本WebView,它就不起作用,因为它启动了标记<b>,并且</b>不在我的选择之内,那么我就无法在<b>和之间添加新标记</b>.

我怎么解决这个问题?

Tim*_*own 9

由于这是一个UIWebView,这是移动Safari,你可以失去很多这些分支来获得选择.我建议使用document.execCommand()"HiliteColor"命令,该命令内置于浏览器中,即使在跨越元素边界时也可以处理整个选择:

var sel = window.getSelection();
if (!sel.isCollapsed) {
    var selRange = sel.getRangeAt(0);
    document.designMode = "on";
    sel.removeAllRanges();
    sel.addRange(selRange);
    document.execCommand("HiliteColor", false, "#ffffcc");
    sel.removeAllRanges();
    document.designMode = "off";
}
Run Code Online (Sandbox Code Playgroud)