javascript - 获取内容可编辑innerHTML的子内容

标签 javascript html contenteditable

我想在按键时将 contenteditable 的内容分成两部分。

<div contenteditable="true">This is <b>my content</b></div>

我想获取这句话(不含HTML)从0到10的子串,即:

这是我的

有没有办法在 JS 中做到这一点,它知道关闭将被切断的标签?或者我需要编写一个函数来确定节点并手动关闭它?

我想返回:

This is <b>my</b>

<b> content</b>

以下是检索插入符号左侧的代码:

traverse = ( node: Node, selectedNode: Node, offset, direction = 0, parent = true ) => {
    if ( node.nodeName === '#text' ) {
      if ( node.isEqualNode(  selectedNode ) ) {
        return [ node.textContent.substr( 0, offset  ), node.textContent.substr( offset  ) ];
      }
      return node.textContent;
    }
    if ( node.childNodes.length === 1 && node.childNodes[0].nodeType === 3 ) {
      if ( node.childNodes[0].isEqualNode(  selectedNode ) ) {
        const newNode1 = node.cloneNode();
        const newNode2 = node.cloneNode();
        newNode1.innerHTML = node.childNodes[0].textContent.substr( 0, offset  );
        newNode2.innerHTML = node.childNodes[0].textContent.substr( offset );
        return [ newNode1.outerHTML, newNode2.outerHTML ];
      }
      return node.outerHTML;
    }
    if ( node.childNodes.length > 1 ) {
      let content = '';
      let found = false;
      for ( let x = 0; node.childNodes[x] && !found; x++ ) {
        let resp = this.traverse(  node.childNodes[x], selectedNode, offset, direction, false );
        if ( Array.isArray( resp ) ) {
          content += resp[0];
          found = true;
        } else {
          content += resp;
        }
      }
      if ( !parent ) {
        const newNode = node.cloneNode();
        newNode.innerHTML = content;
        return newNode.outerHTML;
      } else {
        return content;
      }
    }
  }

最佳答案

好吧,经过多次尝试和错误,我终于明白了。该函数接受一个元素或节点、选定的节点以及选定节点的偏移量,并将返回两个带有正确闭合标签的分成两半的 HTML 字符串。

traverse = ( node: Node, selectedNode: Node, offset, parent = true ) => {
    let found = false;
    if ( node.nodeName === '#text' ) {
      if ( node.isEqualNode(  selectedNode ) ) {
        return [ node.textContent.substr( 0, offset  ), node.textContent.substr( offset  ) ];
      }
      return node.textContent;
    }
    if ( node.childNodes.length === 1 && node.childNodes[0].nodeType === 3 ) {
      if ( node.childNodes[0].isEqualNode(  selectedNode ) ) {
        const newNode1 = node.cloneNode();
        const newNode2 = node.cloneNode();
        newNode1.innerHTML = node.childNodes[0].textContent.substr( 0, offset  );
        newNode2.innerHTML = node.childNodes[0].textContent.substr( offset );
        return [ newNode1.outerHTML, newNode2.outerHTML ];
      }
      return node.outerHTML;
    }
    if ( node.childNodes.length > 1 ) {
      let content = ['', ''];
      for ( let x = 0; node.childNodes[x]; x++ ) {
        const resp = this.traverse(  node.childNodes[x], selectedNode, offset, false );
        if ( Array.isArray( resp ) ) {
          content[0] += resp[0];
          content[1] += resp[1];
          found = true;
        } else {
          if ( found ) {
            content[1] += resp;
          } else {
            content[0] += resp;
          }
        }
      }
      if ( !parent ) {
        const newNode1 = node.cloneNode();
        const newNode2 = node.cloneNode();
        newNode1.innerHTML = content[0];
        newNode2.innerHTML = content[1];
        if ( found ) {
          return [ newNode1.outerHTML, newNode2.outerHTML ];
        } else {
          return newNode1.outerHTML;
        }
      } else {
        if ( found ) {
          return content;
        } else {
          return content[0];
        }
      }
    }
  }

关于javascript - 获取内容可编辑innerHTML的子内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54575310/

相关文章:

javascript - 在 contenteditable div 中的光标处追加 div

html - 仅用于索引页的全 Angular 图像

javascript - 当用户在 contenteditable div 中输入时替换最后一个字符

javascript - contenteditable div 附加一个 html 元素并在 Vuejs 中对其进行 v 建模

javascript - 编写自定义 .on()/.bind() JavaScript 的最高效方式

python urllib2.urlopen - html 文本出现乱码 - 为什么?

Python BeautifulSoup & 问题 Mac 与 Linux Ubuntu

php - 搜索和嵌入 youtube 视频的脚本

javascript - 是否可以通过将对象的属性设置为未定义来删除该属性?

javascript - 向后循环直到找到某个字符(javascript)