【问题标题】:Highlight text in javascript like Evernote Web Clipper在 javascript 中突出显示文本,例如 Evernote Web Clipper
【发布时间】:2014-11-25 18:56:46
【问题描述】:

我目前的解决方案是:

  1. 获取选中的html(包括文本和html标签),即:selText
  2. 高亮文本 = <span>selText</span>
  3. 在正文或文档(或鼠标拖入的元素)的innerHTML 中查找selText
  4. 替换为highlightText

但如果文档是:a a a a a a 并且用户选择了最后一个 a。我的函数将突出显示第一个或所有a

有什么建议吗?

谢谢。

【问题讨论】:

  • Check this,我想这会对你有所帮助。完全相同的要求。
  • 我认为您的链接是相同的要求。但不是具体的问题。该链接中的解决方案与我的解决方案相同,但我需要改进
  • 所以你可以根据你的要求修改/更新它。没有人会为你编码。
  • 我不明白你在说什么。我需要一个建议,而不是代码。

标签: javascript html highlight evernote


【解决方案1】:

我认为您的问题是重复的,无论如何我刚刚搜索了互联网并找到了这个article

下面是实现你所要求的最终代码

function highlightSelection()  {
  var selection;

  //Get the selected stuff
  if(window.getSelection) 
    selection = window.getSelection();
  else if(typeof document.selection!="undefined")
    selection = document.selection;

  //Get a the selected content, in a range object
  var range = selection.getRangeAt(0);

  //If the range spans some text, and inside a tag, set its css class.
  if(range && !selection.isCollapsed)
  {
    if(selection.anchorNode.parentNode == selection.focusNode.parentNode)
    {
      var span = document.createElement('span');
      span.className = 'highlight-green';
      range.surroundContents(span);
    }
  }
}

我还发现了这个库rangy,它是一个可用于选择文本但仅适用于 jquery 的助手,因此我更喜欢第一个 vanilla-js 解决方案。

var el = $("<span></span>");
el.text(rangy.getSelection().getRangeAt(0).toString());
rangy.getSelection().getRangeAt(0).deleteContents();
rangy.getSelection().getRangeAt(0).insertNode(el.get(0));
rangy.getSelection().getRangeAt(0).getSelection().setSingleRange(range);

关于范围和用户选择

您必须使用返回 Range 对象的Document.createRange 选择范围,然后才能使用Range.surroundContents(),您可以通过这种方式创建范围。

var range = document.createRange();
range.setStart(startNode, startOffset);
range.setEnd(endNode, endOffset);

在实践中,您可以关注this guide 以了解范围和选择技术。 最重要的一点都包含在这段代码中

var userSelection;
if (window.getSelection) {
    userSelection = window.getSelection();
}
else if (document.selection) { // should come last; Opera!
    userSelection = document.selection.createRange();
}

之后就可以使用了

userSelection.surroundContents()

【讨论】:

  • 是的,您的highlightSelection 函数与#textnode 一起使用。不幸的是,surroundContents 在我这样选择时不起作用:this is &lt;a&gt;a link&lt;/a&gt;。根据您的建议,现在我可以获得用户选择的#textnode 列表,但我不知道如何将其包装/包围成突出显示范围。安,非常感谢。
  • 我添加了更多信息以了解如何使用环绕内容,您必须先从 userSelection 创建一个 Range 对象,然后才能使用该方法。如果这解决了您的问题,请将答案标记为已解决。
  • 是的,我会的。我从您的回答中得到了这个想法:处理 range 对象,而不是提取的文本或 htmlText。谢谢
猜你喜欢
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
  • 2012-01-28
  • 2019-10-16
  • 2020-10-26
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
相关资源
最近更新 更多