【问题标题】:How to get the occurrence of the selected word in Javascript如何在Javascript中获取所选单词的出现
【发布时间】:2020-08-27 17:20:26
【问题描述】:

假设我有一个包含文本的 DIV,如下所示:

<div>
Hello world

test

Hello world

test 2

Hello world
</div>

我在选择文本时获取单词的功能是:

function getWord() {
    var txt = document.getSelection();
    var txtRange = txt.getRangeAt(0);
    return txtRange;
}

假设我选择了中间的“Hello world”,这是第二次出现。我如何获得出现次数,在这种情况下为 2?

【问题讨论】:

    标签: javascript html range find-occurrences getselection


    【解决方案1】:

    你可以试试下面的代码。

    document.addEventListener('selectionchange', (evt) => {
      var selection=document.getSelection();
      var selectedText = selection.getRangeAt(0).toString();
      var divText=document.getElementById("mydiv").innerText;
      var totalOccurance=(divText.match(new RegExp(selectedText, "g")) || []).length;
      console.log(totalOccurance)
    });
    <div id="mydiv">
    Hello world
    
    test
    
    Hello world
    
    test 2
    
    Hello world
    </div>

    如果你也想忽略输入,那么你遵循代码

    document.addEventListener('selectionchange', (evt) => {
      var selection=document.getSelection();
      var selectedText = selection.getRangeAt(0).toString().replace(/\n/g, " ");
      var divText=document.getElementById("mydiv").innerText.replace(/\n/g, " ");
      var totalOccurance=(divText.match(new RegExp(selectedText, "g")) || []).length;
      console.log(totalOccurance)
    });
    <div id="mydiv">
    Hello world
    
    test
    
    Hello world
    
    test 2
    
    Hello world
    </div>

    如果您想找出您选择了哪个单词,请使用此示例

    示例 3

    document.addEventListener('selectionchange', (evt) => {
      var selection=document.getSelection();
      if(selection){
      var selectedText = selection.getRangeAt(0).toString().replace(/\n/g," ").replace(/ +(?= )/g,'');
      var divText=document.getElementById("mydiv").innerText.replace(/\n/g," ").replace(/ +(?= )/g,'');
      if(selectedText){
    var reg=new RegExp(selectedText, "g");
    var array1 = reg.exec(divText)
    var index=[];
    while (array1 !== null) {
      index.push(array1.index);
      array1 = reg.exec(divText)
    }
    var position=selection.anchorOffset-1;
    var p=index.filter(x=>x<=position)
    console.log(p.length);
       }
      }
    });
       
    <div id="mydiv">
    Hello world
    
    test
    
    Hello world
    
    test 2 
    
    Hello world
    </div> 

    Codepen 链接

    https://codepen.io/hackersourabh/pen/dyMWKVm?editors=1011

    【讨论】:

    • 获取总出现次数。我正在寻找选择的出现。例如,如果我选择第一个“Hello world”,我希望它返回 1。如果第二个“Hello world”,则返回 2;等等。谢谢。
    • 好的,知道了。让我改一下
    • 我已经完成了,请检查最后一个示例@GregoryR。
    • 好的,我试过了。大部分时间都可以工作,但我遇到了一些问题。当我尝试使用“test”这个词时,有时它会返回 0,有时会出现错误:未捕获的 IndexSizeError:无法在“Selection”上执行“getRangeAt”:0 不是有效索引。在 pen.js:-15
    • 我从selection 做的只有两件事我从regex 得到offset 秒我保持index
    【解决方案2】:

    概念是获取所选字符串的索引,然后计算出现索引。 Fiddle Link

    <div id="mydiv" onmouseup="alert(getOccuranceIndex(this));"
    onmousedown="prepare(this)>
    Hello world
    
    test
    
    Hello world
    
    test 2
    
    Hello world
    </div>
    
    
    var getOccuranceIndex= (function() {
    
        function getSel() {
            var sel = null;
            if (
                typeof document.selection != "undefined" &&
                document.selection &&
                document.selection.type == "Text"
            ) {
                sel = document.selection;
            } else if (
                window.getSelection &&
                window.getSelection().rangeCount > 0
            ) {
                sel = window.getSelection();
            }
            return sel;
        }
    
        function createRangeFromSel(sel) {
            var rng = null;
            if (sel.createRange) {
                rng = sel.createRange();
            } else if (sel.getRangeAt) {
                rng = sel.getRangeAt(0);
                if (rng.toString() == "") rng = null;
            }
            return rng;
        }
    
        return function(el) {
            var sel = getSel(),
                rng, r2, i = -1;
            if (sel) {
                rng = createRangeFromSel(sel);
                if (rng) {
    
                    if (rng.parentElement) {
                        if (rng.parentElement() == el) {
                            r2 = document.body.createTextRange();
                            r2.moveToElementText(el);
                            r2.collapse(true);
                            r2.setEndPoint("EndToStart", rng);
                            i = r2.text.length;
                        }
                    } else {
                        if (
                            rng.startContainer &&
                            rng.endContainer &&
                            rng.startContainer == rng.endContainer &&
                            rng.startContainer == rng.commonAncestorContainer &&
                            rng.commonAncestorContainer.parentNode == el
                        ) {    
                            i = rng.startOffset;
                        }
                    }
                }
            }
                    if(i<1) return 1;
            var actualString = el.innerHTML;
                    var target = getSel().toString();
    console.log(target);
                var reg = new RegExp(target, 'gi');
                    var resArr = actualString.substring(0,i-1).match(reg);
                if(resArr==null) return 1; //this is the first occurance;
                return resArr.length+1;
        };
    
    })();
    
    function prepare(el) {
        if (el.normalize) {
            el.normalize();
        }
    }
    

    这很有帮助https://bytes.com/topic/javascript/answers/153164-return-selectionstart-div

    【讨论】:

    • 我试过这个但遇到了问题。它总是返回 1,并且不适用于由
      分隔的多行文本。我已经发布了一个运行良好的解决方案。谢谢。
    【解决方案3】:

    我有办法:

    function getWord() {
        var txt = document.getSelection();
        var txtRange = txt.getRangeAt(0);
        return txtRange;
    }
    
    var t = getWord();
    var text = document.getElementsByClassName("content")[0];
    var precedingRange = document.createRange();
        precedingRange.setStartBefore(text.firstChild);
        precedingRange.setEnd(t.startContainer, t.startOffset);
    
    var textPrecedingSelection = precedingRange.toString();
    var count = (textPrecedingSelection.match(new RegExp(t.toString().trim(), 'gi')) || []).length + 1;
    
    alert("Word occurrence: " + count);
    

    【讨论】:

      猜你喜欢
      • 2013-07-15
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 2012-03-02
      相关资源
      最近更新 更多