从所选文本创建元素

Create element from selected text

我正在尝试从 selected/highlighted 文本

创建一个元素

我正在做一个所见即所得的项目,我使用 KaTeX 将原始数学公式渲染成漂亮的公式。

当您 select 原始公式并单击所见即所得工具栏上的“数学解析”时,它应该这样做:

第二步我好像做不到。我不明白如何在 selected 文本所在的位置动态创建一个新元素(这个元素将是一个跨度)并用 Katex 渲染器填充它。

我的职能:

function getSelectionText() {
      var text = "";
      if (window.getSelection) {
        text = window.getSelection().toString();
      } else if (document.selection && document.selection.type != "Control") {
        text = document.selection.createRange().text;
      }
      return text;
    }

    function deleteSelection() {
      let selection = window.getSelection();
      selection.deleteFromDocument();
    }

——-——————编辑————————-

我想到了这个:

var z = document.createElement('span');
        document.body.append(z);


katex.render(currentText, z);

这很好用,但元素总是打印在我页面的最底部 我希望在文本所在的位置创建元素 有什么帮助吗?

您应该尝试使用 insertBefore 方法:https://www.w3schools.com/jsref/met_node_insertbefore.asp

这是一个使用 Selection.getRangeAtinsertNode:

的简单示例

// Singleton to handle caret selection
const Sel = {
  get() { return window.getSelection(); },
  range(x) { return this.get().getRangeAt(x||0); },
  ancestor() { return this.range().commonAncestorContainer; },
  text() { return this.get().toString(); },
  delete() { this.get().deleteFromDocument(); },
  insert(el, x) { this.range(x).insertNode(el); },
};

// Function to easily create elements
const NewEL = (t, p) => Object.assign(document.createElement(t), p);

// Insert SPAN at selection
document.querySelector("#insert").addEventListener("click", () => {
  const text = Sel.text();
  if (!text) return console.log("Nothing selected");
  if (Sel.ancestor().nodeType === 1) return console.log("Cannot insert");
  Sel.delete();
  Sel.insert(NewEL("span", {textContent: text, className: "math"}));
});
.math {color: red; font-size: 2em; user-select: none;}
div {padding: 10px; border:1px solid #ddd; }
Highlight some text and click: <button id="insert">INSERT SPAN</button>

<div>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit. Incidunt enim deserunt officiis eum nesciunt maiores nisi voluptatum cum aperiam excepturi earum velit natus, perferendis itaque id necessitatibus. Iusto, labore repellat.
</div>