此链接中的信息是否准确?
https://developer.mozilla.org/en-US/docs/DOM/Selection
根据这份文件:
anchorOffset: 返回选择的锚点在anchorNode中偏移的字符数。
使用FireFox进行实验,似乎定义并非总是如此。有时,偏移属性似乎表示一定数量的childNodes。根据初步测试,以下代码有效:
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 的值。
在某些方面,这篇文章部分是一个问题,部分是答案。希望评论能反映出新的细节。
答案 0 :(得分:1)
MDN的定义错误 [UDPATE:我现在更正了MDN] 。 anchorOffset
和anchorNode
(以及focusNode
和focusOffset
)就像Range边界一样工作:偏移量是texty节点中的一些字符(文本,字符数据和注释节点)或所有其他节点类型中选择锚之前的anchorNode
子节点数。实际上,正如您所观察到的,选择边界并不总是在文本节点内。一个明显的例子是插入符号位于两个相邻图像之间(插入符号由管道符表示):
<div contenteditable="true"><img src="1.png">|<img src="2.png"></div>
此外,Firefox经常将选择边界作为元素内的偏移返回,尤其是当选择选择整个块元素(例如<p>
)时。其他浏览器不倾向于这样做,而更喜欢在文本节点内返回偏移量。
对于isText
,如果我理解正确的话,完整的实现将类似于以下内容,它取自我自己的代码:
function isCharacterDataNode(node) {
var t = node.nodeType;
return t == 3 || t == 4 || t == 8 ; // Text, CDataSection or Comment
}