2009-12-30 2 views
14

Я ищу способ набор выбор в текстовом поле в обозревателе Internet Explorer. В других браузерах, это работает просто отлично:Установить выбор текстового поля в Internet Explorer

textarea.selectionStart = start; 
textarea.selectionEnd = end; 

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

Дополнительные бонусные баллы за ссылку на соответствующую документацию о createRange и связанных с ней методах, MSDN не очень помогает.

+0

+1 - Я посмотрел на это. Я не могу вспомнить детали (извините), но она липкая. IE был очень бесполезным. Мне пришлось сделать какой-то компромисс в моем дизайне формы. – martinr

ответ

18

Это работает для меня:

<textarea id="lol"> 
noasdfkvbsdobfbgvobosdobfbgoasopdobfgbooaodfgh 
</textarea> 

<script> 
var range = document.getElementById('lol').createTextRange(); 
range.collapse(true); 
range.moveStart('character', 5); 
range.moveEnd('character', 10); 
range.select(); 
</script> 

Полезные ссылки:

moveStart() в точке М SDN: http://msdn.microsoft.com/en-us/library/ms536623%28VS.85%29.aspx

moveEnd() в MSDN: http://msdn.microsoft.com/en-us/library/ms536620%28VS.85%29.aspx

+3

Отлично, он действительно работает. 'moveEnd', видимо, перемещает выделение относительно начальной позиции, поэтому он ведет себя иначе, чем' .selectionEnd'. Отличные ссылки, спасибо! Надеюсь, что бонусные очки, которые я обещал, придут через других людей, чтобы выжить :) –

17

Попробуйте с

function select(e, start, end){ 
    e.focus(); 
    if(e.setSelectionRange) 
     e.setSelectionRange(start, end); 
    else if(e.createTextRange) { 
     e = e.createTextRange(); 
     e.collapse(true); 
     e.moveEnd('character', end); 
     e.moveStart('character', start); 
     e.select(); 
    } 
} 
select(document.getElementById('textarea_id'), 5, 10); 
+1

+1 для создания функции поддержки браузера и сначала переноса конца, чтобы арифметика не требовалась. Жаль, что я не могу принять два ответа как правильные, понадобятся первые и предоставленные ссылки :) –

+1

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

+0

Повторное использование имени переменной 'e' отбросило меня, но я думаю, что вижу, что вы там делаете. – MarkHu

0

Остерегайтесь разделители строк, перемещение * методы рассматривают их как один символ, но они на самом деле два - \ г \ n

6

Как уже отмечалось, методы перемещения видят разделители строк как один символ (\n) вместо двух (\r\n). Я скорректировал эту процедуру, чтобы компенсировать это:

function select(el, start, end) { 
    el.focus(); 

    if (el.setSelectionRange) { 
     el.setSelectionRange(start, end); 
    } 
    else { 
     if(el.createTextRange) { 
      var normalizedValue = el.value.replace(/\r\n/g, "\n"); 

      start -= normalizedValue.slice(0, start).split("\n").length - 1; 
      end -= normalizedValue.slice(0, end).split("\n").length - 1; 

      range=el.createTextRange(); 
      range.collapse(true); 
      range.moveEnd('character', end); 
      range.moveStart('character', start); 
      range.select(); 
     } 
    } 
} 
+0

Отлично работает! Спасибо. – Vasyl