计算所选文本的宽度和高度(JavaScript)

14

我需要使用JavaScript计算所选/突出显示文本的宽度高度

我正在使用由Tim Down编写的以下代码作为起点:

function getSelectionCoords() {
    var sel = document.selection, range;
    var x = 0, y = 0;
    if (sel) {
        if (sel.type != "Control") {
            range = sel.createRange();
            range.collapse(true);
            x = range.boundingLeft;
            y = range.boundingTop;
        }
    } else if (window.getSelection) {
        sel = window.getSelection();
        if (sel.rangeCount) {
            range = sel.getRangeAt(0).cloneRange();
            if (range.getClientRects) {
                range.collapse(true);
                var rect = range.getClientRects()[0];
                x = rect.left;
                y = rect.top;
            }
        }
    }
    return { x: x, y: y };
}

左上角的坐标已经正确显示了,为了计算宽度和高度,我还需要右下角的位置。

所以我添加了几行代码来寻找右下角的位置(可在此处查看代码-http://jsfiddle.net/pankajparashar/kv2Bp/)。但令我惊讶的是,尽管它们之间有可见的差异(仅在Firefox中测试),代码始终显示左和右的坐标相同。

顶部和底部的位置没有问题,因为它们工作得很好,这将帮助我计算高度。但是要计算宽度,我仍然需要正确的右坐标。

有人能指出代码中的任何缺陷吗?或者是否有任何其他方法,可以使用该方法计算所选文本的宽度和高度?

2个回答

18

以下是获取所选文本边框尺寸的代码,与原始代码非常相似。

演示:http://jsfiddle.net/UFkjy/

function getSelectionDimensions() {
    var sel = document.selection, range;
    var width = 0, height = 0;
    if (sel) {
        if (sel.type != "Control") {
            range = sel.createRange();
            width = range.boundingWidth;
            height = range.boundingHeight;
        }
    } else if (window.getSelection) {
        sel = window.getSelection();
        if (sel.rangeCount) {
            range = sel.getRangeAt(0).cloneRange();
            if (range.getBoundingClientRect) {
                var rect = range.getBoundingClientRect();
                width = rect.right - rect.left;
                height = rect.bottom - rect.top;
            }
        }
    }
    return { width: width , height: height };
}

太棒了!正是我在寻找的东西!在Internet Explorer中也可以正常工作。 - Pankaj Parashar
@Wes:你说得对,至少在Chrome上是这样。Firefox没问题,Safari 7.1也没问题。我怀疑这是Chrome浏览器的一个bug。 - Tim Down
@TimDown 看起来你是正确的。我已经向 Google Chrome 团队提交了一个错误报告。希望他们能够修复它,尽管可能不会很快。 - Wes
虽然这不是一个完美的解决方案,而且也不是在所有地方都受支持,但我发现可以通过检查navigator.userAgent来查看它是否是Chrome浏览器,并使用getClientRecs()计算正确的高度,方法是将第一行的高度乘以1.55乘以矩形的数量(1.55是FireFox / Safari与Chrome之间高度差异的平均值)。结果非常接近,可以作为Google修复此问题之前的临时措施。如果您喜欢,我可以发布作为可能的修订。您可以在这里看到其效果http://jsfiddle.net/u4sge0k3/。 - Wes
@mayankcpdixit:我刚在Chrome和Firefox中尝试了一下。对于富文本,它应该在Firefox中正常工作,但是在Chrome中似乎有一些问题。 - Tim Down
显示剩余2条评论

2

尝试使用 range.getBoundingClientRect 替代 range.getClientRects

JSFiddle


很好。由于某些原因,在IE8中它无法工作,但在Firefox中可以工作。 - Pankaj Parashar
Fiddle 结果显示 404 - yckart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接