Comment obtenir la position du texte sélectionné à partir de la zone de texte en JavaScript?

20

Je veux obtenir la position du texte sélectionnée en utilisant javascript. Par exemple,
j'ai une zone de texte simple.

#input-text {
  resize: none;
  width: 50%;
  height: 50px;
  margin: 1rem auto;
}
<textarea id="input-text">I am a student and I want to become a good person</textarea>

Dans ma zone de texte, j'ai un texte tel que:

"I am a student and I want to become a good person"

Dans cette chaîne, si je sélectionne "devenir une bonne personne" dans la zone de texte,
alors comment puis-je obtenir la position du texte / de la chaîne sélectionnée en javascript?


Ici, le caractère de chaîne sélectionné commence à 29 et se termine à 49. Ainsi, la position de début est 29 et la position de fin est 49

Md. Tahazzot
la source
1
Par position, vous voulez dire quel est l'indice du caractère "b" de "devenir" dans la chaîne?
palasan
J'ai l'impression que la question demande simplement HTMLInputElement.selectionStart et selectionEnd tandis que les réponses parlent principalement de l'événement de sélection. Inutile d'écrire une réponse incluse dans toutes les autres réponses.
JollyJoker

Réponses:

24

Cela fonctionnera pour la sélection de texte avec la souris et le clavier pour tous les éléments de zone de texte sur la page. Assurez-vous de changer le sélecteur et d'être plus précis là-bas et de lire les commentaires si vous ne voulez pas / n'avez pas besoin d'une sélection de clavier.

var mySelection = function (element) {
    let startPos = element.selectionStart;
    let endPos = element.selectionEnd;
    let selectedText = element.value.substring(startPos, endPos);

    if(selectedText.length <= 0) {
      return; // stop here if selection length is <= 0
    }
    
    // log the selection
    console.log("startPos: " + startPos, " | endPos: " + endPos );
    console.log("selectedText: " +  selectedText);

  };

var textAreaElements = document.querySelectorAll('textarea');
[...textAreaElements].forEach(function(element) {
    // register "mouseup" event for the mouse
    element.addEventListener('mouseup', function(){
        mySelection(element)
    });
    
    // register "keyup" event for the keyboard
    element.addEventListener('keyup', function( event ) {
        // assuming we need CTRL, SHIFT or CMD key to select text
        // only listen for those keyup events
        if(event.keyCode == 16 || event.keyCode == 17 || event.metaKey) {
            mySelection(element)
        }
    });
});
textarea {
   resize: none; 
   width: 50%;
   height: 50px; 
   margin: 1rem auto;
}
<textarea>I am a student and I want to become a good person</textarea>

caramba
la source
2
Génial. +1
Saharsh
2
Cela ne se déclenche pas si vous choisissez d'utiliser le clavier plutôt que la souris.
curiousdannii
1
@curiousdannii J'ai mis à jour la réponse, maintenant cela fonctionne aussi avec la sélection du clavier
caramba
5

Je voudrais utiliser l' événement onselect pour obtenir la même chose.

<textarea id="input-text" onselect="myFunction(event)">I am a student and I want to become a good person</textarea>


<script>
    function myFunction(event) {
      const start  = event.currentTarget.selectionStart;
      const end= event.currentTarget.selectionEnd;
    }
</script>
Dreamweaver
la source
1
    var idoftextarea='answer';
    function getSelectedText(idoftextarea){
        var textArea = document.getElementById(idoftextarea);
        var text =textArea.value;
        var indexStart=textArea.selectionStart;
        var indexEnd=textArea.selectionEnd;
        alert(text.substring(indexStart, indexEnd));

    }


    getSelectedText(idoftextarea);


Nourhan Ahmed
la source
1

La réponse de Caramba a très bien fonctionné, mais j'ai eu le problème que si vous sélectionnez du texte et relâchez la souris en dehors de la zone de texte, l'événement ne se déclenche pas.

Pour résoudre ce problème, j'ai modifié l'événement initial en mousedown, cet événement enregistre un mouseupévénement sur le document pour s'assurer qu'il se déclenche après la libération du curseur. L' mouseupévénement se supprime ensuite après son déclenchement.

Cela peut être réalisé en ajoutant l' onceoption à addEventListener, mais n'est malheureusement pas pris en charge dans IE11, c'est pourquoi j'ai utilisé la solution dans l'extrait de code.

var mySelection = function (element) {
    let startPos = element.selectionStart;
    let endPos = element.selectionEnd;
    let selectedText = element.value.substring(startPos, endPos);

    if(selectedText.length <= 0) {
      return; // stop here if selection length is <= 0
    }
    
    // log the selection
    console.log("startPos: " + startPos, " | endPos: " + endPos );
    console.log("selectedText: " +  selectedText);
};

function addSelfDestructiveEventListener (element, eventType, callback) {
    let handler = () => {
        callback();
        element.removeEventListener(eventType, handler);
    };
    element.addEventListener(eventType, handler);
};

var textAreaElements = document.querySelectorAll('textarea');
[...textAreaElements].forEach(function(element) {
    // register "mouseup" event for those
    element.addEventListener('mousedown', function(){
      // This will only run the event once and then remove itself
      addSelfDestructiveEventListener(document, 'mouseup', function() {
        mySelection(element)
      })
    });
    
    // register "keyup" event for the keyboard
    element.addEventListener('keyup', function( event ) {
        // assuming we need CTRL, SHIFT or CMD key to select text
        // only listen for those keyup events
        if(event.keyCode == 16 || event.keyCode == 17 || event.metaKey) {
            mySelection(element)
        }
    });
});
textarea {
   resize: none; 
   width: 50%;
   height: 50px; 
   margin: 1rem auto;
}
<textarea>I am a student and I want to become a good person</textarea>

Hiws
la source
J'aime la façon dont vous avez implémenté le addSelfDestructiveEventListener!
caramba
0
var mySelection = function (element) {
let startPos = element.selectionStart;
let endPos = element.selectionEnd;
let selectedText = element.value.substring(startPos, endPos);

if(selectedText.length <= 0) {
  return; // stop here if selection length is <= 0
}

// log the selection
console.log("startPos: " + startPos, " | endPos: " + endPos );
console.log("selectedText: " +  selectedText); };var textAreaElements = document.querySelectorAll('textarea'); 
[...textAreaElements].forEach(function(element) {
// register "mouseup" event for the mouse
element.addEventListener('mouseup', function(){
    mySelection(element)
});
// register "keyup" event for the keyboard
element.addEventListener('keyup', function( event ) {
    // assuming we need CTRL, SHIFT or CMD key to select text
    // only listen for those keyup events
    if(event.keyCode == 16 || event.keyCode == 17 || event.metaKey) {
        mySelection(element)
    }
});});
Yasser Abdel-Maksoud
la source
Pouvez-vous s'il vous plaît ajouter une petite explication à ce que fait votre code?
Rachel McGuigan