Verwenden Sie die Registerkarte, um den Textbereich einzurücken


143

Ich habe einen einfachen HTML-Textbereich auf meiner Seite. Wenn Sie jetzt auf die Registerkarte klicken, wird das nächste Feld angezeigt. Ich möchte stattdessen die Tabulatortaste ein paar Leerzeichen einrücken. Wie kann ich das machen? Vielen Dank.


Dies ist mit JavaScript möglich und mit einer JS-Bibliothek fast einfach. Können Sie eine dieser Optionen verwenden?
David sagt, Monica

Was ist deine Umgebung? Javascript, Jquery, noch etwas?
Kasdega

@ David Ich kann jeden von diesen akut verwenden
user780483

Ich würde jquery mit einer Kombination aus .focus () und .keydown ()
kasdega

Antworten:


120

In hohem Maße von anderen Antworten auf ähnliche Fragen entlehnt (siehe unten) ...

$(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: So erfassen Sie den TAB-Tastendruck in einem Textfeld

Wie gehe ich mit <tab> im Textbereich um?

http://jsfiddle.net/jz6J5/


13
"$ (this) .get (0) .selectionStart". Verwenden Sie nur "this.selectionStart"
Bohdan Yurov

Können Sie dies mit 4 Leerzeichen anstelle von \ t zum Laufen bringen? Wenn Sie \ t durch "" ersetzen, werden die Leerzeichen eingefügt, das Caret bleibt jedoch zurück.
Sinaesthetic

@Sinaesthetic - späte Antwort, aber um das Caret zu verschieben, stellen Sie die letzte Zeile auf "Start + 4" anstelle von "Start + 1" ein
nevada_scout

4
Normalerweise kopiere ich Code nicht direkt aus Stackoverflow und füge ihn in mein Projekt ein und lasse ihn funktionieren, aber wenn ich das tue, war es dieser Code. Danke dafür.
Flat Cat

10
Dies unterbricht die Rückgängig-Funktion des Browsers (Strg + z).
01AutoMonkey

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

Diese Lösung erfordert kein jQuery und aktiviert die Registerkartenfunktionalität für alle Textbereiche auf einer Seite.


Können Sie dies mit 4 Leerzeichen anstelle von \ t zum Laufen bringen? Wenn Sie \ t durch "" ersetzen, werden die Leerzeichen eingefügt, das Caret bleibt jedoch zurück.
Sinaesthetic

1
@Sinaesthetic: Ja, Sie können die Registerkarte in Leerzeichen ändern, aber Sie müssen den Code ein wenig anpassen (es gibt 3-4 neue Buchstaben anstelle von einem). Die andere Alternative ist die CSS-Registerkartengröße.
Adrian Maire

@Sinaesthetic Ja, ersetzen Sie einfach die letzte Zeile this.selectionEnd = s+1;durch this.selectionEnd = s + "\t".length;. Es wäre sauberer, eine Variable oder einen Funktionsparameter zu verwenden und die Einrückungszeichen dort zu speichern. Aber Sie wissen jetzt, was Sie ersetzen müssen: Das +1definiert, wie viel Zeichen das Caret bewegt.
StanE

2
KeyboardEvent.keyCodeund KeyboardEvent.whichsind veraltete Eigenschaften. Verwenden Sie KeyboardEvent.keystattdessen.
19онстантин Ван

48

Wie andere geschrieben haben, können Sie das Ereignis mit JavaScript erfassen, die Standardaktion verhindern (damit der Cursor den Fokus nicht verschiebt) und ein Tabulatorzeichen einfügen.

Durch Deaktivieren des Standardverhaltens ist es jedoch unmöglich, den Fokus ohne Verwendung einer Maus aus dem Textbereich zu verschieben. Blinde Benutzer interagieren mit Webseiten über die Tastatur und nichts anderes - sie können den Mauszeiger nicht sehen, um etwas Nützliches damit zu tun, also ist es Tastatur oder nichts. Die Tabulatortaste ist die primäre Methode zum Navigieren im Dokument und insbesondere in Formularen. Durch Überschreiben des Standardverhaltens der Tabulatortaste können blinde Benutzer den Fokus nicht auf das nächste Formularelement verschieben.

Wenn Sie also eine Website für ein breites Publikum schreiben, würde ich davon abraten, dies ohne zwingenden Grund zu tun , und blinden Benutzern eine Alternative bieten, die sie nicht im Textbereich einfängt.


2
Danke. Ich wollte nicht unhöflich klingen, aber ich wusste nicht, dass Blinde Computer benutzen. Ich werde dies im Hinterkopf behalten
user780483

10
Das ist okay, viele Leute wissen es nicht; es ist nur außerhalb ihrer Erfahrung. Hier ist eine Einführung: webaim.org/intro
Will Martin

Ja, wirklich schlechte Idee, wenn dies eine Website für das allgemeine Publikum ist. Neben Bildschirmlesebenutzern gibt es viele andere Benutzer, die aus verschiedenen Gründen entweder mit der Tastatur navigieren müssen oder möchten. Durch das Überfüllen der Tabulatortaste wird das Formular für diese Benutzer zumindest ärgerlich und möglicherweise unbrauchbar.
Steveax

6
Verwenden Sie möglicherweise Strg + Tab. Dadurch wird die Fähigkeit des Browsers auf andere Registerkarten (Webseiten) erhöht, aber Benutzer können einfach aus dem Textfeld heraus tabulieren und dann die Registerkarte auf die andere Seite steuern. Sollte ein Hinweis auf der Seite vorhanden sein, verwenden Sie Strg + Tab für Tab.
Joseph McIntyre

Danke @WillMartin Sehr wertvolle Information. Ich wollte dasselbe in meinem gesamten Blog für alle Textbereiche implementieren, ohne diesen sehr entscheidenden Punkt zu berücksichtigen.
Imran

40

Für das, was es wert ist, hier ist mein Oneliner, für das, worüber Sie alle in diesem Thread gesprochen haben:

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

Test in den neuesten Editionen von Chrome, Firefox, Internet Explorer und Edge.


Sie, Sir, sind unglaublich.
NiCk Newman

1
Wie kann ich diesen Code so ändern, dass 4 Leerzeichen anstelle eines Tabulators verwendet werden? Ich habe versucht, & nbsp; viermal, aber es wandelte es immer noch in einen einzigen Raum um.
Jiaweizhang

5
NiCk, bitte sag es meiner Frau. jiaweizhang, ersetze '\ t' durch '<4 Leerzeichen>' und 1 durch 4.
elgholm

1
Die beste Antwort!
Marco Demaio

1
Sehr ordentlich, hier ist das Gegenteil über 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

Hier ist meine Version davon, unterstützt:

  • Tab + Shift Tab
  • Behält den Rückgängig-Stapel für einfache Tabulatorzeicheneinfügungen bei
  • Unterstützt Block Line Indent / Unindent, aber Papierkorb machen Stack rückgängig
  • Wählt ganze Zeilen richtig aus, wenn Blockeinzug / Einrückung blockiert ist
  • unterstützt den automatischen Einzug beim Drücken der Eingabetaste (behält den Rückgängig-Stapel bei)
  • Verwenden Sie die Unterstützung zum Abbrechen der Escape-Taste auf der nächsten Registerkarte / Eingabetaste (damit Sie die Esc-Taste drücken und dann die Tabulatortaste drücken können).
  • Funktioniert mit Chrome + Edge, andere nicht getestet.

$(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
Dies ist die beste Antwort hier.
FourCinnamon0

Dies funktioniert ohne jQuery mit ein wenig Arbeit. Überprüfen Sie youmightnotneedjquery.com auf Hilfe. Auf jeden Fall auch hier die beste Antwort.
Jamon Holmgren

10

Moderne Methode, bei der beide unkompliziert sind und nicht die Fähigkeit verlieren, die letzten Änderungen rückgängig zu machen (Strg + 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));
    }
});

Mehr zu execCommand:


Bearbeiten:

Wie im Kommentar erwähnt (und obwohl dies einst eine "moderne" Lösung war ), ist die Funktion veraltet. Zitieren der Dokumente:

Diese Funktion ist veraltet. Obwohl es in einigen Browsern möglicherweise noch funktioniert, wird von seiner Verwendung abgeraten, da es jederzeit entfernt werden kann. Vermeiden Sie es.


3
Dies ist derzeit die einzig richtige Antwort. Vielen Dank. 🙏
Chris Calo

2
Leider keine Firefox-Unterstützung. Versuchen Sie es indent-textareamit einer browserübergreifenden Lösung, die diese Methode + einen Fallback in Firefox verwendet.
fregante

In Firefox wird document.execCommanderst nach dem Einstellen aktiviertdocument.designMode = "on"; . Ich bin in der Lage, Text in Elemente zu schreiben, die haben .contentEditable = 'true'. Wenn ich jedoch versuche, dies in einem Textbereich zu erreichen, wird der eingefügte textNode direkt vor dem Textbereich innerhalb des Dokuments platziert (anstatt in den Textbereich). Bitte versuchen Sie diese Mozilla Abbildung , um zu helfen hier .
Lonnie Best

Beachten Sie, dass dies nicht mehr als "modern" betrachtet wird. Die Seite, die Sie verlinkt haben, enthält Anmerkungen (zu execCommand): "Diese Funktion ist veraltet. Obwohl es in einigen Browsern möglicherweise noch funktioniert, wird von seiner Verwendung abgeraten, da es jederzeit entfernt werden kann. Versuche es zu vermeiden. '
Kasimir

9

Ich kam nicht schnell dahin, @ kasdegas Antwort in einer AngularJS-Umgebung zu verwenden. Nichts, was ich versuchte, schien Angular dazu zu bringen, auf die Änderung zu reagieren. Für den Fall, dass es für Passanten von Nutzen ist, hier eine Neufassung von @ kasdegas Code im AngularJS-Stil, der für mich funktioniert hat:

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

und:

<textarea ng-model="mytext" ng-allow-tab></textarea>

Es ist sehr wichtig anzurufen element.triggerHandler('change');, sonst wird das Modell nicht aktualisiert (wegen der element.triggerHandler('change');ich denke.
Alvaro Flaño Larrondo

6

Sie müssen JS-Code schreiben, um den TAB-Tastendruck abzufangen und eine Reihe von Leerzeichen einzufügen. Ähnlich wie JSFiddle.

Überprüfen Sie jquery Geige :

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
Vergessen Sie nicht, auch die Standardaktion zu verhindern. event.preventDefault();
Ryan

2
Live wurde in neueren Versionen durch on ersetzt.
Eric Harms

Die Eigenschaft event.which normalisiert event.keyCode und event.charCode . Sie sollten nicht überprüfen müssen e.keyCode || e.which.
Trevor

6

Mehrzeiliges Indetationsskript basierend auf der @ kasdega-Lösung.

$('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
Bisher beste Lösung, aber es sollte wahrscheinlich keine Auswahl erstellen, wenn start === end.
Mpen

6

Diese Lösung ermöglicht das Tabulieren einer gesamten Auswahl wie bei einem typischen Code-Editor und das Deaktivieren dieser Auswahl. Ich habe jedoch nicht herausgefunden, wie Shift-Tab implementiert werden soll, wenn keine Auswahl vorhanden ist.

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


Dies funktioniert gut, aber Sie können zumindest die Umschalttabelle einschränken, ohne eine Auswahl aus Wurffehlern zu treffen. Ich habe es mit einfacher if (selected.length > 0) {...}Geige gemacht: jsfiddle.net/jwfkbjkr

3

Basierend auf all dem, was die Leute hier zu den Antworten zu sagen hatten, ist es nur eine Kombination aus Keydown (nicht Keyup) + PreventDefault () + Einfügen eines Tabulatorzeichens in das Caret. Etwas wie:

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

Die frühere Antwort hatte eine funktionierende jsfiddle, verwendete jedoch einen Alarm () bei Keydown. Wenn Sie diese Warnung entfernen, hat sie nicht funktioniert. Ich habe gerade eine Funktion hinzugefügt, um eine Registerkarte an der aktuellen Cursorposition im Textbereich einzufügen.

Hier arbeitet jsfiddle für dasselbe: http://jsfiddle.net/nsHGZ/


3

Ich sehe, dass dieses Thema nicht gelöst ist. Ich habe das codiert und es funktioniert sehr gut. Es wird eine Tabelle am Cursorindex eingefügt. Ohne jquery zu benutzen

<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
Dieser Code bringt den Rückgängig-Stapel jedoch durcheinander. Nach dem Einfügen einer Registerkarte können Sie manchmal nichts rückgängig machen oder nur 1-2 Schritte zurück.
Magnus Eriksson

2

Halten Sie ALT gedrückt und drücken Sie 0,9 auf dem Ziffernblock. Es funktioniert in Google-Chrome


2

Ich habe eine erstellt, auf die Sie mit jedem beliebigen Textbereichselement zugreifen können:

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

Und das Element würde so aussehen:

<textarea onkeydown="textControl(this,event)"></textarea>

2

Der einfachste Weg , dies in modernen Browsern mit Vanille-JavaScript zu tun, ist:

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

Beachten Sie, dass ich in diesem Snippet der Einfachheit halber viele ES6-Funktionen verwendet habe. Sie sollten es wahrscheinlich (mit Babel oder TypeScript) transpilieren, bevor Sie es bereitstellen.


1

Die obigen Antworten beantworten alle Löschvorgänge. Für alle, die nach einer Lösung suchen, die dies nicht tut, habe ich die letzte Stunde damit verbracht, Folgendes für Chrome zu programmieren:

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

Kurz gesagt, am Anfang der ausgewählten Zeilen werden Registerkarten eingefügt.

JSFiddle: http://jsfiddle.net/iausallc/5Lnabspr/11/

Inhalt: https://gist.github.com/iautomation/e53647be326cb7d7112d

Anwendungsbeispiel: $('textarea').enableTabs('\t')

Nachteile: Funktioniert nur in Chrome wie es ist.


Welcher Teil dieses Skripts funktioniert nur in Chrome? Ist es das "TextEvent"? help.dottoro.com/lagstsiq.php/#TextEvent Diese Site sagt, dass es auch in IE9 + und Safari funktionieren sollte. Da ich dies für eine Chrome App benötige, ist dies perfekt.
Andreas Linnert

@Andreas Linnert du hast recht. Es ist dokumentiert, dass es sowohl in IE als auch in Safari funktioniert. Zum Zeitpunkt dieses Schreibens funktionierte der IE jedoch nicht für mich, und ich hatte einfach keine Zeit, mich weiter damit zu befassen, und ich hatte nicht in Safari getestet. Entschuldigung für die Verwirrung. Ich bin froh, geholfen zu haben.
iautomation

0

Auf Github gibt es eine Bibliothek zur Unterstützung von Registerkarten in Ihren Textbereichen von wjbryant: Tab Override

So funktioniert es:

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

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

Keine schlechte Antwort, aber beim Betrachten des Codes werden fast dieselben Techniken verwendet wie in einigen der Antworten hier beschrieben: github.com/wjbryant/taboverride/blob/master/src/… . Dies bedeutet, dass der Rückgängig-Verlauf nicht beibehalten wird, was das Hauptproblem ist.
Mihai

0

Als Option zum obigen Kasdega-Code können Sie anstelle der Registerkarte an den aktuellen Wert Zeichen am aktuellen Cursorpunkt einfügen. Dies hat den Vorteil von:

  • Ermöglicht das Einfügen von 4 Leerzeichen als Alternative zur Registerkarte
  • Rückgängig und Wiederherstellen funktioniert mit den eingefügten Zeichen (nicht mit dem OP)

also ersetzen

    // set textarea value to: text before caret + tab + text after caret
    $(this).val($(this).val().substring(0, start)
                + "\t"
                + $(this).val().substring(end));

mit

    // 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

Probieren Sie diese einfache jQuery-Funktion aus:

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

Ich musste eine Funktion erstellen, um dasselbe zu tun. Es ist einfach zu verwenden. Kopieren Sie einfach diesen Code in Ihr Skript und verwenden Sie: enableTab( HTMLElement )HTMLelement ist so etwas wiedocument.getElementById( id )


Der Code lautet:

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

Jede Eingabe eines Textarea-Elements hat ein Onkeydown-Ereignis. Im Ereignishandler können Sie die Standardreaktion der Tabulatortaste verhindern, indem Sie event.preventDefault () verwenden, wenn event.keyCode 9 ist.

Setzen Sie dann ein Tabulatorzeichen an die richtige Stelle:

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

Einfaches eigenständiges Skript:

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

Wenn Sie wirklich Registerkarten benötigen, kopieren Sie eine Registerkarte aus dem Wort oder Notizblock und fügen Sie sie in das gewünschte Textfeld ein

1 2 3

12 22 33

Leider denke ich, dass sie die Tabs aus diesen Kommentaren entfernen :) Es wird als% 09 in Ihrem POST oder GET angezeigt


2
Ich denke, das ist eine Antwort, wenn auch eine wirklich schlechte. Es wird ein alternativer Ansatz vorgeschlagen, dh dem Endbenutzer eine Problemumgehung zu geben.
GS - Entschuldigen Sie sich bei Monica
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.