14

我想知道两个文本节点是否在视觉上是连续的,无论 html 结构如何,即两者之间没有空行或任何其他元素。

我正在使用Ranges来获取矩形(大小和位置),但文本节点之间存在间距(第一个矩形的底部与第二个矩形的顶部不匹配)。

我试图根据line-heightand计算这个间距,font-size但我无法得到相同的值。

这是我尝试的 JsFiddle: https ://jsfiddle.net/3behsxxq/5/

有没有办法计算这个间距?

编辑: 在 jsFiddle 代码的第一种情况下,有四行('first text'、'block'、'second'、'text block')在视觉上是连续的,也就是说,视觉上它们之间的距离是相同的,但我得到的数字相差 7(在第一种情况下)。如果我尝试根据 line-height/font-size 和范围值之间的差异来丢弃这个空间,它们不匹配,因此我无法抵消它。

编辑 2. 上下文: 在下图中,6 条线之间的距离相同。我寻找一种方法来确定它们是同一段落的一部分,而不管 html 结构如何(因为 html 可以有一个<p>元素或任何其他元素来表示该段落)。

在此处输入图像描述

4

1 回答 1

1
var extractTextNodes = function(paragraph) {
  var nodes = [];
  function callback(node) {
    if (node.nodeType === Node.TEXT_NODE) {
      nodes.push(node);
    } else if (node.nodeType === Node.ELEMENT_NODE) {
      node.childNodes.forEach(callback);
    }
  }
  paragraph.childNodes.forEach(callback);
  return nodes;
};

var findParentParagraph = function(node) {
  var parent = node.parentElement;
  while (parent) {
    if (parent.tagName === "P") {
      return parent;
    }
    parent = parent.parentElement;
  }

  return null;
};

var areTextNodesSiblings = function(textNode1, textNode2) {
  var p = findParentParagraph(textNode1);
  if (!p) {
    return false;
  }

  var allTextNodes = extractTextNodes(p);
  var index1 = allTextNodes.indexOf(textNode1);
  var index2 = allTextNodes.indexOf(textNode2);
  if (index2 === -1) {
    return false;
  }
  return (index1 === index2 - 1) || (index1 === index2 + 1);
};

只需areTextNodesSiblings通过节点调用即可。

小提琴:https ://jsfiddle.net/krmnve37/1/


标题说“视觉上是连续的”,但“EDITED 2. Context”说节点必须在同一段落中。以下函数将检查两个节点是否在同一段落中,而不是它们是否彼此相邻:

var areTextNodesInTheSameParagraph = function(textNode1, textNode2) {
  var p = findParentParagraph(textNode1);
  if (!p) {
    return false;
  }

  var allTextNodes = extractTextNodes(p);
  var index1 = allTextNodes.indexOf(textNode1);
  var index2 = allTextNodes.indexOf(textNode2);
  return index1 > -1 || index2 > -1;
};
于 2019-05-10T17:55:08.477 回答