Obtenez le texte en surbrillance / sélectionné

351

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

Dan
la source
2
Voici une solution de travail dipaksblogonline.blogspot.in/2014/11/…
Dipak
Le javascript simple a fonctionné pour moi. document.getSelection (). anchorNode.data.substr (document.getSelection (). anchorOffset, document.getSelection (). focusOffset-document.getSelection (). anchorOffset)
Rohit Verma
@RohitVerma: Cela ne fonctionnera que dans le cas simple d'une sélection contenue dans un seul nœud de texte, ce qui n'est en aucun cas garanti.
Tim Down
@Dipak Comment reproduisez-vous la fonctionnalité de partage social du blog que vous référencez dans votre article? Au lieu de simplement renvoyer la chaîne sélectionnée, j'essaie de remplir cette variable dans un lien Twitter.

Réponses:

481

Obtenir le texte que l'utilisateur a sélectionné est relativement simple. Il n'y a aucun avantage à gagner en impliquant jQuery puisque vous n'avez besoin de rien d'autre que les objets windowet 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 vous êtes intéressé par une implémentation qui traitera également des sélections <textarea>et des <input>éléments textuels , vous pouvez utiliser ce qui suit. Comme c'est maintenant 2016, j'omet le code requis pour la prise en charge IE <= 8, mais j'ai publié des trucs pour cela à de nombreux 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>

Tim Down
la source
9
A quoi sert la fourchette else if {}? de quoi parle "Control"?
Dan
29
@Dan: Désolé, j'ai raté cette question (ne pense pas que SO m'ait alerté). La deuxième branche est pour IE <= 8 (IE 9 implémente window.getSelection()). La document.selection.typevérification teste que la sélection est une sélection de texte plutôt qu'une sélection de contrôle. Dans IE, une sélection de contrôle est une sélection à l'intérieur d'un élément modifiable contenant un ou plusieurs éléments (tels que des images et des contrôles de formulaire) avec des contours et des poignées de redimensionnement. Si vous faites appel .createRange()à une telle sélection, vous obtenez un ControlRangeplutôt qu'un TextRange, et les ControlRanges n'ont aucune textpropriété.
Tim Down du
2
@TimDown Il est très mince de dire "jQuery n'a pas X", car bien sûr, avec le bon plugin, il peut faire tout ce que vous pouvez faire dans le navigateur avec javascript. Dans ce cas, nous avons jquery.selection ( madapaja.github.io/jquery.selection ). Il est tout aussi faux de dire "ni ne devrait". Je suis arrivé ici parce que je cherchais exactement cela. J'ai un cas d'utilisation et jQuery est la bonne solution.
Auspex
8
@Auspex: Je vois en quelque sorte votre point mais je ne suis pas d'accord. Un plugin jQuery est une bibliothèque qui dépend de jQuery; ce n'est pas lui-même jQuery. Dans le cas de la gestion de la sélection, jQuery lui-même ne fournit précisément rien (ce qui devrait être parce que la gestion de la sélection n'est pas à l'usage de jQuery), donc toute solution qui utilise jQuery l'utilise accidentellement.
Tim Down
1
@ Dennis98: Je ne suis pas agacé ou offensé à distance :) La vérification des types d'entrée est parce que vous obtenez des avertissements dans la console dans Chrome si vous essayez d'accéder selectionStartou selectionEnddans un <input>type d'élément (tel que "nombre") qui ne fonctionne pas supportez-le (voir jsfiddle.net/6zoposby/2 , par exemple). J'ai laissé la vérification de l'existence de selectionStartafin que le code ne se casse pas dans IE <= 8. J'avoue que la vérification activeElementest probablement exagérée maintenant. J'utilise sliceparce qu'il est plus puissant (bien que ce ne soit pas utile ici) et légèrement plus court à taper que substring.
Tim Down
111

Obtenez le texte en surbrillance de cette façon:

window.getSelection().toString()

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

document.selection.createRange().htmlText
ParPar
la source
2
Pour IE> = 10, «le document.selection support a été supprimé dans IE10 et remplacé par window.getSelection ». Source: connect.microsoft.com/IE/feedback/details/795325/…
user2314737
Cela échouera dans plusieurs conditions dans divers navigateurs (par exemple Firefox).
Makyen
11

Cette solution fonctionne si vous utilisez Chrome (ne peut pas vérifier d'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)
Andrew Kennedy
la source
0

Utilisez window.getSelection().toString().

Vous pouvez en savoir plus sur developer.mozilla.org

Ebuka
la source