Javascript 按enter键时,如何保持文本区域中的选项卡级别?

Javascript 按enter键时,如何保持文本区域中的选项卡级别?,javascript,html,Javascript,Html,当用户按enter键时,我希望光标移动到新行,但如果它们当前由两个选项卡缩进,则光标应保持缩进两个选项卡 我已经实现了ignore tab事件来阻止焦点在页面中移动,所以我现在只想寻找逻辑来保持标签级别在新行上 if(e.keyCode === 13){ //Logic here } 必须说,基于一次按键的解决方案是模糊的,因为人们也喜欢粘贴文本。改用输入事件。您可以在jQuery中这样做: $('textarea')。在('input',函数(e)上{ var el=$(本);

当用户按enter键时,我希望光标移动到新行,但如果它们当前由两个选项卡缩进,则光标应保持缩进两个选项卡

我已经实现了ignore tab事件来阻止焦点在页面中移动,所以我现在只想寻找逻辑来保持标签级别在新行上

if(e.keyCode === 13){

    //Logic here
}


必须说,基于一次按键的解决方案是模糊的,因为人们也喜欢粘贴文本。改用
输入
事件。您可以在jQuery中这样做:

$('textarea')。在('input',函数(e)上{
var el=$(本);
var cur=$(this).prop('selectionStart');//在设置值之前检索当前插入符号位置
var text=$(this.val();
var newText=text.replace(//^(+)\t+/mg,$1');//删除中间选项卡
newText=newText.replace(//([^\t]*)$/mg,'\t\t$1');//在每行的开头添加两个选项卡
如果(newText!=text){//如果文本已更改。。。
$(this.val(newText);//最后设置值
//并将插入符号位置右移一个符号
$(this.prop('selectionStart',cur+1);
$(this.prop('selectionEnd',cur+1);
}
});

我通过使用
execCommand'insertText'
而不是修改
textarea.value
改进了

优势:

  • 维护的撤消重做历史记录
  • 在删除任何选定文本时保持本机行为
  • 没有
  • 更短、更简单的代码
缺点:

  • Firefox目前不支持。(使用无止境的解决方案作为后备方案。)
$('textarea')。打开('keydown',函数(e){
如果(e.which==13){/[ENTER]键
event.preventDefault()//我们将自己添加换行符。
var start=this.selectionStart;
var currentLine=this.value.slice(0,start).split('\n').pop();
var newlineIndent='\n'+currentLine.match(/^\s*/)[0];
如果(!document.execCommand('insertText',false,newlineIndent)){
//添加Firefox浏览器的回退:
//修改此值并根据解决方案更新光标位置。
}
}
});
我缩进了8个空格。
我被一个标签缩进。

您必须维护一个表单类局部变量,该变量保存当前选项卡级别,然后根据需要将选项卡或空格附加到textarea文本的末尾,以保持该选项卡级别。您还需要挂起shift tab,以便用户可以根据需要降低选项卡级别。非常感谢!我一直在到处寻找类似的东西,但我找不到。这个版本更简单,而且(大部分)得到了改进:
$("textarea").keydown(function(e){
    if(e.keyCode == 13){

        // assuming 'this' is textarea

        var cursorPos = this.selectionStart;
        var curentLine = this.value.substr(0, this.selectionStart).split("\n").pop();
        var indent = curentLine.match(/^\s*/)[0];
        var value = this.value;
        var textBefore = value.substring(0,  cursorPos );
        var textAfter  = value.substring( cursorPos, value.length );

        e.preventDefault(); // avoid creating a new line since we do it ourself
        this.value = textBefore + "\n" + indent + textAfter;
        setCaretPosition(this, cursorPos + indent.length + 1); // +1 is for the \n
    }
});

function setCaretPosition(ctrl, pos)
{

    if(ctrl.setSelectionRange)
    {
        ctrl.focus();
        ctrl.setSelectionRange(pos,pos);
    }
    else if (ctrl.createTextRange) {
        var range = ctrl.createTextRange();
        range.collapse(true);
        range.moveEnd('character', pos);
        range.moveStart('character', pos);
        range.select();
    }
}