Переместите курсор в конец поля ввода текста И сделайте конец видимым

Я схожу с ума. У меня есть окно автопредложения, где пользователи выбирают предложение. При выборе следующего предложения значение поля ввода текста превышает его размер. Я могу переместить карат в конец кроссбраузерного поля ввода, без проблем. Но в Chrome и Safari я не вижу карат в конце. Конца текста не видно.

Есть ли способ переместить карат в конец поля ввода текста И сделать конец поля видимым, чтобы пользователь не путался в том, куда пошел карат ввода?

что я получил до сих пор:

<html>
<head><title>Field update test</title></head>

<body>
<form action="#" method="POST" name="testform">

<p>After a field is updated the carat should be at the end of the text field AND the end of the text should be visible</p>

<input type="text" name="testbox" value="" size="40">

<p><a href="javascript:void(0);" onclick="add_more_text();">add more text</a></p>

</form>

<script type="text/javascript">
<!--
var count = 0;

function add_more_text() {
   var textfield = document.testform.elements['testbox'];

   textfield.focus();

   if (count == 0) textfield.value = ''; // clear old

   count++;
   textfield.value = textfield.value + (textfield.value.length ? ', ' : '') + count + ": This is some sample text";

   // move to the carat to the end of the field
   if (textfield.setSelectionRange) {
      textfield.setSelectionRange(textfield.value.length, textfield.value.length);
   } else if (textfield.createTextRange) {
      var range = textfield.createTextRange();
      range.collapse(true);
      range.moveEnd('character', textfield.value.length);
      range.moveStart('character', textfield.value.length);
      range.select();
   }

   // force carat visibility for some browsers
   if (document.createEvent) {
      // Trigger a space keypress.
      var e = document.createEvent('KeyboardEvent');
      if (typeof(e.initKeyEvent) != 'undefined') {
         e.initKeyEvent('keypress', true, true, null, false, false, false, false, 0, 32);
      } else {
         e.initKeyboardEvent('keypress', true, true, null, false, false, false, false, 0, 32);
      }
      textfield.dispatchEvent(e);

      // Trigger a backspace keypress.
      e = document.createEvent('KeyboardEvent');
      if (typeof(e.initKeyEvent) != 'undefined') {
         e.initKeyEvent('keypress', true, true, null, false, false, false, false, 8, 0);
      } else {
         e.initKeyboardEvent('keypress', true, true, null, false, false, false, false, 8, 0);
      }
      textfield.dispatchEvent(e);
   }
}
// -->
</script>

</body>
</html>

person whereisalext    schedule 22.04.2010    source источник


Ответы (1)


Я придумал решение. Webkit (Safari и Chrome) нуждается в пинке под штаны, чтобы правильно выполнять событие клавиатуры. Добавьте blur(), а затем focus() перед возвратом:

  textfield.blur(); // Webkit wake-up hack
  textfield.focus();
  textfield.dispatchEvent(e);

Спасибо. Теперь работает в Safari, Chrome, FF, IE на Mac и Windows.

person whereisalext    schedule 22.04.2010