2009-03-14 26 views

Odpowiedz

51

Oto jak wybrać porcję pola tekstowego (zakres wyboru) i uzyskać zaznaczony tekst:

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

+1

Bardzo dziękuję za ten !!! –

+4

** Są tu 2 błędy. ** 1. musisz ustawić ostrość ** przed ** wywołaniem 'setSelectionRange' lub nic nie zostanie wybrane. 2. trzecie zdanie if powinno być "else if (typeof field.selectionStart! = 'Undefined')' ponieważ 'field.selectionStart' może oszacować na 0, co jest falsy – mkoryak

+2

[link do exmaple] (http: // jsbin. com/anadox/3/edit) – vsync

13

małą korektę. Wydaje się, że IE moveEnd() metoda porusza się stopniowo tak selRange.moveEnd('character', end) należy zastąpić 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(); 
} 
3

Dziękujemy! Chcę teraz podzielić się moją funkcją, jest ona używana w Ajaxel CMS wraz z komunikatorem internetowym

,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; 
    } 
} 
Powiązane problemy