【问题标题】:Insert HTML tag for selected text inside paragraph tag在段落标记内插入选定文本的 HTML 标记
【发布时间】:2019-06-03 21:25:44
【问题描述】:

我正在尝试为段落标记中的选定元素添加新元素。 HTML代码sn-p如下:

 <div class="parent-bodytext">
     <p>Hello</p>
     <p>This one is</p>
     <p>Sample Text</p>
 </div>

所以在上面的 sn-p 中,我从第二个 P 标记中选择了“一个”单词,并使用任何事件尝试将元素添加到该选定文本,以便输出如下所示:

 <div class="parent-bodytext">
     <p>Hello</p>
     <p>This <strong>one</strong> is</p>
     <p>Sample Text</p>
 </div>

那么如何为选中的文本添加这个新创建的“Strong”元素呢?

【问题讨论】:

  • 需要加强标签时请多解释
  • @Justcode 如果我选择任何按钮,那么应该将强标签添加到所选文本中。
  • 我不是 100% 确定,但我认为这是不可能在选定的文本中附加强标签,如果你想这样做,你需要使用一些文本编辑器,如 ckeditor ckeditor.com 并使用 css隐藏边框等,使其显示为原始页面。
  • @AvinashJadhav 看到这个链接 jsfiddle.net/pq8yg5ke 如果您需要更多帮助,请告诉我。

标签: javascript html ckeditor


【解决方案1】:

你想要这样的东西吗?

window.onload = () => {
  function getSelectionParentElement() {
    var parentEl = null,
      sel;
    if (window.getSelection) {
      sel = window.getSelection();
      if (sel.rangeCount) {
        parentEl = sel.getRangeAt(0).commonAncestorContainer;
        if (parentEl.nodeType != 1) {
          parentEl = parentEl.parentNode;
        }
      }
    } else if ((sel = document.selection) && sel.type != "Control") {
      parentEl = sel.createRange().parentElement();
    }
    return parentEl;
  }

  function getSelectedText() {
    var text = "";
    if (typeof window.getSelection != "undefined") {
      text = window.getSelection().toString();
    } else if (
      typeof document.selection != "undefined" &&
      document.selection.type == "Text"
    ) {
      text = document.selection.createRange().text;
    }
    return text;
  }
  
  const makeBold = (selectStart, selectEnd, length, text)=>{
    let replacedText = `<strong>${text.substr(selectStart, length)}</strong>`;
    let textHalfA = text.substr(0, selectStart);
    let textHalfB = text.substr(selectEnd, text.length - 1);
    return textHalfA + replacedText + textHalfB;
  };
  
  function handleMouseUp() {
    // the selected text
    const text = getSelectedText();
    // the length of the selected content
    const selectedTextLength = text.length;
    // the parent of the selected content
    let parent = getSelectionParentElement();
    // the entire content of the parent
    let parentText = parent.innerHTML;
    // where the user's selection starts
    let selectStart = window.getSelection().getRangeAt(0).startOffset;
    // where the user's selection ends
    let selectEnd = window.getSelection().getRangeAt(0).endOffset;
    if (parent) {
      parent.innerHTML = makeBold(selectStart, selectEnd, selectedTextLength, parentText);
    }
  }

  document.onmouseup = handleMouseUp;
  document.onkeyup = handleMouseUp;
};
&lt;p&gt;I am a sentence.&lt;/p&gt;

来源是thisthis

另外,这是pen :)


编辑:代码已更新。现在应该正确完成所选内容的修改。虽然,我不知道如何处理对已修改元素的第二次修改。(我会很快再次更新。除非,OP 有一个想法;))

【讨论】:

  • 啊。我错过了。给我一秒钟
  • @YaseenAhmad 解决了那个问题 :) 我会尝试解决我放学后提到的问题。
【解决方案2】:

您可能希望为此使用window.getSelection

const wrapper = document.getElementsByClassName('parent-bodytext')[0];

wrapper.addEventListener('mouseout', event => {
   const selection = window.getSelection();
   if (selection.rangeCount) {
       const replacement = document.createElement('strong');
       replacement.textContent = selection.toString();
       const range = selection.getRangeAt(0);
       range.deleteContents();
       range.insertNode(replacement);
   }
});
 <div class="parent-bodytext">
 <p>Hello</p>
 <p>This one is</p>
 <p>Sample Text</p>
 </div>

【讨论】:

    【解决方案3】:

    编辑:删除 jQuery 依赖项 您可以使用 CSS 实现此目的。 首先,您需要用跨度分隔每个单词。 然后在事件起源的跨度上添加 class strong

    window.onload = function () {
      document.getElementsByClassName("parent-bodytext")[0].onclick = function(e) {
        var tgt = e.target;
        if (tgt && tgt.nodeName === 'SPAN') {
          tgt.classList.add('strong');
        }
      };
    };
    .strong{
      font-weight: bold;
    }
    <div class="parent-bodytext">
         <p><span>Hello</span></p>
         <p><span>This</span> <span>one</span> <span>is</span></p>
         <p><span>Sample</span> <span>Text</span></p>
     </div>

    【讨论】:

    • 不错的答案,但他只想添加强选择文本而不是全文。
    • 没有 jquery 可以吗?使用 HTML 的基本 API,例如 element.innerHTML、document.getSelection()、getRangeAt(0)。
    • @AvinashJadhav 删除了 jQuery 依赖。
    • @YaseenAhmad 稍微修改了代码,现在 class strong 只添加到选定的单词中,您可以运行 code sn -p 并尝试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多