0

此链接中的信息是否准确?

https://developer.mozilla.org/en-US/docs/DOM/Selection

根据这份文件:

anchorOffset:返回选择的锚点在 anchorNode 内偏移的字符数。

尝试使用 FireFox,似乎定义并不总是正确的。有时,偏移属性似乎代表一定数量的子节点。根据初步测试,以下代码有效

var sel = window.getSelection() ;
var points = new Array( 0, 0 ) ;
var offset = new Array( sel.anchorOffset, sel.focusOffset ) ;
var nodes = new Array( sel.anchorNode, sel.focusNode ) ;

if ( isText )
    points = offset ;

for ( j = 0 ; j < 2 && ! isText ; j++ ) {
    var kids = nodes[j].childNodes ;
    for ( var i = 0 ; i < offset[j] ; i++ )
        points[j] += kids[i].textContent.length ;
    }

首先,其他人有这种经验吗?其次,我仍在尝试寻找一种可靠的方法来确定isText的值。

在某些方面,这篇文章部分是一个问题,部分是一个答案。希望评论将反映新的细节。

4

1 回答 1

1

MDN 的定义是错误的[UDPATE: I have correct MDN now]anchorOffsetand anchorNode(and focusNodeand focusOffset) 就像Range边界一样工作:偏移量是文本节点(文本、字符数据和注释节点)内的字符数或anchorNode所有其他节点类型中选择锚点之前的子节点数。实际上,正如您所观察到的,选择边界并不总是在文本节点内。一个明显的例子是当插入符号位于两个相邻图像之间时(插入符号由管道字符表示):

<div contenteditable="true"><img src="1.png">|<img src="2.png"></div>

Also, Firefox often returns selection boundaries as offsets within elements, especially when a selection selects a whole block element (such as a <p>). 其他浏览器不倾向于这样做,而是更喜欢在文本节点内返回偏移量。

至于isText,如果我理解正确,完整的实现将类似于以下内容,取自我自己的代码:

function isCharacterDataNode(node) {
    var t = node.nodeType;
    return t == 3 || t == 4 || t == 8 ; // Text, CDataSection or Comment
}
于 2013-02-07T14:37:27.107 回答