在HTML元素中选择文本的一部分
Select a portion of text within a HTML element
我想创建一个在HTML元素中选择给定文本的函数。
例如,调用selectText('world')
将在<span>Hello </span><strong>world</strong>!
world
关于类似问题的许多答案建议使用range
和selection
,但它们都不适合我的情况(有些会选择所有文本,有些不会使用这样的标记,…)。
现在我有(它不起作用):
function selectText ( element, textToSelect ) {
var text = element.textContent,
start = text.indexOf( textToSelect ),
end = start + textToSelect.length - 1,
selection, range;
element.focus();
if( window.getSelection && document.createRange ) {
range = document.createRange();
range.setStart( element.firstChild, start );
range.setEnd( element.lastChild, end );
selection = window.getSelection();
selection.removeAllRanges();
selection.addRange( range );
} else if (document.body.createTextRange) {
range = document.body.createTextRange();
range.moveToElementText( element );
range.moveStart( 'character', start );
range.collapse( true );
range.moveEnd( 'character', end );
range.select();
}
}
这里是一个jsfiddle,这样你就可以看到实际发生了什么:http://jsfiddle.net/H2H2p/
输出错误:
Uncaught IndexSizeError: Failed to execute 'setStart' on 'Range': The offset 11 is larger than or equal to the node's length (5).
注:
您可以将在元素的textContent
中查找文本的方法与此函数结合使用。
演示:http://jsfiddle.net/H2H2p/3/
代码:function selectText(element, textToSelect) {
var elementText;
if (typeof element.textContent == "string" && document.createRange && window.getSelection) {
elementText = element.textContent;
} else if (document.selection && document.body.createTextRange) {
var textRange = document.body.createTextRange();
textRange.moveToElement(element);
elementText = textRange.text;
}
var startIndex = elementText.indexOf(textToSelect);
setSelectionRange(element, startIndex, startIndex + textToSelect.length);
}
function getTextNodesIn(node) {
var textNodes = [];
if (node.nodeType == 3) {
textNodes.push(node);
} else {
var children = node.childNodes;
for (var i = 0, len = children.length; i < len; ++i) {
textNodes.push.apply(textNodes, getTextNodesIn(children[i]));
}
}
return textNodes;
}
function setSelectionRange(el, start, end) {
if (document.createRange && window.getSelection) {
var range = document.createRange();
range.selectNodeContents(el);
var textNodes = getTextNodesIn(el);
var foundStart = false;
var charCount = 0, endCharCount;
for (var i = 0, textNode; textNode = textNodes[i++]; ) {
endCharCount = charCount + textNode.length;
if (!foundStart && start >= charCount
&& (start < endCharCount ||
(start == endCharCount && i < textNodes.length))) {
range.setStart(textNode, start - charCount);
foundStart = true;
}
if (foundStart && end <= endCharCount) {
range.setEnd(textNode, end - charCount);
break;
}
charCount = endCharCount;
}
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
} else if (document.selection && document.body.createTextRange) {
var textRange = document.body.createTextRange();
textRange.moveToElementText(el);
textRange.collapse(true);
textRange.moveEnd("character", end);
textRange.moveStart("character", start);
textRange.select();
}
}
相关文章:
- PHP/Ajax/jquery/JON-在Ajax Post之后将echo文本中的一部分作为变量返回
- 使文本仅滚动HTML页面的一部分
- JQuery/JavaScript - 突出显示输入或文本区域中的一部分文本
- 如何在文本区域突出显示文本的一部分
- 使用 javascript 将上传的文本文件的一部分设置为可点击
- Javascript 如何使用一些要替换的文本替换字符串的一部分
- 为段落文本的一部分分配 ID
- 在数组元素的文本中找到字符串的一部分后替换字符串的一部分
- 如何使用文本表单输入的一部分来添加并使其转到 URL
- 使用 JQuery 检查所选文本是否是较大节点的一部分
- 在文本框中键入文本时,替换文本框中的一部分文本
- 如何在HTML中将文本javascript显示为正常正文的一部分
- 在整个网站中查找字符串的一部分并替换为新文本
- 如何对长字符串进行切片并输出一部分文本
- 用于匹配文本的Javascript RegExp,而不是't是HTML标记的一部分
- 试图返回选项文本而不是值作为循环的一部分
- 删除文本框中输入的字符串的一部分
- 不可编辑,可删除文本区域的一部分
- 使用bookmarklet javascript更改span文本的一部分
- 使锚文本成为href的一部分