タブを使用してテキストエリアをインデント


143

私の側にはシンプルなHTMLテキストエリアがあります。現在、タブをクリックすると、次のフィールドに移動します。代わりに、タブボタンをいくつかのスペースをインデントさせたいと思います。これどうやってするの?ありがとう。


これはJavaScriptで実行でき、JSライブラリを使用するとほとんど簡単です。これらのオプションのいずれかを使用できますか?
デビッドはモニカ

あなたの環境は何ですか?Javascript、Jquery、何か他のもの?
kasdega

@davidそれらのどれでも実際に使用できます
user780483

私は.focus()と.keydown()の組み合わせでjqueryを使用します
kasdega

回答:


120

同様の質問に対する他の回答から大量に借用する(以下に投稿)...

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

jQuery:テキストボックス内でTABキープレスをキャプチャする方法

textareaで<tab>を処理する方法は?

http://jsfiddle.net/jz6J5/


13
「$(this).get(0).selectionStart」。「this.selectionStart」だけを使用してください
Bohdan Yurov 2014年

\ tの代わりに4つのスペースでこれを機能させることができますか?\ tを ""に置き換えると、スペースが挿入されますが、キャレットは残ります。
Sinaesthetic 2014年

@Sinaesthetic-遅い返信ですが、キャレットを移動するには、最後の行を「start + 1」ではなく「start + 4」になるように調整します
nevada_scout

4
私は通常、Stackoverflowから直接コードをコピーしてプロジェクトに貼り付けて機能させることはしませんが、そうしたのはこのコードでした。これをありがとう。
Flat Cat

10
これにより、ブラウザの元に戻す機能が無効になります(Ctrl + z)。
01AutoMonkey 2017年

54
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を必要とせず、ページ上のすべてのテキストエリアでタブ機能を有効にします。


\ tの代わりに4つのスペースでこれを機能させることができますか?\ tを ""に置き換えると、スペースが挿入されますが、キャレットは残ります。
Sinaesthetic 2014年

1
@Sinaesthetic:はい、タブをスペースに変更できますが、コードを少し変更する必要があります(1つではなく3〜4つの新しい文字があります)。他の選択肢はCSSのタブサイズです。
Adrian Maire、2015

@Sinaestheticはい、最後の行this.selectionEnd = s+1;を単にに置き換えthis.selectionEnd = s + "\t".length;ます。変数または関数のパラメーターを使用してインデント文字をそこに格納する方がきれいです。しかし、今何を置き換えるかがわかり+1ます。は、キャレットを移動する文字数を定義します。
StanE 2016年

2
KeyboardEvent.keyCodeおよびKeyboardEvent.which非推奨のプロパティです。KeyboardEvent.key代わりに使用してください。
КонстантинВан

48

他の人が書いたように、JavaScriptを使用してイベントをキャプチャし、デフォルトのアクションを回避して(カーソルがフォーカスを移動しないようにする)、タブ文字を挿入できます。

ただし、デフォルトの動作を無効にすると、マウスを使用せずにテキスト領域の外にフォーカスを移動することができなくなります。視覚障害のあるユーザーは、キーボードを使用してWebページを操作するだけで、マウスポインターを見て何か便利なことを行うことができないため、キーボードか何も使用しません。タブキーは、ドキュメント、特にフォームをナビゲートする主要な方法です。タブキーのデフォルトの動作をオーバーライドすると、視覚障害のあるユーザーがフォーカスを次のフォーム要素に移動できなくなります。

ですから、もしあなたが広範囲の聴衆のためにウェブサイトを書いているなら、私はやむを得ない理由なしにこれを行うことをお勧めしません。


2
ありがとうございました。私は無礼を言うつもりはありませんが、目の不自由な人がコンピュータを使用していることは知りませんでした。私はこれを心に留めておきます
user780483 2011

10
それは大丈夫です、多くの人は知りません。それは彼らの経験のすぐ外です。概要
Will Martin

これが一般ユーザー向けのWebサイトである場合、本当に悪い考えです。スクリーンリーダーのユーザーに加えて、さまざまな理由でキーボードを使用してナビゲートする必要がある、または選択するユーザーが他にもたくさんいます。タブキーをトラップすると、フォームが少なくとも煩わしくなり、これらのユーザーがフォームを使用できなくなる可能性があります。
steveax 2013

6
たぶん、コントロール+タブを使用します。これにより、ブラウザの機能が他のタブ(ウェブページ)にハイジャックされますが、ユーザーはテキストボックスからタブで移動し、タブを他のページに制御できます。ページにヒントがあるはずです。タブにはctrl + tabを使用してください。
ジョセフマッキンタイア

ありがとう@WillMartin非常に貴重な情報。この非常に重要なポイントを考慮せずに、すべてのtextareaについてブログ全体に同じことを実装するつもりでした。
Imran

40

それが価値があるもののために、ここに私のワンライナーがあります、あなたがすべてこのスレッドで話していることのために:

<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の最新版でのテスト。


あなたは素晴らしいです
NiCkニューマン

1
タブの代わりに4つのスペースを使用するようにこのコードを変更するにはどうすればよいですか?やってみました&nbsp; 4回ですが、それでもそれを単一のスペースに変換しました。
jiaweizhang

5
NiCk、妻に教えてください。jiaweizhangは、交換してください'\ t'の持つ'<4個のスペース>' 4とし、1
elgholm

1
ベストアンサー!
Marco Demaio 2018

1
非常にきちんとした、ここでSHIFTを介した逆は次のとおりです。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;}}
DonFuchs

12

これが私のバージョンです、サポート:

  • タブ+シフトタブ
  • 単純なタブ文字挿入のための取り消しスタックを維持します
  • ブロック行のインデント/インデント解除をサポートしますが、ゴミ箱はスタックを元に戻します
  • ブロックのインデント/インデント解除時に行全体を適切に選択する
  • Enterキーを押したときの自動インデントをサポート(元に戻すスタックを維持)
  • 次のタブ/ Enterキーでエスケープキーキャンセルサポートを使用する(エスケープを押してからタブアウトできるようにする)
  • まだテストされていないChrome + Edgeで動作します。

$(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>


1
これがここでの最良の答えです。
FourCinnamon0 2018年

これはjQueryがなくても機能し、少しの作業が必要です。youmightnotneedjquery.comでヘルプを確認してください。ここも間違いなく最良の答えです。
Jamon Holmgren

10

両方が簡単で、最後の変更を元に戻す(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


編集:

コメントで指摘されたように(かつ、これはかつて「モダンな」ソリューションでしたが)、機能は廃止されました。ドキュメントを引用:

この機能は廃止されました。一部のブラウザでは引き続き機能する可能性がありますが、いつでも削除できるため、使用は推奨されません。使用しないようにしてください。


3
これが現時点での唯一の正解です。どうもありがとうございました。🙏
クリス・カロ

2
残念ながらFirefoxはサポートしていません。indent-textareaこの方法とFirefoxのフォールバックを使用するクロスブラウザーソリューションを試してください。
-fregante

Firefoxでは、を設定した後にdocument.execCommandのみ有効になりますdocument.designMode = "on";。を含む要素に書き込むテキストを取得できます.contentEditable = 'true'。ただし、これをtextareaで実行しようとすると、挿入されたtextNodeが(textarea内ではなく)ドキュメント内のtextareaの直前に配置されます。Mozillaがこれをここで理解できるように支援してください
ロニーベスト

これは「モダン」とは見なされなくなったことに注意してください。リンクしたページ(についてexecCommand):「この機能は廃止されました。一部のブラウザでは引き続き機能する可能性がありますが、いつでも削除できるため、使用は推奨されません。それを使用しないようにしてください。」
カシミール

9

私は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');私は思います。
アルバロFlañoLarrondo

6

あなたは、タブキーの押下をキャッチし、スペースの束を挿入するためにJSコードを書かなければなりません。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');
  } 
});

2
デフォルトのアクションも防止することを忘れないでください。event.preventDefault();
ライアン

2
新しいバージョンでは、Liveがonに置き換えられました。
Eric Harms 2013年

event.whichプロパティは、event.keyCodeおよびevent.charCodeを正規化します。確認する必要はありませんe.keyCode || e.which
Trevor

6

@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;
    }
});

1
これまでのところ最良の解決策ですが、おそらく選択を作成するべきではありませんstart === end
mpen 2015

6

このソリューションでは、通常のコードエディターのように選択全体をタブで移動し、その選択をタブ解除することもできます。しかし、何も選択されていないときに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

3

人々が答えに関してここで言わなければならなかったことすべてに基づいて、それはkeydown(keyupではない)+ preventDefault()+キャレットにタブ文字を挿入するだけの組み合わせです。何かのようなもの:

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

以前の回答にはjsfiddleが機能していましたが、キーダウン時にalert()を使用していました。このアラートを削除すると、機能しませんでした。テキストエリアの現在のカーソル位置にタブを挿入する関数を追加しました。

ここで同じために動作するjsfiddle:http ://jsfiddle.net/nsHGZ/


3

この問題は解決されていません。私はこれをコーディングし、それは非常にうまく機能しています。カーソルインデックスに表を挿入します。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>

2
ただし、このコードは元に戻すスタックを破壊します。使用後、タブを挿入すると、元に戻せなくなったり、1〜2ステップ戻るだけになることがあります。
マグナスエリクソン2018

2

Altキーを押しながらテンキーから0,9を押します。google-chromeで動作します


2

私はあなたが好きな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>

2

最も簡単な方法は、私はそれを行うことがわかっ最近のブラウザではバニラの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を使用して)トランスパイルすることをお勧めします。


1

上記はすべての取り消し履歴のワイプに答えます。それを行わないソリューションを探している人のために、私は最後の1時間を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でのみ機能します。


このスクリプトのどの部分がChromeでのみ機能しますか?「TextEvent」ですか?help.dottoro.com/lagstsiq.php/#TextEventこのサイトは、IE9 +とSafariでも動作するはずであると述べています。Chromeアプリではこれが必要なので、これは完璧です。
Andreas Linnert

@Andreas Linnert正解です。IEとSafariの両方で動作することが文書化されています。ただし、この記事の執筆時点では、IEは機能していなかったため、詳細に調べる時間もなかったため、Safariでテストしていませんでした。混乱をお詫びします。手伝ってよかったです。
iautomation 2015

0

wjbryantによるテキストエリアでのタブサポート用のGithubにライブラリがあります:タブのオーバーライド

これがどのように機能するかです:

// get all the textarea elements on the page
var textareas = document.getElementsByTagName('textarea');

// enable Tab Override for all textareas
tabOverride.set(textareas);

悪い答えではありませんが、コードを見ると、github.com / wjbryant / taboverride / blob / master / src / …の回答のいくつかで説明されているものとほぼ同じ手法を使用しています。これは、主な問題である取り消し履歴を保持しないことを意味します。
mihai

0

上記のkasdegaのコードのオプションとして、現在の値にタブを追加する代わりに、現在のカーソルポイントに文字を挿入できます。これには次の利点があります。

  • タブの代わりに4つのスペースを挿入できます
  • 元に戻すとやり直しは、挿入された文字で機能します(OPでは機能しません)

だから交換

    // 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, '    ');

-1
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;
    }
}

-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();

-1

私は同じことをする関数を作らなければなりませんでした、それは使うのが簡単です、このコードをあなたのスクリプトにコピーして使用するだけです: enableTab( HTMLElement ) HTML要素は次のようなものです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}}}

-1

textarea要素のすべての入力には、onkeydownイベントがあります。イベントハンドラーでは、event.preventDefault()を使用して、タブキーのデフォルトの反応を防止できます。 event.keyCodeが9のときは常に。

次に、タブ記号を正しい位置に配置します。

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>

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

-1

シンプルなスタンドアロンスクリプト:

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;
        }
    }
}

-3

タブが本当に必要な場合は、単語またはメモ帳からタブをコピーして、テキストボックスに貼り付けます。

1 2 3

12 22 33

残念ながら私は彼らがこれらのコメントからタブを削除すると思います:)それはあなたのPOSTまたはGETで%09と表示されます


2
本当に悪い答えですが、これは答えだと思います。これは、代替アプローチ、つまりエンドユーザーに回避策を提供することを提案しています。
GS-2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.