【问题标题】:JavaScript / jQuery getSelection Highlight merging the span html elementJavaScript / jQuery getSelection Highlight 合并 span html 元素
【发布时间】:2016-08-02 00:25:34
【问题描述】:

function highlight_text(sel) {
  span = htmlSpanHlt();
  if (sel.getRangeAt) {
    range = sel.getRangeAt(0);
  }
  span.appendChild(range.extractContents());
  range.insertNode(span);
}

function htmlSpanHlt() {
  element = document.createElement("span");
  element.setAttribute('class', 'hlt');
  return element;
}
.hlt {
 background: yellow; 
}
<div class="highlight">
  <p>
    <span class="hlt">Lorem</span> ipsum dolor sit amet, zril accusata postulant at ius. Dicat etiam luptatum ea pri. Duo docendi vulputate dissentiet ut, tollit bonorum duo eu. Maiorum adolescens scriptorem usu eu, sit idque facer causae ei. Choro nostrum at pro, sumo essent suscipiantur pri ex. Quo case veritus definiebas eu, sit postulant dissentias ei.<br>
    <br>
    Mel cu porro decore, cum et simul recteque inciderint. His ne omnes sententiae, ut omittantur dissentiet accommodare sed. Pro minim necessitatibus ne, no malis integre quo. Sed utroque molestiae interpretaris ne. Oportere indoctum at has, te sale semper eum, ea nam vitae dissentiet.
  </p>
</div>

单词“Lorem”有一个类名“hlt”,它已经被突出显示。我想要的是:如果我想突出显示另一个文本,包括单词“Lorem”w/c 已经被突出显示。我想合并他们的 span html 元素。示例:如果我突出显示单词“Lorem”旁边的“ipsum”,并且还包括“Lorem”,则结果将是 Lorem Ipsum。有人能帮我吗?谢谢你。

【问题讨论】:

    标签: javascript jquery angularjs


    【解决方案1】:

    这个怎么样?

    function highlight_text(sel) {
       var hlt_element = document.getElementsByClassName('hlt')[0];
       if (!hlt_element || sel.containsNode(hlt_element,true)) {
          add_hlt_element(sel);
       }
    }
    
    function add_hlt_element(sel) {
       var element = document.createElement("span");
       var range = sel.getRangeAt(0);
       element.setAttribute('class', 'hlt');
       element.innerHTML = sel.toString().replace(/(?:\r\n|\r|\n)/g, '<br />\n');
       range.deleteContents();
       range.insertNode(element); 
       var highlight_div = document.getElementsByClassName("highlight")[0];
       highlight_div.innerHTML = highlight_div.innerHTML.replace('</span><span class="hlt">','');
    }
    
    window.onmouseup = function() {
       var sel = window.getSelection();
       highlight_text(sel);
    }
    .hlt {
        background: yellow; 
    }
    <div class="highlight">
      <p>
        Lorem ipsum dolor sit amet, zril accusata postulant at ius. Dicat etiam luptatum ea pri. Duo docendi vulputate dissentiet ut, tollit bonorum duo eu. Maiorum adolescens scriptorem usu eu, sit idque facer causae ei. Choro nostrum at pro, sumo essent suscipiantur pri ex. Quo case veritus definiebas eu, sit postulant dissentias ei.<br>
        <br>
        Mel cu porro decore, cum et simul recteque inciderint. His ne omnes sententiae, ut omittantur dissentiet accommodare sed. Pro minim necessitatibus ne, no malis integre quo. Sed utroque molestiae interpretaris ne. Oportere indoctum at has, te sale semper eum, ea nam vitae dissentiet.
      </p>
    </div>

    【讨论】:

    • 谢谢你。但什么都不会发生。我无法突出显示任何文字。并且用户可以继续突出显示并且覆盖突出显示他们的跨度将被合并。
    • 啊,它确实有效。但这只是一个例子。页面的开头应该没有突出显示,lorem 只是用户突出显示文本后的一个例子。如果我突出显示 lorem 或任何文本,那么它将突出显示。如果我覆盖并扩展我的突出显示,则跨度将合并。你的第一个答案是正确的,但它只能突出一个词。
    • 如果我开始在第二个字母中突出显示,它也将不起作用,以此类推,,
    • 你的代码很棒。只有两件事遗漏了。首先:用户可以开始覆盖第二个或第三个字母,依此类推。接下来用户可以突出显示未突出显示的文本,它将创建一个新的跨度
    • 是的,很棒。但我有一些带有 html 结构的东西。首先它不会合并跨度。首先,我突出显示“Lorem ipsum”,结果将是 Lorem ipsum,这是正确的。然后,如果我再次突出显示并覆盖直到单词“dolor sit”,结果应该是 Lorem ipsum dolor sit。它不应该是 span.hlt 内的 span.hlt。你的逻辑真的很棒
    猜你喜欢
    • 2021-02-14
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多