JavaScript - 获取contentEditable div中当前行的HTML

Kac*_* G. 19 html javascript jquery

我有我的内容可编辑 div:

div {
  width: 200px;
  height: 300px;
  border: 1px solid black;
}
Run Code Online (Sandbox Code Playgroud)
<div contenteditable="true" spellcheck="false" style="font-family: Arial;">
    <b>Lorem ipsum</b> dolor sit amet, <u>consectetur adipiscing elit. 
    Morbi sagittis</u> <s>mauris porta arcu auctor, vel aliquam ligula ornare.</s> 
    Sed at <span id="someId">semper neque, et dapibus metus. 
    Maecenas dignissim est non nunc feugiat</span> 
    sollicitudin. Morbi consequat euismod consectetur. Mauris orci 
    risus, <b>porta quis erat ac, malesuada</b> fringilla odio.
</div>
    
<button>Get current line HTML</button>
Run Code Online (Sandbox Code Playgroud)

我想创建一个按钮,从当前行给我HTML代码.例如:
当我的插入符号位于第二行时,我想得到:

amet, <u>consectetur</u>
Run Code Online (Sandbox Code Playgroud)

或在第七行:

<span id="someId">dapibus metus. Maecenas</span>
Run Code Online (Sandbox Code Playgroud)

我试图用Rangy做到这一点,但那没用.我怎么能用JavaScript和/或JQuery做到这一点?
感谢帮助.

Joh*_*erg 8

我不会为您编写完整的代码,但这里有很好的帮助,可以帮助您获得结果.

首先,您需要一种方法来计算线条.我建议在这个stackoverflow中查看答案:如何选择第n行文本(CSS/JS) 从中可以得到特定单词的行号.

您的插入符号对您来说可以从这些信息中得到什么:如何在一个可疑的div中得到插入符号?

将行号功能与当前插入符号组合在一起,您将能够返回符号所在的完整行.


I.G*_*ual 6

此解决方案基于 Mozilla 在 中提出的示例Selection.modify(),但使用lineboundary粒度并使用moveextend更改参数。

为了保留插入符号位置,选择的范围被存储/恢复。

播放width内容,编辑代码段并检查它。

你得到了你的 HTML。

function getSelectionHtml() {
  var selection = window.document.selection,
    range, oldBrowser = true;

  if (!selection) {
    selection = window.getSelection();
    range = selection.getRangeAt(0);
    oldBrowser = false;
  } else
    range = document.selection.createRange();

  selection.modify("move", "backward", "lineboundary");
  selection.modify("extend", "forward", "lineboundary");

  if (oldBrowser) {
    var html = document.selection.createRange().htmlText;
    range.select();
    return html;
  }

  var html = document.createElement("div");

  for (var i = 0, len = selection.rangeCount; i < len; ++i) {
    html.appendChild(selection.getRangeAt(i).cloneContents());
  }

  selection.removeAllRanges();
  selection.addRange(range);
  return html.innerHTML;
}

document.getElementById("content").onmouseup = function(e) {
  var html = getSelectionHtml();
  document.getElementById("text").innerHTML = html;
  document.getElementById("code").textContent = html;
};
Run Code Online (Sandbox Code Playgroud)
h4,
p {
  margin: 0;
}

#code {
  width: 100%;
  min-height: 30px;
}

#content {
  margin: 15px;
  padding: 2px;
  width: 200px;
  height: 300px;
  border: 1px solid black;
}
Run Code Online (Sandbox Code Playgroud)
<textarea id="code"></textarea>
<div id="text"></div>

<div contenteditable="true" id="content" spellcheck="false" style="font-family: Arial;">
  <b>Lorem ipsum</b> dolor sit amet, <u>consectetur adipiscing elit. 
    Morbi sagittis</u> <s>mauris porta arcu auctor, vel aliquam ligula ornare.</s> Sed at <span id="someId">semper neque, et dapibus metus. 
    Maecenas dignissim est non nunc feugiat</span> sollicitudin. Morbi consequat euismod consectetur. Mauris orci risus, <b>porta quis erat ac, malesuada</b> fringilla odio.
</div>
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

1750 次

最近记录:

8 年 前