我正在使用Range来处理所选文本。我想计算从某人开始选择文本到他们结束的高度。
我尝试了一个span标签,放在选定范围的开头和结尾,然后可以准确地计算出高度,但它改变了DOM并阻止了我进行其他范围操作,比如突出显示先前选择的文本。
我还尝试收集mousedown和mouseup位置,但我需要从所选文本顶部到释放选择的文本底部的准确高度,并不总是这样。
所以我想知道是否有一种方法可以计算文本选择的高度而不更改DOM?
Range
中的getClientRects()
的浏览器(Firefox >= 4,自2009年以来的WebKit,Opera)。如果您需要支持早期的浏览器,则需要修改DOM,只要将DOM恢复到其先前状态即可,这实际上是可以的。function getSelectionHeight() {
var selHeight = 0;
if (document.selection && document.selection.type == "Text") {
var textRange = document.selection.createRange();
selHeight = textRange.boundingHeight;
} else if (window.getSelection) {
var sel = window.getSelection();
if (sel.rangeCount > 0) {
var range = sel.getRangeAt(0);
if (!range.collapsed && range.getClientRects) {
var startRange = range.cloneRange();
startRange.collapse(true);
var selTop = startRange.getClientRects()[0].top;
startRange.detach();
var endRange = range.cloneRange();
endRange.collapse(false);
selHeight = endRange.getClientRects()[0].bottom - selTop;
endRange.detach();
}
}
}
return selHeight;
}
我认为隐藏DIV的方法不会起作用。许多浏览器要么没有高度,要么对于像那样隐藏的元素高度为0。
也许如果你克隆DOM的那一部分并将其添加到文档中,使用一些疯狂的位置(比如left:-1000px),你可以得到该值。
无论如何,如果范围对象不能为您提供此数据,则我认为您必须使用解决方法来获得一致的结果。
visibility: hidden
还是 display: none
),仍然可以通过 JavaScript“看到”,你可以试试,我已经试过了 :) - jackJoe
display: none
不会显示任何滚动条,并适用于此情况。 - jackJoe