Как получить выделенный текст из управления текстовым полем с помощью javascript

У меня есть текстовое поле и кнопка ссылки. Когда я пишу какой-то текст, затем выберите некоторые из них, а затем нажмите кнопку ссылки, выделенный текст из текстового поля должен быть показан в виде сообщения.

Как я могу это сделать?


Когда я нажимаю кнопку отправки для текстового поля ниже, в окне сообщения должен отображаться Lorem ipsum. Потому что в области выбрано "Lorem ipsum".


Если я выберу любой текст со страницы и нажмите кнопку отправки, он будет работать, но если я напишу текст в текстовое поле и сделаю это, это не так. Потому что, когда я нажимаю на другое место, выбор текстового поля отменяется.

Теперь проблема заключается в том, что, когда я выбираю текст из текстового поля и выбираю любой другой элемент управления или пробел, текст, который выбран, должен быть выбран.

Как это сделать?

Ответ 1

ОК, вот код, который у меня есть:

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(), чтобы вернуть текстуре в фокус, чтобы выбор был повторно активирован.

[UPDATE] Я получил правильный результат (содержимое выделения) с событием onKeyDown:

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

Итак, код правильный. Опять же, проблема заключается в том, чтобы получить выделение при нажатии на кнопку... Я продолжаю поиск.

[UPDATE] Я не добился успеха при нажатии кнопки с тегом li, потому что, когда мы нажимаем на нее, IE отменяет выбор предыдущего выбора. Вышеупомянутый код работает с простой кнопкой input, хотя...

Ответ 2

Здесь гораздо более простое решение, основанное на том, что выбор текста происходит в mouseup, поэтому мы добавляем к нему прослушиватель событий:

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>

Ответ 3

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

Ответ 5

Для Opera, Firefox и Safari вы можете использовать следующую функцию:

function getTextFieldSelection(textField) {
    return textField.value.substring(textField.selectionStart, textField.selectionEnd);
}

Затем вы просто передаете ссылку на элемент текстового поля (например, текстовое поле или элемент ввода) в функцию:

alert(getTextFieldSelection(document.getElementsByTagName("textarea")[0]));

Или, если вы хотите <textarea> и <input> для собственной функции getSelection():

HTMLTextAreaElement.prototype.getSelection = HTMLInputElement.prototype.getSelection = function() {
    var ss = this.selectionStart;
    var se = this.selectionEnd;
    if (typeof ss === "number" && typeof se === "number") {
        return this.value.substring(this.selectionStart, this.selectionEnd);
    }
    return "";
};

Затем вы просто выполните:

alert(document.getElementsByTagName("textarea")[0].getSelection());
alert(document.getElementsByTagName("input")[0].getSelection());

например.

Ответ 6

Большой вентилятор 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="#" onclick="location.href='https://github.com/dwieeb/jquery-textrange'; return false;">
       jquery-textrange
    </a><br/>
    <textarea id="textareaId" >Some random content.</textarea><br/>
    <input type="text"  id="selectedId"  ></input>

</body>
</html>