Javascript 获取文本范围的偏移量

Javascript 获取文本范围的偏移量,javascript,textrange,Javascript,Textrange,有人能告诉我为什么此代码返回未定义的吗 我希望这会给出用户选择文本的左坐标 function alertRangeObject(){ var userSelection; if(window.getSelection) { userSelection = window.getSelection(); } else if (document.selection) { userSelection = document.selecti

有人能告诉我为什么此代码返回未定义的

我希望这会给出用户选择文本的左坐标

function alertRangeObject(){
    var userSelection;

    if(window.getSelection)
    { 
    userSelection = window.getSelection();
    }
    else if (document.selection)
    {
    userSelection = document.selection.createRange();
    }

    var selectedText = userSelection;
    if (userSelection.text)
    {
        selectedText = userSelection.text;
    }

    var rangeObject = getRangeObject(userSelection);

    function getRangeObject(selectionObject)
    {
        if (selectionObject.getRangeAt)
        return selectionObject.getRangeAt(0);
        else { //safari
            var range = document.createRange();
            range.setStart(selectionObject.anchorNode, selectionObject.anchorOffset);
            range.setEnd(SelectionObject.focusNode, selectionObject.focusOffset);
            return range;
              }
        }


       alert(rangeObject.offsetLeft);
   }
令人沮丧的是,当您
警报(rangeObject)
我收到所选文本时。但是我想如果这是一个文本范围,我可以使用
offsetLeft
方法来获得左坐标。谁能看出我做错了什么。
谢谢。

TextRange
对象确实有
offsetLeft
offsetTop
属性,但是您发布的代码将在IE<9中抛出错误,因为
getRangeObject()
函数返回
未定义的
。我建议使用其他代码。以下内容将获得IE>=4和支持的其他浏览器的最新版本中相对于视口的选择的左上角坐标,并在其他浏览器中返回(0,0)

jsFiddle:

代码:

目前,我正在开发一个范围/选择位置模块,该模块使用了与上述类似的方法。这是一项正在进行的工作,但在大多数场景和浏览器中都能很好地工作。它应该成为1.3版。此处演示:


另一方面,这段代码看起来像是基于PPK在quirksmode上的代码。它已经过时,代码混乱且不理想,但在不久的将来应该会有一些改进。

您可以使用它来获取有关所选范围的所有信息。谢谢Tim,我确实使用了“范围介绍页面”。谢谢你的提醒。我要花一段时间熟悉兰吉。另外,感谢上面的代码。Blink和Webkit从不让我感到惊讶。在contentEditable元素中测试时,当范围折叠时,它们返回rect
0,0,0,0
。这两台发动机肯定总有问题;>
function getSelectionTopLeft() {
    var x = 0, y = 0;
    // Use standards-based method only if Range has getBoundingClientRect
    if (window.getSelection && document.createRange
    && typeof document.createRange().getBoundingClientRect != "undefined") {
        var sel = window.getSelection();
        if (sel.rangeCount > 0) {
            var rect = sel.getRangeAt(0).getBoundingClientRect();
            x = rect.left;
            y = rect.top;
        }
    } else if (document.selection && document.selection.type != "Control") {
        // All versions of IE
        var textRange = document.selection.createRange();
        x = textRange.boundingLeft;
        y = textRange.boundingTop;
    }
    return { x: x, y: y };
}