web-dev-qa-db-ja.com

javascriptを使用してテキストボックスコントロールから選択したテキストを取得する方法

テキストボックスとリンクボタンがあります。テキストを書いてからそれらのいくつかを選択してリンクボタンをクリックすると、テキストボックスから選択したテキストがメッセージボックスとともに表示されます。

どうすればできますか?


下のテキストボックスの送信ボタンをクリックすると、メッセージボックスにLorem ipsumが表示されます。エリアで「Lorem ipsum」が選択されているため。


ページからテキストを選択して送信ボタンをクリックすると機能しますが、テキストボックスにテキストを書き込んで作成しても機能しません。別のスペースをクリックすると、テキストボックスの選択がキャンセルされるためです。

問題は、テキストボックスからテキストを選択し、他のコントロールまたはスペースをクリックすると、選択されているテキストがまだ選択されている必要があるということです。

どうやってやるの?

37
mavera

OK、ここに私が持っているコードがあります:

function ShowSelection()
{
  var textComponent = document.getElementById('Editor');
  var selectedText;

  if (textComponent.selectionStart !== undefined)
  {// Standards Compliant Version
    var startPos = textComponent.selectionStart;
    var endPos = textComponent.selectionEnd;
    selectedText = textComponent.value.substring(startPos, endPos);
  }
  else if (document.selection !== undefined)
  {// IE Version
    textComponent.focus();
    var sel = document.selection.createRange();
    selectedText = sel.text;
  }

  alert("You selected: " + selectedText);
}

問題、私がIEに与えるコードは多くのサイトで与えられていますが、現在のシステムのIE6のコピーで動作させることはできません。おそらくそれはあなたのために動作するでしょう。それを与える。
あなたが探しているのは、おそらく.focus()呼び出しです。これはtextareaにフォーカスを戻し、選択が再びアクティブになるようにします。

[更新] onKeyDownイベントで正しい結果(選択内容)を得ました:

document.onkeydown = function (e) { ShowSelection(); }

したがって、コードは正しいです。繰り返しになりますが、問題はボタンをクリックして選択を取得することです...私は検索を続けます。

[更新] liタグで描かれたボタンで成功しませんでした。クリックすると、IEは前の選択を解除します。上記のコードは単純なinputボタン、しかし...

39
PhiLho

これは、マウスアップでテキスト選択が行われるという事実に基づいた、はるかに簡単なソリューションです。そのため、イベントリスナーを追加します。

_document.querySelector('textarea').addEventListener('mouseup', function () {
  window.mySelection = this.value.substring(this.selectionStart, this.selectionEnd)
  // window.getSelection().toString();
});_
_<textarea>
  Select some text
</textarea>
<a href="#" onclick=alert(mySelection);>Click here to display the selected text</a>_

これはすべてのブラウザで機能します。

キーボードによる選択も処理する場合は、keyupの別のイベントリスナーを同じコードで追加します。

これがなかった場合 2001年に提出されたFirefoxのバグ (はい、14年前)、_window.mySelection_に割り当てられた値をwindow.getSelection().toString()に置き換えることができます。 IE9 +および最新のすべてのブラウザーで動作し、DOMの非テキスト領域部分で選択を取得します。

16
Dan Dascalescu
function disp() {
  var text = document.getElementById("text");
  var t = text.value.substr(text.selectionStart, text.selectionEnd - text.selectionStart);
  alert(t);
}
<TEXTAREA id="text">Hello, How are You?</TEXTAREA><BR>
<INPUT type="button" onclick="disp()" value="Select text and click here" />
4
prat3ik-patel

jQuery-textrange の大ファン

以下は、非常に小さな自己完結型の例です。 jquery-textrange.jsをダウンロードし、同じフォルダーにコピーします。

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>jquery-textrange</title>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script src="jquery-textrange.js"></script>

<script>
/* run on document load **/
$(document).ready(function() {
    /* run on any change of 'textarea' **/
    $('#textareaId').bind('updateInfo keyup mousedown mousemove mouseup', function() {
        /* The magic is on this line **/
        var range = $(this).textrange();
        /* Stuff into selectedId.  I wanted to store this is a input field so it can be submitted in a form. **/
        $('#selectedId').val(range.text);
    });
});
</script>
</head>
<body>

    The smallest example possible using 
    <a href="https://github.com/dwieeb/jquery-textrange">
       jquery-textrange
    </a><br/>
    <textarea id="textareaId" >Some random content.</textarea><br/>
    <input type="text"  id="selectedId"  ></input>

</body>
</html>
1
fishjd