【问题标题】:How do you scroll to the position of the cursor in a textarea?你如何滚动到文本区域中光标的位置?
【发布时间】:2015-07-06 02:52:44
【问题描述】:

JS Fiddle Demo

HTML

<textarea rows='5'>
sdfasjfalsfjasf;klasdfklaksdfkjlasdfkjlasdjkfadls;fjklasdfjklasdkjlfaskljdfkalsjdfjlkasdfkjlasdkjlfasfkl;ajklsdfjklasdfkjlaskjldfaskjlfkljsadkjlfaskjldfkjlasdfkjlasdjklfaskljdfkjlasfkjlasdkjlfasjklfajklsdfjklasdfjlkadjsdfasjfalsfjasf;klasdfklaksdfkjlasdfkjlasdjkfadls;fjklasdfjklasdkjlfaskljdfkalsjdfjlkasdfkjlasdkjlfasfkl;ajklsdfjklasdfkjlaskjldfaskjlfkljsadkjlfaskjldfkjlasdfkjlasdjklfaskljdfkjlasfkjlasdkjlfasjklfajklsdfjklasdfjlkadjsdfasjfalsfjasf;klasdfklaksdfkjlasdfkjlasdjkfadls;fjklasdfjklasdkjlfaskljdfkalsjdfjlkasdfkjlasdkjlfasfkl;ajklsdfjklasdfkjlaskjldfaskjlfkljsadkjlfaskjldfkjlasdfkjlasdjklfaskljdfkjlasfkjlasdkjlfasjklfajklsdfjklasdfjlkadjsdfasjfalsfjasf;klasdfklaksdfkjlasdfkjlasdjkfadls;fjklasdfjklasdkjlfaskljdfkalsjdfjlkasdfkjlasdkjlfasfkl;ajklsdfjklasdfkjlaskjldfaskjlfkljsadkjlfaskjldfkjlasdfkjlasdjklfaskljdfkjlasfkjlasdkjlfasjklfajklsdfjklasdfjlkadj
</textarea>

<br />
<button id='scroll-to-cursor'>Scroll to Cursor</button>

JavaScript

$('#scroll-to-cursor').on('click', function() {
    // ?
});

期望的结果

  1. 单击文本区域中的某处以放置光标。
  2. 滚开,使光标不可见。
  3. 点击“滚动到光标”按钮。
  4. Textarea 滚动到光标所在位置

注意:我使用的是 jQuery。

我能弄清楚如何滚动的唯一方法是使用 jQuery 的 scrollTop 功能。它将滚动位置设置为“在可滚动区域上方的视图中隐藏的像素数”。

我已经在下面图解了这个问题。将红线的长度(以像素为单位)传递给scrollTop 应该可以解决问题。但我不知道如何获得线的长度。

【问题讨论】:

  • this 链接是否有效?是纯 JS。
  • 您可以简单地重新聚焦 textarea 以使其回到 webkit 浏览器中的光标位置。但在 IE/Firefox 中不起作用
  • @JonathanLevine 确实有效,谢谢!乍一看,我看到它是用于输入和水平滚动的,所以我认为它不适用,但我只是对其进行了测试,它确实有效。

标签: javascript jquery html scroll textarea


【解决方案1】:
textarea.blur()
textarea.focus()

完成这项工作。

示例:https://jsfiddle.net/syy25x69/

要在 IE 中选择文本,请参阅:Set textarea selection in Internet Explorer

更新

为了使它起作用,我注意到必须折叠选择。如果需要,您可以稍后恢复选择。

// collapse selection here
textarea.blur()
textarea.focus() // this scrolls the textarea
// expand selection here

另一个例子:https://jsfiddle.net/rk8cL174/

【讨论】:

  • 解释为什么这应该起作用 - 这也将有助于社区的其他人了解您如何解决这个问题/问题。这对于已经接受答案的问题尤其重要 - 必须清楚为什么还应考虑您的答案。
  • 它将模糊/聚焦 textarea 并将光标放在 textarea 的末尾,因此它将滚动 textarea 到末尾,而不是光标所在的位置。这是错误的
  • @llamerr 实际上不会 - 鉴于您没有松开该字段的焦点,光标将保留在原位
  • @tomaszstryjewski 它现在确实可以工作(至少在当前 Chrome 的 Mac 上),但在我测试它的时候(2017 年 2 月 15 日在 Linux 上的 Chrome 上)我相信它像我描述的那样工作(我当天无法轻松找到和下载 Chrome 版本)
  • 在使用setSelectionRange修改插入符号位置后,此答案也适用于文本输入
【解决方案2】:

从 Jonathan Levine 的评论中,我意识到 this answer 对我有用。

Fiddle Demo

JavaScript

$('#scroll-to-cursor').on('click', function() {    
    $('textarea').focus();
    $.event.trigger({ type : 'keypress' }); // works cross-browser

    // new KeyboardEvent('keypress'); // doesn't work in IE and Safari

    /* var evt = document.createEvent('KeyboardEvent');
    evt.initKeyEvent('keypress', true, true, null, false, false, false, false, 0, 32);
    $textarea.dispatchEvent(evt);

    evt = document.createEvent('KeyboardEvent');
    evt.initKeyEvent('keypress', true, true, null, false, false, false, false, 8, 0);
    $textarea.dispatchEvent(evt); */
});

/*
    To test:
    1) Click somewhere in the textarea to place cursor
    2) Scroll away so cursor isn't visible
    3) Click "Scroll to Cursor" button
*/

说明

当用户按键时,浏览器会做两件事:

  1. 将键放在光标后的位置。
  2. 滚动到该位置。

这个解决方案只是模拟那个(没有实际输入任何文本)。

编辑:旧的解决方案不符合标准。 initKeyEvent 已弃用。该更新仅使用KeyboardEvent() 构造函数,该构造函数兼容并适用于除 IE 以外的所有浏览器(Safari 是一个问号)。

编辑 2:使用 $.event.trigger({ type : 'keypress' }); 代替 new KeyboardEvent() 效果一样好,适用于所有浏览器。

【讨论】:

  • 我对右箭头和左箭头有同样的想法,但你的更好,因为箭头键的使用会改变文本末尾的光标位置;-)
  • keypress 在这里无关紧要,即使您注释掉该行也有效:jsfiddle.net/g74aabta 发生的情况是单击按钮会模糊文本区域,重新聚焦文本区域正在滚动光标进入视图。你不觉得 textarea 不是 $.event.trigger({ type : 'keypress' }); 的参数很奇怪吗?
【解决方案3】:

由于某些奇怪的原因,Chrome 仅在文本框上有插入符号时才会滚动,而不是在选定内容处于活动状态时滚动,因此如果您需要滚动到选定内容,请执行以下小技巧:

  // set the single caret first
  textarea.setSelectionRange(index, index);

  // focus the textarea box so the scroll happens
  textarea.focus();

  // now do the selection
  textarea.setSelectionRange(index, index + x);

【讨论】:

  • 是的,这是 100% 正确的,当有活动的选择光标将无处可去时,因此焦点将不起作用。上面的代码对我有用,感谢@sigmawf,简短
【解决方案4】:

这是我对事物的看法。

我发现 Audi Nugraha 的解决方案在测试时有效,但在 Electron 应用程序中尝试时无效。

一个对我有用的解决方案是将光标定位到开头,然后模糊/聚焦。

textarea.selectionEnd = textarea.selectionStart = position;
textarea.blur();
textarea.focus();

我已将以上内容合并到一个函数中:

function scrollTextarea(textarea,position) {
    textarea.selectionEnd = textarea.selectionStart = position;
    textarea.blur();
    textarea.focus();
}

【讨论】:

    猜你喜欢
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 2010-09-25
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多