我这边有一个简单的html textarea。现在,如果您单击其中的选项卡,它将转到下一个字段。我想使选项卡按钮缩进一些空格。我怎样才能做到这一点?谢谢。
我这边有一个简单的html textarea。现在,如果您单击其中的选项卡,它将转到下一个字段。我想使选项卡按钮缩进一些空格。我怎样才能做到这一点?谢谢。
Answers:
从其他答案中大量借用类似问题(如下所述)...
$(document).delegate('#textbox', 'keydown', function(e) {
var keyCode = e.keyCode || e.which;
if (keyCode == 9) {
e.preventDefault();
var start = this.selectionStart;
var end = this.selectionEnd;
// set textarea value to: text before caret + tab + text after caret
$(this).val($(this).val().substring(0, start)
+ "\t"
+ $(this).val().substring(end));
// put caret at right position again
this.selectionStart =
this.selectionEnd = start + 1;
}
});
var textareas = document.getElementsByTagName('textarea');
var count = textareas.length;
for(var i=0;i<count;i++){
textareas[i].onkeydown = function(e){
if(e.keyCode==9 || e.which==9){
e.preventDefault();
var s = this.selectionStart;
this.value = this.value.substring(0,this.selectionStart) + "\t" + this.value.substring(this.selectionEnd);
this.selectionEnd = s+1;
}
}
}
此解决方案不需要jQuery,并将在页面上的所有文本区域上启用标签功能。
this.selectionEnd = s+1;
用this.selectionEnd = s + "\t".length;
。使用变量或函数参数并在其中存储缩进字符会更清洁。但是您知道现在要替换什么:+1
定义插入符移动了多少个字符。
正如其他人所写的那样,您可以使用JavaScript捕获事件,阻止默认操作(以使光标不会移动焦点)并插入制表符。
但是,禁用默认行为将导致无法在不使用鼠标的情况下将焦点移出文本区域。盲人用户仅使用键盘与网页进行交互-他们看不到鼠标指针可以对键盘做任何有用的事情,因此,键盘还是什么也没有。Tab键是浏览文档(尤其是表单)的主要方法。覆盖Tab键的默认行为将使盲人用户无法将焦点移至下一个表单元素。
因此,如果您要为广大读者编写网站,则建议不要在没有令人信服的理由的情况下这样做,并为盲人用户提供某种替代方法,以免他们陷入文本区域。
对于它的价值,这是我的一线话,对于大家在该主题中一直在谈论的内容:
<textarea onkeydown="if(event.keyCode===9){var v=this.value,s=this.selectionStart,e=this.selectionEnd;this.value=v.substring(0, s)+'\t'+v.substring(e);this.selectionStart=this.selectionEnd=s+1;return false;}">
</textarea>
在最新版本的Chrome,Firefox,Internet Explorer和Edge中测试。
if(event.shiftKey){if(v.substring(s-1,s)==='\t'){this.value=v.substring(0,s-1)+v.substring(e);this.selectionStart=this.selectionEnd=s-1;}}
这是我的版本,支持:
$(function() {
var enabled = true;
$("textarea.tabSupport").keydown(function(e) {
// Escape key toggles tab on/off
if (e.keyCode==27)
{
enabled = !enabled;
return false;
}
// Enter Key?
if (e.keyCode === 13 && enabled)
{
// selection?
if (this.selectionStart == this.selectionEnd)
{
// find start of the current line
var sel = this.selectionStart;
var text = $(this).val();
while (sel > 0 && text[sel-1] != '\n')
sel--;
var lineStart = sel;
while (text[sel] == ' ' || text[sel]=='\t')
sel++;
if (sel > lineStart)
{
// Insert carriage return and indented text
document.execCommand('insertText', false, "\n" + text.substr(lineStart, sel-lineStart));
// Scroll caret visible
this.blur();
this.focus();
return false;
}
}
}
// Tab key?
if(e.keyCode === 9 && enabled)
{
// selection?
if (this.selectionStart == this.selectionEnd)
{
// These single character operations are undoable
if (!e.shiftKey)
{
document.execCommand('insertText', false, "\t");
}
else
{
var text = this.value;
if (this.selectionStart > 0 && text[this.selectionStart-1]=='\t')
{
document.execCommand('delete');
}
}
}
else
{
// Block indent/unindent trashes undo stack.
// Select whole lines
var selStart = this.selectionStart;
var selEnd = this.selectionEnd;
var text = $(this).val();
while (selStart > 0 && text[selStart-1] != '\n')
selStart--;
while (selEnd > 0 && text[selEnd-1]!='\n' && selEnd < text.length)
selEnd++;
// Get selected text
var lines = text.substr(selStart, selEnd - selStart).split('\n');
// Insert tabs
for (var i=0; i<lines.length; i++)
{
// Don't indent last line if cursor at start of line
if (i==lines.length-1 && lines[i].length==0)
continue;
// Tab or Shift+Tab?
if (e.shiftKey)
{
if (lines[i].startsWith('\t'))
lines[i] = lines[i].substr(1);
else if (lines[i].startsWith(" "))
lines[i] = lines[i].substr(4);
}
else
lines[i] = "\t" + lines[i];
}
lines = lines.join('\n');
// Update the text area
this.value = text.substr(0, selStart) + lines + text.substr(selEnd);
this.selectionStart = selStart;
this.selectionEnd = selStart + lines.length;
}
return false;
}
enabled = true;
return true;
});
});
textarea
{
width: 100%;
height: 100px;
tab-size: 4;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea class="tabSupport">if (something)
{
// This textarea has "tabSupport" CSS style
// Try using tab key
// Try selecting multiple lines and using tab and shift+tab
// Try pressing enter at end of this line for auto indent
// Use Escape key to toggle tab support on/off
// eg: press Escape then Tab to go to next field
}
</textarea>
<textarea>This text area doesn't have tabSupport class so disabled here</textarea>
两者都是直截了当且不会丢失撤消(Ctrl + Z)最后更改的功能的现代方法。
$('#your-textarea').keydown(function (e) {
var keyCode = e.keyCode || e.which;
if (keyCode === $.ui.keyCode.TAB) {
e.preventDefault();
const TAB_SIZE = 4;
// The one-liner that does the magic
document.execCommand('insertText', false, ' '.repeat(TAB_SIZE));
}
});
有关更多execCommand
:
正如评论中指出的(虽然这曾经是“现代”解决方案),但该功能已过时。引用文档:
此功能已过时。尽管它可能在某些浏览器中仍然可以使用,但不建议使用它,因为可以随时将其删除。尽量避免使用它。
indent-textarea
使用此方法的跨浏览器解决方案以及Firefox中的后备功能。
document.execCommand
只有在设置后才能启用document.designMode = "on";
。我能够使文本写入具有的元素.contentEditable = 'true'
。但是,当我尝试在textarea上完成此操作时,插入的textNode会被放置在文档中textarea的正前方(而不是在textarea中)。请尝试帮助Mozilla 在此处解决此问题。
execCommand
)不再视为“现代” :“此功能已过时。尽管它可能在某些浏览器中仍然可以使用,但不建议使用它,因为可以随时将其删除。尝试避免使用它。
在AngularJS环境中尝试使用@kasdega的答案的过程很快,但是我尝试过的一切似乎都无法使Angular对更改采取行动。因此,万一对路人有用,这里是对@kasdega的代码AngularJS风格的重写,它对我有用:
app.directive('ngAllowTab', function () {
return function (scope, element, attrs) {
element.bind('keydown', function (event) {
if (event.which == 9) {
event.preventDefault();
var start = this.selectionStart;
var end = this.selectionEnd;
element.val(element.val().substring(0, start)
+ '\t' + element.val().substring(end));
this.selectionStart = this.selectionEnd = start + 1;
element.triggerHandler('change');
}
});
};
});
和:
<textarea ng-model="mytext" ng-allow-tab></textarea>
element.triggerHandler('change');
,否则模型将不会被更新(因为element.triggerHandler('change');
我想。
您必须编写JS代码才能捕捉到TAB键并插入大量空格。与JSFiddle相似。
检查jQuery 小提琴:
HTML:
<textarea id="mybox">this is a test</textarea>
JavaScript:
$('#mybox').live('keydown', function(e) {
var keyCode = e.keyCode || e.which;
if (keyCode == 9) {
e.preventDefault();
alert('tab pressed');
}
});
event.preventDefault();
e.keyCode || e.which
。
基于@kasdega解决方案的多行检测脚本。
$('textarea').on('keydown', function (e) {
var keyCode = e.keyCode || e.which;
if (keyCode === 9) {
e.preventDefault();
var start = this.selectionStart;
var end = this.selectionEnd;
var val = this.value;
var selected = val.substring(start, end);
var re = /^/gm;
var count = selected.match(re).length;
this.value = val.substring(0, start) + selected.replace(re, '\t') + val.substring(end);
this.selectionStart = start;
this.selectionEnd = end + count;
}
});
start === end
。
该解决方案允许像您的典型代码编辑器一样在整个选项中进行制表,也可以取消对该选项的制表。但是,当没有选择时,我还没有弄清楚如何实现shift-tab。
$('#txtInput').on('keydown', function(ev) {
var keyCode = ev.keyCode || ev.which;
if (keyCode == 9) {
ev.preventDefault();
var start = this.selectionStart;
var end = this.selectionEnd;
var val = this.value;
var selected = val.substring(start, end);
var re, count;
if(ev.shiftKey) {
re = /^\t/gm;
count = -selected.match(re).length;
this.value = val.substring(0, start) + selected.replace(re, '') + val.substring(end);
// todo: add support for shift-tabbing without a selection
} else {
re = /^/gm;
count = selected.match(re).length;
this.value = val.substring(0, start) + selected.replace(re, '\t') + val.substring(end);
}
if(start === end) {
this.selectionStart = end + count;
} else {
this.selectionStart = start;
}
this.selectionEnd = end + count;
}
});
#txtInput {
font-family: monospace;
width: 100%;
box-sizing: border-box;
height: 200px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea id="txtInput">
$(document).ready(function(){
$("#msgid").html("This is Hello World by JQuery");
});
</textarea>
if (selected.length > 0) {...}
小提琴来做到这一点:jsfiddle.net/jwfkbjkr
根据人们在回答时在这里所说的所有内容,它只是keydown(不是keyup)+ preventDefault()+在插入符号处插入制表符的组合。就像是:
var keyCode = e.keyCode || e.which;
if (keyCode == 9) {
e.preventDefault();
insertAtCaret('txt', '\t')
}
较早的答案有一个可行的jsfiddle,但它在按下keydown时使用了alert()。如果删除此警报,则它不起作用。我刚刚添加了一个功能,可以在文本区域的当前光标位置插入一个选项卡。
这里是一个工作的jsfiddle:http : //jsfiddle.net/nsHGZ/
我看到这个问题没有解决。我对此进行了编码,并且效果很好。它在光标索引处插入一个列表。不使用jQuery
<textarea id="myArea"></textarea>
<script>
document.getElementById("myArea").addEventListener("keydown",function(event){
if(event.code==="Tab"){
var cIndex=this.selectionStart;
this.value=[this.value.slice(0,cIndex),//Slice at cursor index
"\t", //Add Tab
this.value.slice(cIndex)].join('');//Join with the end
event.stopPropagation();
event.preventDefault(); //Don't quit the area
this.selectionStart=cIndex+1;
this.selectionEnd=cIndex+1; //Keep the cursor in the right index
}
});
</script>
我做了一个您可以使用任何喜欢的textarea元素访问的对象:
function textControl (element, event)
{
if(event.keyCode==9 || event.which==9)
{
event.preventDefault();
var s = element.selectionStart;
element.value = element.value.substring(0,element.selectionStart) + "\t" + element.value.substring(element.selectionEnd);
element.selectionEnd = s+1;
}
}
元素看起来像这样:
<textarea onkeydown="textControl(this,event)"></textarea>
我发现在使用香草JavaScript的现代浏览器中执行此操作的最简单方法是:
<textarea name="codebox"></textarea>
<script>
const codebox = document.querySelector("[name=codebox]")
codebox.addEventListener("keydown", (e) => {
let { keyCode } = e;
let { value, selectionStart, selectionEnd } = codebox;
if (keyCode === 9) { // TAB = 9
e.preventDefault();
codebox.value = value.slice(0, selectionStart) + "\t" + value.slice(selectionEnd);
codebox.setSelectionRange(selectionStart+2, selectionStart+2)
}
});
</script>
请注意,为简单起见,我在此代码段中使用了许多ES6功能,您可能需要在部署它之前先对其进行转换(使用Babel或TypeScript)。
上面的答案全部擦除了撤消历史记录。对于寻求解决方案的人,我花了最后一个小时为Chrome编写以下代码:
jQuery.fn.enableTabs = function(TAB_TEXT){
// options
if(!TAB_TEXT)TAB_TEXT = '\t';
// text input event for character insertion
function insertText(el, text){
var te = document.createEvent('TextEvent');
te.initTextEvent('textInput', true, true, null, text, 9, "en-US");
el.dispatchEvent(te);
}
// catch tab and filter selection
jQuery(this).keydown(function(e){
if((e.which || e.keyCode)!=9)return true;
e.preventDefault();
var contents = this.value,
sel_start = this.selectionStart,
sel_end = this.selectionEnd,
sel_contents_before = contents.substring(0, sel_start),
first_line_start_search = sel_contents_before.lastIndexOf('\n'),
first_line_start = first_line_start_search==-1 ? 0 : first_line_start_search+1,
tab_sel_contents = contents.substring(first_line_start, sel_end),
tab_sel_contents_find = (e.shiftKey?new RegExp('\n'+TAB_TEXT, 'g'):new RegExp('\n', 'g')),
tab_sel_contents_replace = (e.shiftKey?'\n':'\n'+TAB_TEXT);
tab_sel_contents_replaced = (('\n'+tab_sel_contents)
.replace(tab_sel_contents_find, tab_sel_contents_replace))
.substring(1),
sel_end_new = first_line_start+tab_sel_contents_replaced.length;
this.setSelectionRange(first_line_start, sel_end);
insertText(this, tab_sel_contents_replaced);
this.setSelectionRange(first_line_start, sel_end_new);
});
};
简而言之,制表符将插入所选行的开头。
JSFiddle:http : //jsfiddle.net/iausallc/5Lnabspr/11/
要点:https : //gist.github.com/iautomation/e53647be326cb7d7112d
用法示例: $('textarea').enableTabs('\t')
缺点:仅适用于Chrome。
Github上有一个库,用于由wjbryant在您的文本区域中支持标签:Tab Override
它是这样工作的:
// get all the textarea elements on the page
var textareas = document.getElementsByTagName('textarea');
// enable Tab Override for all textareas
tabOverride.set(textareas);
作为上述kasdega代码的一种选择,您可以在当前光标点插入字符,而不是将选项卡附加到当前值。这样做的好处是:
所以更换
// set textarea value to: text before caret + tab + text after caret
$(this).val($(this).val().substring(0, start)
+ "\t"
+ $(this).val().substring(end));
与
// set textarea value to: text before caret + tab + text after caret
document.execCommand("insertText", false, ' ');
if (e.which == 9) {
e.preventDefault();
var start = $(this).get(0).selectionStart;
var end = $(this).get(0).selectionEnd;
if (start === end) {
$(this).val($(this).val().substring(0, start)
+ "\t"
+ $(this).val().substring(end));
$(this).get(0).selectionStart =
$(this).get(0).selectionEnd = start + 1;
} else {
var sel = $(this).val().substring(start, end),
find = /\n/g,
count = sel.match(find) ? sel.match(find).length : 0;
$(this).val($(this).val().substring(0, start)
+ "\t"
+ sel.replace(find, "\n\t")
+ $(this).val().substring(end, $(this).val().length));
$(this).get(0).selectionStart =
$(this).get(0).selectionEnd = end+count+1;
}
}
试试这个简单的jQuery函数:
$.fn.getTab = function () {
this.keydown(function (e) {
if (e.keyCode === 9) {
var val = this.value,
start = this.selectionStart,
end = this.selectionEnd;
this.value = val.substring(0, start) + '\t' + val.substring(end);
this.selectionStart = this.selectionEnd = start + 1;
return false;
}
return true;
});
return this;
};
$("textarea").getTab();
// You can also use $("input").getTab();
我必须做一个函数来做同样的事情,它很容易使用,只需将此代码复制到脚本中并使用:enableTab( HTMLElement )
HTMLelement就像document.getElementById( id )
function enableTab(t){t.onkeydown=function(t){if(9===t.keyCode){var e=this.value,n=this.selectionStart,i=this.selectionEnd;return this.value=e.substring(0,n)+" "+e.substring(i),this.selectionStart=this.selectionEnd=n+1,!1}}}
每个textarea元素的输入都有一个onkeydown事件。在事件处理程序中,只要event.keyCode为9,就可以通过使用event.preventDefault()来防止Tab键的默认响应。
然后将制表符放在正确的位置:
function allowTab(input)
{
input.addEventListener("keydown", function(event)
{
if(event.keyCode == 9)
{
event.preventDefault();
var input = event.target;
var str = input.value;
var _selectionStart = input.selectionStart;
var _selectionEnd = input.selectionEnd;
str = str.substring(0, _selectionStart) + "\t" + str.substring(_selectionEnd, str.length);
_selectionStart++;
input.value = str;
input.selectionStart = _selectionStart;
input.selectionEnd = _selectionStart;
}
});
}
window.addEventListener("load", function(event)
{
allowTab(document.querySelector("textarea"));
});
html
<textarea></textarea>
$("textarea").keydown(function(event) {
if(event.which===9){
var cIndex=this.selectionStart;
this.value=[this.value.slice(0,cIndex),//Slice at cursor index
"\t", //Add Tab
this.value.slice(cIndex)].join('');//Join with the end
event.stopPropagation();
event.preventDefault(); //Don't quit the area
this.selectionStart=cIndex+1;
this.selectionEnd=cIndex+1; //Keep the cursor in the right index
}
});
简单的独立脚本:
textarea_enable_tab_indent = function(textarea) {
textarea.onkeydown = function(e) {
if (e.keyCode == 9 || e.which == 9){
e.preventDefault();
var oldStart = this.selectionStart;
var before = this.value.substring(0, this.selectionStart);
var selected = this.value.substring(this.selectionStart, this.selectionEnd);
var after = this.value.substring(this.selectionEnd);
this.value = before + " " + selected + after;
this.selectionEnd = oldStart + 4;
}
}
}
如果您确实需要标签,请从单词或记事本中复制标签,然后将其粘贴到所需的文本框中
1 2 3
12 22 33
不幸的是,我认为他们虽然从这些注释中删除了这些选项卡:)在您的POST或GET中它将显示为%09