将插入符号移动到文本输入字段的末尾并使结尾可见

Posted

技术标签:

【中文标题】将插入符号移动到文本输入字段的末尾并使结尾可见【英文标题】:Move caret to the end of a text input field AND make the end visible 【发布时间】:2011-02-11 03:07:34 【问题描述】:

我快疯了。我有一个自动建议框,用户可以在其中选择建议。在下一个建议选择中,文本输入框的值超过了它的大小。我可以将克拉移动到跨浏览器输入字段的末尾,没问题。但在 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>

【问题讨论】:

【参考方案1】:

我想出了一个解决方案。 Webkit(Safari 和 Chrome)需要正确执行键盘事件。在退格之前添加一个 blur() 然后 focus() :

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

谢谢。现在可以在 Mac 和 Windows 上的 Safari、Chrome、FF、IE 中使用。

【讨论】:

以上是关于将插入符号移动到文本输入字段的末尾并使结尾可见的主要内容,如果未能解决你的问题,请参考以下文章

将插入符号位置设置为始终以 contenteditable div 结尾 [重复]

jQuery将光标移动到文本输入的末尾

从聚焦的只读输入中删除文本插入符号/指针

iOS 文本输入问题:插入符号飞入

如何将光标移动到内容可编辑实体的末尾

以编程方式附加字符后在 UITextField 中显示文本的结尾[重复]