【问题标题】:Calculate width & height of the selected text (javascript)计算所选文本的宽度和高度(javascript)
【发布时间】:2012-09-26 22:30:03
【问题描述】:

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

我使用以下 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 };
}

lefttop 坐标显示正确。要计算宽度和高度,我还需要 rightbottom 位置。

所以我添加了几行代码来查找 bottomright 位置(代码可在此处获得 - http://jsfiddle.net/pankajparashar/kv2Bp/)。但令我惊讶的是,代码显示leftright 坐标始终相同,即使它们之间存在明显差异(仅在Firefox 中测试)。

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

任何人都可以指出代码的任何缺陷吗?或任何替代方法,我可以使用它来计算所选文本的宽度和高度?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    这里有一些代码来获取选择的边界矩形的尺寸。它与原始代码非常相似。

    演示: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。
    • 我意识到这是一个较旧的线程 - 但看看 Fiddle,跨

      元素时高度数是不准确的。如果所有文本都在单个

      元素中,则它是准确的,但在跨越

      元素时则不然。

    • @Wes:你是对的,至少在 Chrome 中是这样。火狐没问题,Safari 7.1 没问题。我怀疑 Chrome 中存在浏览器错误。
    • @TimDown 看起来你是对的。我已向 Google Chrome 团队提交了一个错误。希望他们能修复它,但可能不会很快。
    • 虽然不是一个漂亮的解决方案,也不是所有地方都支持,但我发现可以通过检查 navigator.userAgent 来查看它是否是 Chrome 浏览器,然后使用 getClientRecs() 来计算正确的解决方案高度乘以第一行的高度乘以 1.55 * 矩形的数量(1.55 是 FireFox/Safari 和 Chrome 上高度之间的平均差)。结果非常接近,可以作为权宜之计,直到谷歌解决这个问题。如果你愿意,我可以发布一个可能的修订版。你可以在这里看到它jsfiddle.net/u4sge0k3
    【解决方案2】:

    尝试使用 range.getBoundingClientRect 而不是 range.getClientRects

    JSFiddle

    【讨论】:

    • 好。出于某种原因,它无法在 IE8 中运行,但在 Firefox 中运行。
    • 小提琴结果404
    猜你喜欢
    • 1970-01-01
    • 2017-10-21
    • 2013-10-07
    • 2010-09-12
    • 2014-06-02
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多