问题描述

我有一个简单的 html textarea 在我身边。现在,如果您点击其中的标签,它将进入下一个字段。我想让 tab 按钮缩进一些空格。我该怎么做?谢谢。

最佳解决方案

从类似问题的其他答案中大量借出 (下面发布)…

$(document).delegate('#textbox', 'keydown', function(e) {
  var keyCode = e.keyCode || e.which;

  if (keyCode == 9) {
    e.preventDefault();
    var start = $(this).get(0).selectionStart;
    var end = $(this).get(0).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).get(0).selectionStart =
    $(this).get(0).selectionEnd = start + 1;
  }
});

jQuery: How to capture the TAB keypress within a Textbox

How to handle in textarea?

http://jsfiddle.net/jz6J5/

次佳解决方案

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,并将启用页面上所有文本区域的标签功能。

第三种解决方案

如其他人所写,您可以使用 JavaScript 捕获事件,防止默认操作 (以便光标不移动焦点) 并插入制表符。

但是,禁用默认行为使得无法使用鼠标将焦点移出文本区域。盲人用户使用键盘与网页进行交互,没有其他内容 – 他们无法看到鼠标指针进行任何有用的操作,因此它是键盘或无。标签键是浏览文档,特别是表单的主要方式。覆盖 Tab 键的默认行为将使盲人不可能将焦点移动到下一个表单元素。

因此,如果您为广泛的受众群体编写了一个网站,我建议不要这样做,而不会有任何令人信服的理由,并为盲人提供某种替代方案,而不会将其陷入文本区域。

第四种方案

对于什么是值得的,这是我的 oneliner,你在这个主题中一直在谈论什么:



<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 的测试。

第五种方案

我在一个 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>

第六种方案

您必须编写 JS 代码才能捕获 TAB 键并插入一堆空格。与 JSFiddle 类似的东西。

检查 jquery fiddle

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');
  } 
});
​

第七种方案

基于 @kasdega 解决方案的 Multiple-line indetation 脚本。

$('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;
    }
});

第八种方案

该解决方案允许在整个选择中标签,如您的典型代码编辑器,也可以取消选择。但是,当没有选择时,我还没有想出如何实现 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://googleajax.admincdn.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>

第九种方案

基于所有人不得不在这里回答的答案,它只是一个 keydown(而不是 keyup)+ preventDefault() +在插入符号插入一个标签字符的组合。就像是:

var keyCode = e.keyCode || e.which;
if (keyCode == 9) {
   e.preventDefault();
   insertAtCaret('txt', 't')
}

早期的答案有一个工作的 jsfiddle,但它使用一个 alert() 在键下。如果你删除这个警报,那么它没有工作。我刚刚添加了一个函数来在 textarea 中的当前光标位置插入一个选项卡。

这是一个工作的 jsfiddle 相同:http://jsfiddle.net/nsHGZ/

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛