Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Javascript中获取所选单词的出现率_Javascript_Html_Range_Find Occurrences_Getselection - Fatal编程技术网

如何在Javascript中获取所选单词的出现率

如何在Javascript中获取所选单词的出现率,javascript,html,range,find-occurrences,getselection,Javascript,Html,Range,Find Occurrences,Getselection,假设我有一个DIV包含文本,如下所示: <div> Hello world test Hello world test 2 Hello world </div> 假设我选择中间的“Hello world”,这是第二次出现。如何获取引用,在本例中为2?您可以尝试以下代码 document.addEventListener('selectionchange',(evt)=>{ var selection=document.getSelection(); var s

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

<div>
Hello world

test

Hello world

test 2

Hello world
</div>

假设我选择中间的“Hello world”,这是第二次出现。如何获取引用,在本例中为2?

您可以尝试以下代码

document.addEventListener('selectionchange',(evt)=>{
var selection=document.getSelection();
var selectedText=selection.getRangeAt(0.toString();
var divText=document.getElementById(“mydiv”).innerText;
var totaloccurrence=(divText.match(新的RegExp(selectedText,“g”)))| |[])长度;
console.log(总发生率)
});

你好,世界
测试
你好,世界
测试2
你好,世界

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

我有一个解决方案:

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);

这将获取发生的总次数。我正在查找所选事件的发生率。例如,如果我选择第一个“Hello world”,我希望它返回1。如果是第二个“你好世界”,那么是第二个;等等谢谢,好的,明白了。让我改变一下我已经做了什么,你能检查一下最后一个例子吗@GregoryR。好的,我试过了。大部分时间都在工作,但我遇到了一些问题。当我尝试“test”一词时,有时它返回0,有时我得到一个错误:Uncaught IndexSizeError:未能对“Selection”执行“getRangeAt”:0不是有效的索引。在pen.js:-15我在
selection
中只做了两件事,我在
regex
中得到了第二个偏移量,我正在保留索引。我尝试了这件事,但出现了问题。它总是返回1,并且对于由
分隔的多行文本无效。我发布了一个效果很好的解决方案。非常感谢。
<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();
    }
}
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);