使用以下代码,我在thisRange.setStart行上收到INDEX_SIZE_ERR:DOM异常1错误。代码用于遍历整个页面,查找searchString的实例,然后在该搜索字符串前面添加一个链接。例如,如果它找到了5个字符串实例,那么现在它将在第一个字符串前面添加链接,但在第二个字符串上添加错误并停止,留下四个没有链接的单词。有什么想法吗?
if(searchString.length > 0) { // make sure the string isn't empty, or it'll crash.
// Search all text nodes
for(var i = 0; i < textNodes.length; i++) {
// Create a regular expression object to do the searching
var reSearch = new RegExp(searchString,'gmi'); // Set it to 'g' - global (finds all instances), 'm' - multiline (searches more than one line), 'i' - case insensitive
var stringToSearch = textNodes[i].textContent;
while(reSearch(stringToSearch)) { // While there are occurrences of the searchString
// Add the new selection range
var thisRange = document.createRange();
//alert((reSearch.lastIndex - searchString.length) + " <-> " + reSearch.lastIndex);
thisRange.setStart(textNodes[i], reSearch.lastIndex - searchString.length); // Start node and index of the selection range
thisRange.setEnd(textNodes[i], reSearch.lastIndex); // End node and index of the selection
var myLink = document.createElement('a');
var href = document.createAttribute('href');
myLink.setAttribute('href','http://www.google.com');
myLink.innerText ="GO";
thisRange.insertNode(myLink);
//theSelection.addRange(thisRange); // Add the node to the document's current selection
//thisRange.deleteContents();
}
}
}
答案 0 :(得分:5)
添加链接后,文档已更改。当您下次调用thisRange.setStart
时,它使用原始字符串中的索引,但在现在更改的文档中设置它。
您需要以相反的顺序添加它们。尝试将匹配索引存储在数组中,然后向后遍历索引数组以注入链接。
答案 1 :(得分:0)
我明白了。方法如下:
for (var i = rangeArray.length - 1; i >= 0; i--) {
var myLink = document.createElement('a');
var href = document.createAttribute('href');
myLink.setAttribute('href','http://www.google.com');
myLink.innerText ="GO";
rangeArray[i].insertNode(myLink);
}
我没有将它添加到上面循环中的范围,而是将其添加到数组中,然后向后遍历该数组。