【问题标题】:setStart and setEnd throwing error when trying to programmatically select text in UIWebView尝试以编程方式选择 UIWebView 中的文本时,setStart 和 setEnd 抛出错误
【发布时间】:2014-02-20 16:05:53
【问题描述】:

这是我在 UIWebView 中使用的一些 HTML:

<div id = "1">
    <span style = "background-color:red">
         <a href = "10&20">
              This is a link
         </a>
    </span>
</div>

点击链接后,我想以编程方式选择 UIWebView 中的链接文本(因此“这是一个链接”现在将使用蓝色的 iOS 文本选择工具突出显示)。这就是我在 a 标签的 href 中发送一些范围信息的原因。这是我用来尝试进行编程选择的调用:

//set content editable true
[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"selectElementContentsInRange(document.getElementById('1'), 10, 20)"]];

这是javascript函数:

function selectElementContentsInRange(el, first, second) {
    var range = document.createRange();
    alert("Makes it here");
    range.setStart(el.firstChild, first);
    alert("Doesn't make it here");
    range.setEnd(el.firstChild, second);

    var sel = window.getSelection();
    sel.removeAllRanges();
    sel.addRange(range);
}

正如您在警报中看到的那样,它不会通过range.setStart() 调用而不会引发错误。 Safari javascript 调试器给了我这个错误:

IndexSizeError: DOM Exception 1: Index or size was negative, or greater than the allowed value.

我尝试了很多不同的方法,但没有任何效果。我完全不知所措,非常感谢您对如何做到这一点的一些见解。我开始怀疑是否有可能以编程方式在 UIWebView 中选择文本。我错了吗?有人做过吗?

【问题讨论】:

    标签: javascript ios uiwebview range selection


    【解决方案1】:

    问题是您正试图在&lt;div&gt; 元素的第一个子节点中设置范围的边界,如果您的 HTML 确实看起来像问题中的那样,它是一个纯空格文本节点, 或 &lt;span&gt; 元素,如果您的实际 HTML 中没有空格。在后一种情况下,即在元素中设置范围边界,偏移量表示边界之前元素的子节点数。

    【讨论】:

    • 感谢您的回答!不过,如果可以的话,我很想得到更多的澄清。因为我正在抓取外部 div(这实际上是 HTML 的外观),所以它实际上并没有任何文本来放置范围。所以我需要获取子跨度,然后是跨度的子锚标记才能进行范围选择。我看对了吗?感谢您的帮助!
    • @Lizza:我想是的,只要所有范围都包含在 &lt;a&gt; 元素内的那个文本节点内。
    猜你喜欢
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多