document.getSelection 选择中有回车 return

document.getSelection with carriage return in selection

我尝试了很多不同的东西,但不知所措。下面的代码说明了这个问题。我有一个可编辑的元素。

如果我select一段文字,Selection.anchorNode是一个#text节点。

如果在 select 编辑一个段落时,我在该段落之前添加了一个回车符 return,则 Selection.anchorNode 是包含跨度的元素。

我需要知道的是从 span 元素的 innerText 值开始的偏移量。当 return 不包含在 selection 中时,我可以简单地分析 anchorNode 的兄弟节点。但是当 return 包含在 selection 中时,我似乎没有实现这一点的信息。

任何关于我遗漏的指导都将不胜感激。

function showResult() {
  let sel = document.getSelection();
  document.getElementById("output").textContent ="document.getSelection().anchorNode.nodeName: " +  sel.anchorNode.nodeName;
}
document.getElementById("textContainer").innerText = "This is the first paragraph\n\nSelecting this paragraph with and without the preceding carriage return yields very different anchorNodes";
#textContainer {
  position: relative;
  display: inline-block;
  width: 400px;
  height: 100px;
  border: 1px solid steelblue;
  margin: 5px;
}

#output {
  position: relative;
  width: 400px;
  height: 100px;
  border: 1px solid steelblue;
  margin: 5px;
}
<div>
    <span id="textContainer" contenteditable="true"></span>
</div>
<input  type="button" onclick="showResult()" value="Write selection object to console" />
<div id="output">
</div>

似乎浏览器 return 父节点选择回车 return 所以你可以使用 if 这种情况的条件:

sel.anchorNode.hasChildNodes()?sel.anchorNode.childNodes[0].nodeName:sel.anchorNode.nodeName

function showResult() {
  let sel = document.getSelection();
  document.getElementById("output").textContent ="document.getSelection().anchorNode.nodeName: " +  (sel.anchorNode.hasChildNodes()?sel.anchorNode.childNodes[0].nodeName:sel.anchorNode.nodeName);
}
document.getElementById("textContainer").innerText = "This is the first paragraph\n\nSelecting this paragraph with and without the preceding carriage return yields very different anchorNodes";
#textContainer {
  position: relative;
  display: inline-block;
  width: 400px;
  height: 100px;
  border: 1px solid steelblue;
  margin: 5px;
}

#output {
  position: relative;
  width: 400px;
  height: 100px;
  border: 1px solid steelblue;
  margin: 5px;
}
<div>
    <span id="textContainer" contenteditable="true"></span>
</div>
<input  type="button" onclick="showResult()" value="Write selection object to console" />
<div id="output">
</div>