Javascript getSelection()忽略某些标记
下面是我的html代码:Javascript getSelection()忽略某些标记,javascript,Javascript,下面是我的html代码: <div id="text">This is <span class="ignore">some</span> short text.</div> 我将得到起始范围=5,结束范围=20。 但是我希望范围计算忽略,这样我只得到开始范围=5和结束范围=14 在处理之前,我将文本复制到另一个虚拟div,但似乎window.getSelection只能获取原始文本,是否有专家知道如何忽略其中的文本,以便获得准确的范围 我设计了一
<div id="text">This is <span class="ignore">some</span> short text.</div>
我将得到起始范围=5,结束范围=20。
但是我希望范围计算忽略,这样我只得到开始范围=5和结束范围=14
在处理之前,我将文本复制到另一个虚拟div,但似乎window.getSelection只能获取原始文本,是否有专家知道如何忽略其中的文本,以便获得准确的范围
我设计了一个解决方案,
请检查-
如果您像我一样只需要文本,那么我的简单解决方案是在获取文本之前隐藏内部div,然后在获取文本之后显示它。下面是一个片段,它将如何工作,以获得开始和结束。也许是更好的方法,但对我来说很有效 函数getSelectionCharOffsetsWithinelement{ var start=0, 结束=0; 变量选择、范围、优先级范围、文本; $'.ignore'.hide; 如果typeof window.getSelection!=未定义{ sel=window.getSelection; text=sel+; 范围=window.getSelection.getRangeAt0; priorRange=range.cloneRange; priorRange.selectNodeContentselement; priorRange.setEndrange.startContainer,range.startOffset; 开始=priorRange.toString.length; 结束=开始+选择+长度; }如果文件类型为else.selection!=未定义&& sel=document.selection.type!=控件{ text=sel+; 范围=sel.createRange; priorRange=document.body.createTextRange; priorRange.moveToElementTextelement; priorRange.setEndpointToStart,范围; 开始=priorRange.text.length; 结束=开始+选择+长度; } $'.ignore'.show; 返回{ 开始:开始, 完:完,, 文本:文本 }; } 函数运行{ var v=getSelectionCharOffsetsWithindocument.getElementByIdtext; document.getElementByIdres.innerHTML=start:+v.start+end:+v.end+text:+v.text; } 这是一些简短的文本。 选择上面的一段文本,然后单击“运行”
不,实际上我想完全忽略“span class=ignore>”中的任何文本,但您的代码如何能够忽略luctus上的计算?
function getSelectionCharOffsetsWithin(element) {
var start = 0, end = 0;
var sel, range, priorRange;
if (typeof window.getSelection != "undefined") {
range = window.getSelection().getRangeAt(0);
priorRange = range.cloneRange();
priorRange.selectNodeContents(element);
priorRange.setEnd(range.startContainer, range.startOffset);
start = priorRange.toString().length;
end = start + range.toString().length;
} else if (typeof document.selection != "undefined" &&
(sel = document.selection).type != "Control") {
range = sel.createRange();
priorRange = document.body.createTextRange();
priorRange.moveToElementText(element);
priorRange.setEndPoint("EndToStart", range);
start = priorRange.text.length;
end = start + range.text.length;
}
return {
start: start,
end: end
};
}
<div class="content">
Vivamus <span>luctus</span> urna sed urna ultricies ac tempor dui sagittis.
</div>
$(".content").on("mouseup", function () {
var start = window.getSelection().baseOffset;
var end = window.getSelection().focusOffset;
if (start < end) {
var start = window.getSelection().baseOffset;
var end = window.getSelection().focusOffset;
} else {
var start = window.getSelection().focusOffset;
var end = window.getSelection().baseOffset;
}
alert(window.getSelection());
alert(start + ", " + end);
});
function calcTextLength(){
alert("d");
var elem = document.getElementsByClassName('p1')[0];
elem.text='sss';
alert(elem);
var tex = getSelectedTextWithin(elem);
elem = document.getElementsByClassName('ignore')[0];
ignoreText = getSelectedTextWithin(elem);
alert(tex.length-ignoreText.length);
}
function getSelectedTextWithin(el) {
var selectedText = "";
if (typeof window.getSelection != "undefined") {
var sel = window.getSelection(), rangeCount;
if ( (rangeCount = sel.rangeCount) > 0 ) {
var range = document.createRange();
for (var i = 0, selRange; i < rangeCount; ++i) {
range.selectNodeContents(el);
selRange = sel.getRangeAt(i);
if (selRange.compareBoundaryPoints(range.START_TO_END, range) == 1 && selRange.compareBoundaryPoints(range.END_TO_START, range) == -1) {
if (selRange.compareBoundaryPoints(range.START_TO_START, range) == 1) {
range.setStart(selRange.startContainer, selRange.startOffset);
}
if (selRange.compareBoundaryPoints(range.END_TO_END, range) == -1) {
range.setEnd(selRange.endContainer, selRange.endOffset);
}
selectedText += range.toString();
}
}
}
} else if (typeof document.selection != "undefined" && document.selection.type == "Text") {
var selTextRange = document.selection.createRange();
var textRange = selTextRange.duplicate();
textRange.moveToElementText(el);
if (selTextRange.compareEndPoints("EndToStart", textRange) == 1 && selTextRange.compareEndPoints("StartToEnd", textRange) == -1) {
if (selTextRange.compareEndPoints("StartToStart", textRange) == 1) {
textRange.setEndPoint("StartToStart", selTextRange);
}
if (selTextRange.compareEndPoints("EndToEnd", textRange) == -1) {
textRange.setEndPoint("EndToEnd", selTextRange);
}
selectedText = textRange.text.length;
}
}
return selectedText;
}