【发布时间】:2010-08-14 13:45:05
【问题描述】:
我正在尝试制作一个自动缩进的文本区域,到目前为止它可以与以下代码一起使用。我遇到的问题是,我目前正在阻止默认操作按 Enter 以计算行中的选项卡,然后插入换行符。
这可行,但我想要 textarea 的默认操作,如果你按住 enter 键,它不会滚动 textarea,直到插入符号击中底行,然后滚动条与插入符号保持在最下面一行。如果在 textarea 中的任何位置使用,下面的当前代码将插入符号保持在视野中,但它会导致插入符号上方的内容向上滚动,这是一种折衷方案,因为插入符号不再消失。如果没有其他解决方案,这将正常工作,但我希望有其他想法。
var start = this.selectionStart-1;
var end = this.selectionEnd;
var sT = this.scrollTop;
var sH = this.scrollHeight;
var vH = $(this).height();
var x = (sH - sT) - vH;
// Check if hitting enter on the first line as no newline will be found
if (this.value.lastIndexOf('\n',start)==-1)
var startSubstr = 0;
else
var startSubstr = this.value.lastIndexOf('\n',start)+1;
var endFirst = end - startSubstr;
var valueToScan = this.value.substr(startSubstr,endFirst);
var count = 0;
// Count only \t at the beginning of the line, none in the code
while (valueToScan.indexOf('\t')!=-1) {
if (valueToScan.indexOf('\t')!=0)
break;
count++;
valueToScan = valueToScan.substr(valueToScan.indexOf('\t')+1);
}
// Command to isert the newline, and then add the \t's found in previously
$(this).insertAtCaret('\n');
for (var i=0;i<count;count--) {
$(this).insertAtCaret('\t');
}
var sH = this.scrollHeight;
this.scrollTop = (sH - x) - vH;
编辑 作为更新,为了消除任何混淆,我正在尝试创建一个 IDE 样式的文本框,例如在大多数 IDE 中,如果您键入以下内容
function example(whatever) {
Example Stuff // And then hit enter here
我希望它带您到与“示例内容”相同的标签距离左边框,以使您的代码更易于阅读。我目前具有该功能,但问题是我正在拦截输入键,这意味着我必须提供该功能。我很难复制在光标碰到底部边框之前不滚动文本框的确切功能。因此,如果您在 textarea 的顶部按住 enter,光标只会向下滚动 textarea,移动任何文本直到它碰到底部边框,然后 textarea 的滚动条将跟随光标。有意义吗?
EDIT 2 更新标签以表明代码使用 PHP
在发布这篇文章的同时,我一直在处理这个问题。我认为,当我有机会时,我将探索的另一个选择是,而不是阻止输入,只允许默认操作按 Enter 键并将字符串从lastIndexOf('\n')-1 读取到最新的\n,以获取任何\t。我认为这会给我我正在寻找的字符串,但不会弄乱 textarea 的行为。待测试后再更新。
EDIT 3 已解决,根据我之前的更新,我决定在按下键后扫描字符串,保留自然行为(为感兴趣的人添加了下面的部分)和唯一真正的问题剩下的是,如果你按住 enter,它不会计算从 enter 按下的原点开始的缩进,这对我来说很好。我将把这个给 http://stackoverflow.com/users/15066/matyr'>matyr,虽然在他回复之前我确实知道他仍然是最接近的。
if (this.value.lastIndexOf('\n',start-2)==-1) {
var startSubstr = 0;
} else {
var startSubstr = this.value.lastIndexOf('\n',start-1)+1;
}
var valueToScan = this.value.substr(startSubstr,start);
【问题讨论】:
标签: php javascript jquery