JavaScript'te textarea'dan seçilen metin konumunu nasıl alabilirim?


20

Javascript kullanarak seçilen metin konumunu almak istiyorum. Örneğin,
basit bir metin alanım var.

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

Metin alanımda bazı metinler var:

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

Bu dizeden, textarea'dan "iyi bir kişi ol" seçeneğini seçersem,
javascript'te seçilen metin / dize konumunu nasıl alabilirim?


Burada seçilen dize karakteri 29'dan başlar ve 49'da biter. Böylece başlangıç ​​konumu 29 ve bitiş konumu 49'dur.


1
Pozisyona göre dizede "haline gelme" nin "b" karakterinin dizini nedir?
palaѕн

Soru sadece HTMLInputElement.selectionStart ve selectionEnd için soruyor gibi hissediyorum cevaplar çoğunlukla seçim olayı hakkında konuşurken. Bununla birlikte, diğer tüm cevaplara dahil olan bir cevap yazmanın bir anlamı yoktur.
JollyJoker

Yanıtlar:


24

Bu, sayfadaki tüm metin alanları için fare ve klavyeyle metin seçimi için çalışır. Seçiciyi değiştirdiğinizden ve orada daha spesifik olduğunuzdan ve klavye seçimini istemiyorsanız / buna ihtiyacınız yoksa yorumları okuduğunuzdan emin olun.

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>


2
Oldukça temiz. +1
Saharsh

2
Fare yerine klavyeyi kullanarak seçim yaparsanız bu çalışmaz.
curiousdannii

1
@curiousdannii Cevabı güncelledim, şimdi klavye seçimi ile de çalışıyor
caramba

5

... 'dan faydalanırım onSelect aynı olsun olay.

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

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);


1

Caramba cevabı oldukça iyi çalıştı, ancak bir metin seçtiyseniz ve fareyi dışarıda bıraktıysanız textarea'nın bıraktıysanız, olayın ateş etmediği .

Bunu çözmek için ilk olayı değiştirdim mousedown, bu olay birmouseup imleç bırakıldıktan sonra tetiklenmesini sağlamak için belgeye olay . mouseupO harekete sonra olay daha sonra kendini kaldırır.

Bu onceseçenek ekleyerek elde edilebilir addEventListener, ancak ne yazık ki IE11'de desteklenmiyor, bu yüzden snippet'te çözümü kullandım.

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>


Nasıl uyguladığınızı seviyorum 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)
    }
});});

Kodladığınız işe biraz açıklama ekleyebilir misiniz?
Rachel McGuigan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.