Disons que j'ai un DIV contenant du texte, comme ceci:

<div>
Hello world

test

Hello world

test 2

Hello world
</div>

Ma fonction pour obtenir le mot lors de la sélection du texte est:

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

Disons que je sélectionne le milieu "Hello world", qui est la deuxième occurrence. Comment obtenir l'occurrence, qui dans ce cas serait de 2?

0
Gregory R. 27 août 2020 à 20:20

3 réponses

Meilleure réponse

J'ai la solution:

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);
0
Gregory R. 28 août 2020 à 05:10

Le concept consiste à obtenir l'index de la chaîne sélectionnée, puis à calculer l'index d'occurrence. 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();
    }
}

Cela a beaucoup aidé https://bytes.com/topic/javascript/ answers / 153164-return-selectionstart-div

0
Zahid Hasan Pranto 27 août 2020 à 20:30

Vous pouvez essayer le code suivant.

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>

Si vous voulez ignorer, entrez aussi, alors vous code suivant

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>

Si vous voulez savoir quel mot vous avez sélectionné, utilisez cet exemple

Exemple 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> 

Lien Codepen

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

1
Sourabh Somani 28 août 2020 à 19:14