“滚动”到长文本输入的最右侧

"Scroll" to the very right of a long text input

提问人:Pekka 提问时间:12/26/2009 更新时间:7/25/2017 访问量:30568

问:

我有一个图像选择器,允许从图库中选择图像,然后将 URL 填写到字段中。URL 可能非常长,并且总是在文本字段中看到 URL 的前半部分几乎没有信息价值。<input type="text">

有人知道一种将“滚动”到文本字段最右侧的方法,以便 URL 的末尾而不是开头可见?无需求助于文本区域。

JavaScript HTML CSS

评论

0赞 Bakudan 3/10/2012
使用 JavaScript 将光标放在文本输入元素中的文本末尾的可能重复项

答:

40赞 BalusC 12/26/2009 #1

除IE6-8/Opera以外的所有浏览器

在显式设置 .缺点是一旦模糊,它就会滚动回去开始。focus()

var foo = document.getElementById("foo");
foo.value = "http://stackoverflow.com/questions/1962168/scroll-to-the-very-right-of-a-long-text-input";
foo.focus();
foo.setSelectionRange(foo.value.length,foo.value.length);
<input id="foo">  

除IE/Opera以外的所有浏览器

如果您不关心 IE 的全部内容,请将 Element.scrollLeft 设置为 Element.scrollWidth。缺点是浏览器支持较少。

var foo = document.getElementById("foo");
foo.value = "http://stackoverflow.com/questions/1962168/scroll-to-the-very-right-of-a-long-text-input";
foo.scrollLeft = foo.scrollWidth;
<input id="foo">

所有浏览器

如果您想支持每个浏览器,请考虑使用您设置为(从右到左)的 (direction) 属性来欺骗它。缺点是,当它是可编辑的和/或您开发一个对方向敏感的网站时,它确实需要考虑它,但这适用于所有浏览器,并且非常适合只读输入。dirrtl

var foo = document.getElementById("foo");
foo.value = "http://stackoverflow.com/questions/1962168/scroll-to-the-very-right-of-a-long-text-input";
<input id="foo" dir="rtl">  

评论

2赞 Pekka 12/26/2009
非常聪明的想法,但如果用户必须手动编辑 URL,它会改变用户的输入行为(它的行为类似于文本对齐:右)。
2赞 BalusC 12/26/2009
使用一些 JS 来更改焦点和模糊的属性。dir
5赞 Stein G. Strindhaug 6/20/2011
这是在滥用 rtl 属性,这实际上是在告诉浏览器期待从右到左的输入(即阿拉伯语或希伯来语等)。即使副作用最初是预期的结果,也很容易导致输入问题。
1赞 Dennie 6/26/2020
我尝试过(结合使用),但是当输入值以数字开头时遇到了问题;该数字将显示在右侧。为了克服这个问题,我将值括在 和 中,但这有一个问题,即在复制文本时,您会在复制的文本中得到问号。此外,箭头/主页/结束键的工作方式相反。最后,这真的是一个黑客,所以我决定去设置。direction: rtltext-align: left&lrm;&rlm;scrollLeft
1赞 Stein G. Strindhaug 6/20/2011 #2

更好的解决方案是使输入足够大,以便看到最合理的长度 URL。输入的默认宽度通常非常短。通过减小字体大小和增加宽度(可能增加百分比以填充可用空间),您可能会使 url 的长度与浏览器的 url 栏一样长或更长。您实际上并不需要非常大的 url 文本,因为您可能只是在验证它看起来是否合理,而不是阅读它。

如果能够以相对较大的字体查看整个 url 很重要(如果用户应该是高级用户并且可能会手动编辑 url),则应使用文本区域进行修改。随机换行的 url 看起来有点奇怪,但只要你不插入空格,url 应该仍然有效。

如果您的 Web 服务器负责生成 URL,您可以尝试使其不那么冗长。如果可以使用相对 url(跳过域部分),也可以节省空间。

20赞 Lucman Abdulrachman 2/1/2013 #3
$('#myInput').get(0).scrollLeft = $('#myInput').get(0).scrollWidth; 

评论

0赞 Gilkan Solizaris 12/4/2019
不错的答案。唯一不是完美答案的原因是因为帖子标签不包括 jQuery......并补充说 scrollLeft 和 scrollWidth 都是纯 Javascript 中存在的功能,因此您间接回答正确。
0赞 Gilkan Solizaris 12/4/2019
在知道 scrollleft 和 scrollwidth 也肯定也按预期进行输入之前就发现了这一点。又是很好的答案!:)
26赞 Stephen Kaiser 6/29/2013 #4

Lucman Abdulrachman 的答案是最好的,但我不能支持它,所以我在不使用 jQuery 的情况下添加了另一个解决方案:

var elem = document.getElementById('myInput');
elem.focus();
elem.scrollLeft = elem.scrollWidth;

评论

0赞 dakab 12/30/2018
为什么它是最好的?当然不是。原生方法要容易得多,也快得多。
0赞 Yasser Jarouf 8/17/2020
如果更新是以编程方式完成的,最好在“setTimeout”中执行此操作
1赞 Michele Peghini 7/25/2017 #5

你可以简单地将CSS属性方向设置为“rtl”(从右到左),不需要JS。 这将改变滚动方向和文本对齐方式,因此当文本短于输入的大小时,它可能看起来很奇怪,但鉴于输入将始终包含长 url,这应该不是问题。

input {
  margin: 10px;
  direction: rtl;
}
<input type="text" value="short url" size="20">
<br>
<input type="text" value="https://developer.mozilla.org/en-US/docs/Web/CSS/direction" size="20">

我希望这会有所帮助。

评论

0赞 Pedro Marques 2/4/2020
这完全改变了键盘导航的行为......解决一个问题,创造另一个问题!小心
0赞 Plagiatus 11/25/2020
我在禁用的字段上使用了它与 text-align:center 相结合,它就像一个魅力。较短的文本位于左侧,较长的文本会自动滚动。