Internet Explorer TextRange中的字符偏移量

Tho*_*hom 4 html javascript internet-explorer dhtml selection

据我所知,没有简单的方法可以从Internet Explorer中的TextRange对象中检索字符偏移量.W3C Range对象具有一个节点,以及该节点内文本的偏移量.IE似乎只有像素偏移.有创建,扩展和比较范围的方法,因此可以编写一个算法来计算字符偏移量,但我觉得我必须遗漏一些东西.

那么,计算Internet Explorer TextRange开头的字符偏移量的最简单方法是什么?

Bor*_*gar 8

我使用基于这个插入位置技巧的方法:

// Assume r is a range:
var offsetFromBody = Math.abs( r.moveEnd('character', -1000000) );
Run Code Online (Sandbox Code Playgroud)

由于moveEnd返回实际移动的字符数,因此offset现在应该是从文档开头的偏移量.这适用于测试原始插入符移动,但是对于扩展选择和获取包含范围锚点的确切节点,您需要更复杂的东西:

// where paramter r is a range:
function getRangeOffsetIE( r ) {
  var end = Math.abs( r.duplicate().moveEnd('character', -1000000) );
  // find the anchor element's offset
  var range = r.duplicate();
  r.collapse( false );
  var parentElm = range.parentElement();
  var children = parentElm.getElementsByTagName('*');
  for (var i = children.length - 1; i >= 0; i--) {
    range.moveToElementText( children[i] );
    if ( range.inRange(r) ) {
      parentElm = children[i];
      break;
    }
  }
  range.moveToElementText( parentElm );
  return end - Math.abs( range.moveStart('character', -1000000) );
}
Run Code Online (Sandbox Code Playgroud)

这应该返回正确的插入符号文本偏移量.当然,如果您已经知道目标节点,或者能够提供上下文,那么您可以跳过整个循环搜索混乱.


Tim*_*own 5

我建议IERange,或者仅仅是TextRange至- DOM Range从它的算法.

更新,2011年8月9日

我现在建议使用我自己的Rangy库,它与IERange的想法类似,但更充分地实现和支持.