首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取相对于父元素的点击范围

获取相对于父元素的点击范围
EN

Stack Overflow用户
提问于 2018-02-15 23:24:39
回答 1查看 497关注 0票数 2

所以我遇到了这个问题,我需要获得相对于父元素的单击点偏移。假设我已经像这样呈现了html:

代码语言:javascript
复制
<div>
   able   to   allocate   many   IPs.
   <span style="background: yellow">
      Proof-of-work   is   essentially   one-CPU-one-vote.
   </span>     The   majority
</div>

我想得到click相对于父div的偏移量。例如,如果我点击单词is in span tag,我就会得到点击相对于父Div的偏移量。我该如何实现这一点。我试过写这样的代码:

代码语言:javascript
复制
var selection = window.getSelection();
var range = selection.getRangeAt(0);
var offset = range.startOffset;

但是这给出了相对于span标记的偏移量。那么如何获得相对于div标记的偏移量呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-16 00:59:47

我不知道有什么内置函数可以测量一个范围相对于另一个元素的偏移量。您可以使用范围的startContainer属性,然后在DOM层次结构中向上爬行,同时测量内容。

我在下面创建了一个演示。但是,请注意,这可能会产生您想要的结果,也可能不会。例如,这将测量注释和样式节点的长度,并且将计算所有空格字符,无论浏览器最终是否呈现它们。你可能需要做一些调整来满足你自己的目的,比如在测量之前添加对nodeType的检查,预先折叠空格字符(可能使用正则表达式替换)等等,但我希望这是一个很好的起点。

代码语言:javascript
复制
function clicked(){
  console.log( getSelectionOffsetRelativeTo( document.getElementById( 'parent' ) ) );
}

function getSelectionOffsetRelativeTo(parentElement, currentNode){

  var currentSelection, currentRange,
      offset = 0,
      prevSibling,
      nodeContent;
      
  if (!currentNode){
    currentSelection = window.getSelection();
    currentRange = currentSelection.getRangeAt(0);
    currentNode = currentRange.startContainer;
    offset += currentRange.startOffset;
  }
    
  if (currentNode === parentElement){
    return offset;
  }
  
  if (!parentElement.contains(currentNode)){
    return -1;
  }
  
  while ( prevSibling = (prevSibling  || currentNode).previousSibling ){
    nodeContent = prevSibling.innerText || prevSibling.nodeValue || "";
    offset += nodeContent.length;
  }
  
  return offset + getSelectionOffsetRelativeTo( parentElement, currentNode.parentNode );

}
代码语言:javascript
复制
Click inside the div:

<div id="parent" style="border: black 1px solid;" onclick="javascript:clicked();">

  Currently in the parent node.

  <span style="color: red;">In the first child span.</span>

  Back in the parent node.

  <span style="color: red;">In the second child span.

    <span style="font-style:italic;">In the grandchild span.</span>

  </span>

  Back in the parent node.

</div>

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48810664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档