[英]window.getSelection() ignore certain tags
以下是我的html代码:
<div id="text">This is <span class="ignore">some</span> short text.</div>
当我使用鼠标并从“是”到“短”中选择时,使用下面的在线查找功能,
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
};
}
我将得到Start Range = 5,End Range =20。但是我希望范围计算忽略<span class="ignore">
这样我就只能得到开始范围= 5和结束范围= 14。
我在处理文本之前将文本复制到另一个虚拟div,但似乎window.getSelection()仅会获取原始文本,有没有专家知道如何忽略<span class="ignore">
内部的文本,因此我可以获取准确的范围?
<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);
});
我已经设计了解决方案,请检查-http : //jsfiddle.net/ghufranne/awc6c9rp/1/
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;
}
如果只需要文本(就像我一样),那么我的简单解决方案是在获取文本之前隐藏内部div,然后在显示之后。 以下是如何开始和结束工作的摘要。 可能是一种更好的方法,但是对我有用。
function getSelectionCharOffsetsWithin(element) { var start = 0, end = 0; var sel, range, priorRange, text; $('.ignore').hide(); if (typeof window.getSelection != "undefined") { sel = window.getSelection(); text = sel + ''; range = window.getSelection().getRangeAt(0); priorRange = range.cloneRange(); priorRange.selectNodeContents(element); priorRange.setEnd(range.startContainer, range.startOffset); start = priorRange.toString().length; end = start + (sel + '').length; } else if (typeof document.selection != "undefined" && (sel = document.selection).type != "Control") { text = sel + ''; range = sel.createRange(); priorRange = document.body.createTextRange(); priorRange.moveToElementText(element); priorRange.setEndPoint("EndToStart", range); start = priorRange.text.length; end = start + (sel + '').length; } $('.ignore').show(); return { start: start, end: end, text: text }; } function run() { var v = getSelectionCharOffsetsWithin(document.getElementById("text")); document.getElementById("res").innerHTML = "start: " + v.start + " end: " + v.end + " text: " + v.text; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> <div id="text">This is <span class="ignore">some</span> short text.</div> Select a piece of text above, then click <button onclick="run();">Run</button> <div id="res"></div>
编辑:jQuery选择器错字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.