web-dev-qa-db-fra.com

Obtenir le texte surligné / sélectionné

Est-il possible d’obtenir le texte surligné dans un paragraphe d’un site Web, par exemple en utilisant jQuery?

320
Dan

Obtenir le texte sélectionné par l'utilisateur est relativement simple. Faire appel à jQuery ne présente aucun avantage, car vous n'avez besoin de rien d'autre que les objets window et document.

function getSelectionText() {
    var text = "";
    if (window.getSelection) {
        text = window.getSelection().toString();
    } else if (document.selection && document.selection.type != "Control") {
        text = document.selection.createRange().text;
    }
    return text;
}

Si une implémentation qui traite également des sélections dans les éléments <textarea> et texty <input> vous intéresse, vous pouvez utiliser ce qui suit. Depuis 2016, le code requis pour le support de IE <= 8 est omis, mais j'ai posté des articles à ce sujet à plusieurs endroits sur SO.

function getSelectionText() {
    var text = "";
    var activeEl = document.activeElement;
    var activeElTagName = activeEl ? activeEl.tagName.toLowerCase() : null;
    if (
      (activeElTagName == "textarea") || (activeElTagName == "input" &&
      /^(?:text|search|password|tel|url)$/i.test(activeEl.type)) &&
      (typeof activeEl.selectionStart == "number")
    ) {
        text = activeEl.value.slice(activeEl.selectionStart, activeEl.selectionEnd);
    } else if (window.getSelection) {
        text = window.getSelection().toString();
    }
    return text;
}

document.onmouseup = document.onkeyup = document.onselectionchange = function() {
  document.getElementById("sel").value = getSelectionText();
};
Selection:
<br>
<textarea id="sel" rows="3" cols="50"></textarea>
<p>Please select some text.</p>
<input value="Some text in a text input">
<br>
<input type="search" value="Some text in a search input">
<br>
<input type="tel" value="4872349749823">
<br>
<textarea>Some text in a textarea</textarea>
447
Tim Down

Obtenez le texte en surbrillance de cette façon:

window.getSelection().toString()

et bien sûr un traitement spécial pour ie:

document.selection.createRange().htmlText
101
ParPar

Cette solution fonctionne si vous utilisez chrome (impossible de vérifier les autres navigateurs) et si le texte se trouve dans le même élément DOM:

window.getSelection().anchorNode.textContent.substring(
  window.getSelection().extentOffset, 
  window.getSelection().anchorOffset)
10
Andrew Kennedy