javascript - 如何在 contenteditable div 中放置插入符号,同时忽略 HTML 标签?

标签 javascript vue.js

以下代码根据 caret 的值设置插入符:

<div ref="editable" contenteditable="true">
  This text can be edited by the user. Right away.
</div>
<button type="button" @click="setCaret">Set caret</button>

setCaret () {
  const node = this.$refs.editable
  node.focus()
  const textNode = node.firstChild
  const caret = node.textContent.search('R')
  const range = document.createRange()
  range.setStart(textNode, caret)
  range.setEnd(textNode, caret)
  const sel = window.getSelection()
  sel.removeAllRanges()
  sel.addRange(range)
}

如果将文本包含在 p 标签内:

<p>This text can be edited by the user.</p>
<p>Right away.</p>

您收到此错误:

App.vue?6b51:36Uncaught DOMException: Failed to execute 'setStart' on 'Range': There is no child at offset -1.(…)

如何修改代码,以便 setCaret 设置插入符,同时忽略 HTML 标记?

最佳答案

您可能需要递归搜索 div 内的这些节点:

function findTextNode(node) {
  const childNodes = node.childNodes;
  if (childNodes.length > 0) {
    for(let i=0; i<childNodes.length; i++) {
      const child = childNodes[i];
      const result = findTextNode(child);
      if (result) {
        return result;
      }
    }
    return false;
  } else {
    const place = node.textContent.search('R');
    if (!node.tagName && place!==-1) {
      return node;
    }
    return false;
  }
}

在这里工作 fiddle :http://jsfiddle.net/1x6knn37/

关于javascript - 如何在 contenteditable div 中放置插入符号,同时忽略 HTML 标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40945117/

相关文章:

javascript - 将模板添加到 div 内的 img 前面

javascript - 三.js球坐标公式

javascript - :onchange event causing loop thru method

html - 如何在 VueJS 中下载本地存储的文件

vue.js - Vue - 深入观察对象数组的变化,无论是添加对象还是修改对象

javascript - Rails 应用程序中的 Vue 生命周期 Hook

javascript - 将播放列表添加到 iframe 标记

javascript - Vue.js 可以更新嵌套属性吗?

javascript - 如何在 Vue.js 模板中定义一个临时变量

javascript - 弹出模式仅适用于表中的第一个元素,第二次单击后不会再次打开