Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Chrome не обновляет позицию курсора, если он сдвигается Backspace`ом? (https://javascript.ru/forum/misc/68622-chrome-ne-obnovlyaet-poziciyu-kursora-esli-sdvigaetsya-backspace%60om.html)

evgeniy2 27.04.2017 14:24

Chrome не обновляет позицию курсора, если он сдвигается Backspace`ом?
 
Есть функция, которая вставляет текст или символ в поле textarea в позицию курсора. Все отлично работает. Но в Хроме текст вставляется в то место, где курсор был до его смещения влево Backspace`ом. Если курсор ставится мышкой или перемещается стрелочками влево, вправо, то работает нормально. Видимо, Хром не обновляет позицию курсора, только если он смещается Backspace`ом. Проверял в Firefox. Там никаких глюков нет.

Код кажется нелогичным, потому что я немного упросил функцию, на самом деле также могут вставляться парные теги вокруг выделенного текста, но суть глюка не меняется.
function str_insert( str, ta ) //ta = textarea
{
  ta.focus();
 
  if( typeof(ta.selectionStart) != "undefined" )
  {
    var start = ta.selectionStart;
    var end = ta.selectionEnd;
    var slen = end-start;
    var scrollTop = ta.scrollTop;
 
    var rs = (ta.value.substr(start, slen)) + str;
    ta.value = ta.value.substr(0,start) + rs + ta.value.substr(end);
 
    ta.setSelectionRange(start+rs.length, start+rs.length);
 
    ta.scrollTop = scrollTop;
    ta.focus();
  }
}

Действительно есть такой глюк в Хроме или это у меня где-то ошибка?

Dilettante_Pro 27.04.2017 14:40

В ИЕ, ФФ, Опере нормально, в Хроме - как написано.
<textarea style="width:500px;height:100px">Есть функция, которая вставляет текст или символ в поле textarea в позицию курсора. Все отлично работает. Но в Хроме текст вставляется в то место, где курсор был до его смещения влево Backspace`ом. </textarea>
<button onclick="str_insert('Test', document.querySelector('textarea'));"  >Вставить Тест</button>
<script>
function str_insert( str, ta ) //ta = textarea
{
  ta.focus();
 
  if( typeof(ta.selectionStart) != "undefined" )
  {
    var start = ta.selectionStart;
    var end = ta.selectionEnd;
    var slen = end-start;
    var scrollTop = ta.scrollTop;
 
    var rs = (ta.value.substr(start, slen)) + str;
    ta.value = ta.value.substr(0,start) + rs + ta.value.substr(end);
 
    ta.setSelectionRange(start+rs.length, start+rs.length);
 
    ta.scrollTop = scrollTop;
    ta.focus();
  }
}
</script>

evgeniy2 27.04.2017 16:11

И что делать? Ждать, когда исправят баг, или пытаться придумать костыль?


Часовой пояс GMT +3, время: 12:31.