当前位置: 首页 > 知识库问答 >
问题:

JS-surroundContents只在文本上保留高亮显示,约占高亮显示尝试的20%

仉明知
2023-03-14

我正在使用mouseup事件来触发一个函数,该函数突出显示文本,并用跨度包围突出显示的文本(堆栈溢出函数):

function highlightText(e) {

    var t = window.getSelection().toString();
    if (t) {
        $("#mySpan").remove();
        var range   = window.getSelection().getRangeAt(0);
            newNode = document.createElement("span");
        newNode.id  = 'mySpan';

        range.surroundContents(newNode);

    }
}

我遇到的主要问题是,只要包含surroundContents,文本只会在高亮显示尝试中高亮显示约20%(否则高亮显示会立即消失)。我尝试添加一个setTimeout,在1s内不调用surroundContent。我还尝试删除remove()语句,但仍然没有效果。

你知道为什么会这样吗?

共有2个答案

田权
2023-03-14

失败的可能原因是所选文本仅包含非文本节点的开头或结尾,而不是两者。

因此,如果运行该代码,只在下面选择这是Bo,它将失败(并抛出异常),因为它也没有捕获所选内容中的结束标记:

This is <em>bold</em>

因此,最终:

This is <em>bo

参考:https://developer.mozilla.org/en-US/docs/Web/API/Range/surroundContents

公孙鸿才
2023-03-14

Android上的Chromium也面临同样的问题。在某些特定情况下,range的调用。surroundContents(newNode)会导致页面重新加载等非常奇怪的行为。检查函数的文档后:

这种方法几乎等同于newNode。appendChild(range.extractContents());范围插入节点(newNode)。包围后,范围的边界点包括newNode。

所以显而易见的是应用另一种方法突出显示文本。我找到mark.js库,它完全符合我的要求,没有恼人的副作用。(这里有一个JSFiddle示例,展示了它是如何用来突出显示选择的)。不同之处在于库没有使用range.surroundContents(newNode)也没有newNode.appendChild,而是node.replaceChild

基于此,这里是我遇到的问题的解决方案,我认为它也适用于你的情况。

function surroundRangeWithSpan(range) {
    var span = document.createElement('span');

    // The text is within the same node (no other html elements inside of it)
    if (range.startContainer.isEqualNode(range.endContainer) && range.startContainer.childNodes.length == 0) {
      // Here you customise your <span> element
      customSurroundContents(range, span);
    } else {
      // Here you have to break the selection down
    }
    return span;
  }

  function customSurroundContents(range, span) {
    var node = range.commonAncestorContainer;
    var startNode = node.splitText(range.startOffset);
    var ret = startNode.splitText(range.toString().length);
    span.textContent = startNode.textContent;
    startNode.parentNode.replaceChild(span, startNode);
  }

然后你通过窗口。getSelection()。getRangeAt(0)到函数。

 类似资料:
  • 我想突出显示JavaFX中显示的部分文本。到目前为止,我正在使用对象中的对象。为了突出显示文本中的特定部分,我使用标记将文本切割成部分(objects),以突出显示或不突出显示以下代码。 不幸的是,背景高亮显示不起作用,我有奇怪的换行符,如图所示。文本不包含任何换行符。 (对图片质量表示抱歉,这是一个真实的截图:)) 感谢任何帮助。 解决方案正如@eckig所建议的,在HBox中使用多个标签是一个

  • 对于我使用的语法高亮Highlight.js自定义主题. 自动语言检测已关闭,因此您可能希望指定您使用的编程语言 ```rust fn main() { // Some code } ``` 与主题的其余部分一样,用于语法突出显示的css,可以使用您自己的文件覆盖. highlight.js 通常你不应该覆盖这个文件,除非你想使用更新的版本. highlight.css highlight

  • 在页面上有两个框 这两个框是一个数组的数据类似与 [ 这种格式的我去循环然后画的框 想要实现无论点击这两行哪行 这两行都高亮显示 用过根据id查找页面元素,但id只能返回第一个所以只能第一个高亮

  • 我目前的项目使用PHPStorm 8.0.3,但不幸的是它不支持JSX。在我的React组件(然后由Browserify编译)中,HTML用红色加下划线并被无效: 这只是一个小组件,但对于更大的组件来说,它肯定会变得非常烦人。代码格式化也不能按预期工作。 是否有(难以找到的)设置可以启用正确的语法突出显示? 如果没有这样的设置,是否可以下载相应的包? 如果根本没有支持,我如何扩展PHPStom(可

  • 本文向大家介绍jQuery实现高亮显示的方法,包括了jQuery实现高亮显示的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jQuery实现高亮显示的方法。分享给大家供大家参考。具体如下: 主要功能代码如下: 使用时设置on的css高亮部分样式即可。 希望本文所述对大家的jQuery程序设计有所帮助。

  • 我希望禁用高亮显示出现,但保留高亮显示匹配标记。当我设置cercepenceshighlight:false时,它停止高亮显示事件,但同时停止高亮显示开始和结束标记。