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() {
// ?
});
期望的结果
注意:我使用的是jQuery。
我能弄清楚如何滚动的唯一方法是使用jQuery&#39; s scrollTop
功能。它将滚动位置设置为&#34;在可滚动区域上方隐藏的像素数&#34;。
我已经说明了下面的问题。将红线的长度(以像素为单位)传递给scrollTop
应该可以解决问题。但我无法弄清楚如何获得该线的长度。
答案 0 :(得分:6)
根据Jonathan Levine的评论,我意识到this answer对我有用。
<强>的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
*/
<强>解释强>
当用户按下某个键时,浏览器会做两件事:
此解决方案只是模拟(没有实际输入任何文本)。
编辑:旧解决方案不符合标准。不推荐使用initKeyEvent
。此更新仅使用KeyboardEvent()
构造函数,该构造函数符合并且适用于除IE之外的所有浏览器(Safari是问号)。
编辑2:使用$.event.trigger({ type : 'keypress' });
代替new KeyboardEvent()
同样适用,并适用于所有浏览器。
答案 1 :(得分:1)
出于某种奇怪的原因,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);
答案 2 :(得分:0)
这是我的事情。
我发现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();
}