Wie erhalte ich die ausgewählte Textposition aus dem Textbereich in JavaScript?

20

Ich möchte die ausgewählte Textposition mit Javascript erhalten. Zum Beispiel habe
ich einen einfachen Textbereich.

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

In meinem Textbereich habe ich einige Texte wie:

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

Wenn ich aus dieser Zeichenfolge im Textbereich "Gute Person werden" auswähle,
wie kann ich dann die ausgewählte Text- / Zeichenfolgenposition in Javascript ermitteln?


Hier beginnt das ausgewählte Zeichenfolgenzeichen bei 29 und endet bei 49. Die Startposition ist also 29 und die Endposition ist 49

Md. Tahazzot
quelle
1
Mit Position meinen Sie, wie lautet der Index des Zeichens "b" von "werden" in der Zeichenfolge?
Palas
Ich habe das Gefühl, dass die Frage nur nach HTMLInputElement.selectionStart und selectionEnd fragt, während die Antworten hauptsächlich über das Auswahlereignis sprechen. Es macht jedoch keinen Sinn, eine Antwort zu schreiben, die in allen anderen Antworten enthalten ist.
JollyJoker

Antworten:

24

Dies funktioniert für die Textauswahl mit Maus und Tastatur für alle Textbereichselemente auf der Seite. Stellen Sie sicher, dass Sie entweder den Selektor ändern und dort genauer sein und die Kommentare lesen, wenn Sie keine Tastaturauswahl wünschen / benötigen.

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
quelle
2
Ziemlich ordentlich. +1
Saharsh
2
Dies wird nicht ausgelöst, wenn Sie mit der Tastatur und nicht mit der Maus auswählen.
neugierigdannii
1
@curiousdannii Ich habe die Antwort aktualisiert, jetzt funktioniert es auch mit der Tastaturauswahl
caramba
5

Ich würde onselect event nutzen, um das gleiche zu bekommen.

<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>
Traumweber
quelle
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
quelle
1

Die Antwort von Caramba hat ziemlich gut funktioniert, aber ich hatte das Problem, dass das Ereignis nicht ausgelöst wurde , wenn Sie einen Text ausgewählt und die Maus außerhalb des Textbereichs losgelassen haben .

Um dies zu lösen, habe ich das ursprüngliche Ereignis in geändert. mousedownDieses Ereignis registriert ein mouseupEreignis im Dokument, um sicherzustellen, dass es ausgelöst wird, nachdem der Cursor losgelassen wurde. Das mouseupEreignis entfernt sich dann selbst, nachdem es ausgelöst wurde.

Dies kann durch Hinzufügen der onceOption erreicht werden, addEventListenerwird aber in IE11 leider nicht unterstützt, weshalb ich die Lösung im Snippet verwendet habe.

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
quelle
Mir gefällt, wie Sie das umgesetzt haben 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
quelle
Können Sie bitte eine kleine Erklärung zu Ihrer Code-Funktion hinzufügen?
Rachel McGuigan