javascript - 范围和插入符位置不匹配

标签 javascript html microsoft-edge

我在 MS Edge 中注意到这个问题,插入符号的位置和范围在可编辑的内容中不匹配或错误。

$("#c").click(function(e) {
  var sel = window.getSelection();
  var range = sel.getRangeAt(0);
 
  $("#res").get(0).textContent = "START_OFFSET:" + range.startOffset + "->" + range.startContainer.innerHTML;
  console.log("Range count: " + sel.rangeCount);
});
<html>

<head>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
</head>

<body>
  <div id="c" contenteditable="true">
    <span>TEST</span>
  </div>
  <span id="res"></span>
</body>

</html>

如果打开 MS Edge 很麻烦,这里是代码片段:

enter image description here

结果应该是 4 -> TEST

奇怪的是,实际的插入符指向包含 TEST 的 innerHTML 的跨度节点,但起始偏移量和结束偏移量显示为 1。根据范围数据,它是这样的 |TEST 但视觉上它是 TEST|

有什么办法可以解决吗?

通过 JS,我似乎无法在范围类中捕获正确的信息来正确调整 startOffset 和 endOffset,除非我检测到点击位置附近最近的字母并在那里插入插入符号,但我相信它是乏味。

我找到了 this .是否有关于解决方案的后续行动?谢谢。

更新

span 元素干扰了范围。

$("#c").click(function(e) {
  var sel = window.getSelection();
  var range = sel.getRangeAt(0);
 
  $("#res").get(0).textContent = "START_OFFSET:" + range.startOffset + "-> " + range.startContainer.innerHTML;
 console.log(range.startContainer);
});
<html>

<head>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
</head>

<body>
  <div id="c" contenteditable="true">
    TEST
  </div>
  <span id="res"></span>
</body>

</html>

最佳答案

我已经缩小了问题范围并且 <span>是万恶之源。

span s 文本包含在文本元素内,您正在其中导航( [Object Text] ,检查 startContainer 属性)。在最后一个字符之后,文本元素结束,span然而并没有。所以你现在在文本元素(索引 0)之后并且在 span 中的第一个索引处。 .其他主要浏览器没有这个问题,因为文本元素在最后一个字符之后继续。这很可能是 Edge 错误。

删除 span解决问题。

关于javascript - 范围和插入符位置不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46815472/

相关文章:

javascript - Microsoft Edge 扩展上下文菜单未出现

javascript - OpenLayers setCenter 将无法正常运行

javascript - 从 JavaScript 创建 HTML 元素时的性能注意事项是什么?

javascript - 如何改进 Edge 上递归 promise 的执行时间?在 chrome 上,100000 条记录几乎是瞬间的

javascript - 使用 jquery 创建常见问题首字母缩略词

javascript - 在一个网页中处理两种形式

javascript - Edge 浏览器 - iframe.document.open 不起作用

javascript - Regex - 正则表达式完全匹配字符串

javascript - 获取 api 数据并将其放入表中

javascript - 使用 Jquery 添加没有值的 HTML 属性