javascript - 在 Javascript 中计算嵌套元素中的文本选择偏移量

标签 javascript html dom

问题

我正在尝试使用 javascript 从特定节点计算出选择的偏移量。

假设我有以下 HTML

<p>Hi there. This <strong>is blowing my mind</strong> with difficulty.</p>

如果我选择从blowingdifficulty,它会给出与#text 的偏移量<strong> 内的节点.我需要从 <p> 开始的字符串偏移量的 innerHTML和选择的长度。在这种情况下,偏移量为 26,长度为 40。

我的第一个想法是用字符串偏移等做一些事情,但你可以很容易地得到类似的东西

<p> Hi there. This <strong>is awesome</strong>. For real. It <strong>is awesome</strong>.</p>

这会破坏该方法,因为存在相同的节点。我还需要丢弃节点的选项。假设我有这样的东西

<p>Hi there. <a href="#" rel="inserted">This <strong>is blowing</a> my mind</strong> with difficulty.</p>

我想用 rel="inserted" 抛出一个元素当我进行计算时。我仍然想要 26 和 40 作为结果。

我在找什么

解决方案需要递归。如果有<span><strong>在其中,它仍然需要遍历到 <p> .

解决方案需要使用rel="inserted" 删除任何元素的长度.内容很重要,但标签本身并不重要。所有其他标签都很重要。当我执行所有这些操作时,我强烈不希望从 DOM 中删除任何元素。

我正在使用 document.getSelection()获取选择对象。这个解决方案只需要在 WebKit 中工作。 jQuery 是一个选项,但如果可能的话我宁愿没有它。

任何想法将不胜感激。

我无法控制执行所有这些操作的 HTML。

最佳答案

我想我解决了我的问题。我最终没有像最初计划的那样计算偏移量。我正在存储 block 中的“路径”(又名 <p> )。这是代码:

function isChunk(node) {
  if (node == undefined || node == null) {
    return false;
  }
  return node.nodeName == "P";
}

function pathToChunk(node) {
  var components = new Array();

  // While the last component isn't a chunk
  var found = false;
  while (found == false) {
    var childNodes = node.parentNode.childNodes;
    var children = new Array(childNodes.length);
    for (var i = 0; i < childNodes.length; i++) {
      children[i] = childNodes[i];
    }        
    components.unshift(children.indexOf(node));

    if (isChunk(node.parentNode) == true) {
      found = true
    } else {
      node = node.parentNode;
    }
  }

  return components.join("/");
}

function nodeAtPathFromChunk(chunk, path) {
  var components = path.split("/");
  var node = chunk;
  for (i in components) {
    var component = components[i];
    node = node.childNodes[component];
  }
  return node;
}

有了所有这些,你可以做这样的事情:

var p = document.getElementsByTagName('p')[0];
var piece = nodeAtPathFromChunk(p, "1/0"); // returns desired node
var path = pathToChunk(piece); // returns "1/0"

现在我只需要扩展所有这些以支持选择的开始和结束。不过,这是一个很棒的构建基 block 。

关于javascript - 在 Javascript 中计算嵌套元素中的文本选择偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3373167/

相关文章:

javascript - 在溢出的 div 内滚动

html - 如何在我的网格中正确对齐我的开放时间?

javascript - 将 javascript 计算器中的几个操作串在一起

javascript - 我可以绑定(bind)到使用 jquery.load() 加载的元素吗?

javascript - javascript 函数中未调用 Ajax

javascript - 为什么这个小的重定向不起作用(javascript)?

javascript - 如何强制 jQuery 函数在更新文本之前完成淡入淡出动画?

javascript - 为什么注入(inject) iframe 中的 JavaScript 使用父窗口作为其全局范围?

javascript - 获取页面中的元素数

javascript - 以编程方式创建图像时,Chrome 版本 32 (Mac) 停止从 src 加载图像