Programmatically selecting partial text in an input field

How can I programmatically select a specific range of text in an HTML input field? (I don’t want to select the entire field, just a subset)

Also, how can I determine the currently selected range in a field?

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

Here’s how to select a portion of a text box (range select) and get the selected text:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title> Test </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript">
  window.onload = function() {
    var message = document.getElementById('message');
    // Select a portion of text
    createSelection(message, 0, 5);
    // get the selected portion of text
    var selectedText = message.value.substring(message.selectionStart, message.selectionEnd);
    alert(selectedText);
  };

  function createSelection(field, start, end) {
    if( field.createTextRange ) {
      var selRange = field.createTextRange();
      selRange.collapse(true);
      selRange.moveStart('character', start);
      selRange.moveEnd('character', end);
      selRange.select();
      field.focus();
    } else if( field.setSelectionRange ) {
      field.focus();
      field.setSelectionRange(start, end);
    } else if( typeof field.selectionStart != 'undefined' ) {
      field.selectionStart = start;
      field.selectionEnd = end;
      field.focus();
    }
  }
</script>
</head>
<body>
<input type="text" name="message" id="message" value="Hello World" />
</body>
</html>

Demo

Method 2

Small correction. It seems that IE moveEnd() method moves incrementally so selRange.moveEnd('character', end) should be replaced with selRange.moveEnd('character', end-start):

function createSelection(field, start, end) {
    if( field.createTextRange ) {
        var selRange = field.createTextRange();
        selRange.collapse(true);
        selRange.moveStart('character', start);
        selRange.moveEnd('character', end-start);
        selRange.select();
    } else if( field.setSelectionRange ) {
        field.setSelectionRange(start, end);
    } else if( field.selectionStart ) {
        field.selectionStart = start;
        field.selectionEnd = end;
    }
    field.focus();
}

Method 3

Thank you! I wanna share my function now, it’s used in Ajaxel CMS along with Instant messenger

,wrapText:function(o, ot, ct) {
    var s = o[0].selectionStart; 
    var e = o[0].selectionEnd;
    o.val(o.val().substring(0, s)+ot+o.val().substring(s,e)+ct+o.val().substring(e, o.val().length)); 
    if (o[0].createTextRange){
        var sr = o[0].createTextRange(); 
        sr.collapse(true); 
        sr.moveStart('character', s); 
        sr.moveEnd('character',e-s+ot.length+ct.length); 
        sr.select();
    }
    else if(o[0].setSelectionRange){ 
        o[0].setSelectionRange(s,e+ot.length+ct.length); 
    }
    else if(o[0].selectionStart){ 
        o[0].selectionStart=s; 
        o[0].selectionEnd=e+ot.length+ct.length; 
    }
}


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x