尝试以编程方式在UIWebView中选择文本时,setStart和setEnd抛出错误

时间:2014-02-20 16:05:54

标签: javascript ios uiwebview range selection

以下是我在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中以编程方式选择文本。我错了吗?有没有人这样做过?

1 个答案:

答案 0 :(得分:1)

问题是你试图在<div>元素的第一个子节点中设置范围的边界,如果你的HTML看起来确实如此,那么它是一个只有空格的文本节点。问题,如果实际HTML中没有空格,则为<span>元素。在后一种情况下,即在元素中设置范围边界,偏移量表示边界之前元素的子节点数。