Bagaimana cara mendapatkan posisi teks yang dipilih dari textarea di JavaScript?

20

Saya ingin mendapatkan posisi teks yang dipilih menggunakan javascript. Sebagai contoh,
saya memiliki textarea sederhana.

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

Di textarea saya, saya punya beberapa teks seperti:

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

Dari string ini, jika saya memilih "menjadi orang yang baik" dari textarea,
Lalu Bagaimana saya bisa mendapatkan posisi teks / string yang dipilih dalam javascript?


Di sini karakter string yang dipilih dimulai dari 29 dan berakhir di 49. Jadi posisi awal adalah 29 & posisi akhir adalah 49

Md. Tahazzot
sumber
1
Dengan posisi yang Anda maksud apa indeks karakter "b" dari "menjadi" dalam string?
palaѕн
Saya merasa pertanyaannya hanya menanyakan HTMLInputElement.selectionStart dan selectionEnd sementara jawabannya kebanyakan berbicara tentang acara seleksi. Tidak ada gunanya menulis jawaban yang termasuk dalam semua jawaban lainnya.
JollyJoker
1
Apakah ini menjawab pertanyaan Anda? Cara mendapatkan teks yang dipilih dari kontrol kotak teks dengan javascript
Matsemann

Jawaban:

24

Ini akan berfungsi untuk pemilihan teks dengan mouse dan keyboard untuk semua elemen textarea pada halaman. Pastikan untuk mengganti pemilih dan lebih spesifik di sana dan membaca komentar jika Anda tidak ingin / perlu pemilihan keyboard.

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
sumber
2
Cukup rapi. +1
Saharsh
2
Ini tidak menyala jika Anda memilih menggunakan keyboard daripada mouse.
curiousdannii
1
@curiousdannii Saya sudah memperbarui jawabannya, sekarang ini juga berfungsi dengan pemilihan keyboard
caramba
5

Saya akan menggunakan acara onselect untuk mendapatkan yang sama.

<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
sumber
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
sumber
1

Jawaban Caramba bekerja sangat baik, namun saya memiliki masalah jika Anda memilih beberapa teks dan melepaskan mouse di luar textarea, acara tersebut tidak menyala.

Untuk mengatasi ini saya mengubah acara awal mousedown, acara ini mendaftarkan mouseupacara pada dokumen untuk memastikan itu menyala setelah kursor dirilis. Itumouseup Acara kemudian menghapus dirinya sendiri setelah itu telah dipecat.

Ini dapat dicapai dengan menambahkan onceopsi addEventListener, tetapi sayangnya tidak didukung di IE11 yang mengapa saya menggunakan solusi dalam cuplikan.

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>

Hai
sumber
Saya suka bagaimana Anda menerapkan 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
sumber
Bisakah Anda menambahkan sedikit penjelasan pada kode Anda?
Rachel McGuigan