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