Użyj tabulatora, aby wciąć tekst w obszarze tekstu
143
Mam po swojej stronie prosty tekst w html. W tej chwili, jeśli klikniesz w nią kartę, przejdzie do następnego pola. Chciałbym zamiast tego, aby przycisk tabulatora wciskał kilka spacji. W jaki sposób mogę to zrobić? Dzięki.
Pożyczanie w dużym stopniu innych odpowiedzi na podobne pytania (zamieszczone poniżej) ...
$(document).delegate('#textbox','keydown',function(e){var keyCode = e.keyCode || e.which;if(keyCode ==9){
e.preventDefault();var start =this.selectionStart;varend=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 againthis.selectionStart =this.selectionEnd = start +1;}});
„$ (this) .get (0) .selectionStart”. Użyj po prostu „this.selectionStart”
Bohdan Yurov
Czy możesz to sprawić, aby działało z 4 spacjami zamiast \ t? Jeśli zamienisz \ t na "", wstawi to spacje, ale pozostawi karetkę.
Sinaesthetic
@Sinaesthetic - spóźniona odpowiedź, ale aby przesunąć kursor, ustaw ostatnią linię na „start + 4” zamiast „start + 1”
nevada_scout
4
Zwykle nie kopiuję kodu bezpośrednio ze Stackoverflow i nie wklejam go do mojego projektu i nie uruchamiam, ale kiedy to robię, był to ten kod. Dzięki za to.
Flat Cat
10
To przerywa funkcję cofania przeglądarki (Ctrl + 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;}}}
To rozwiązanie nie wymaga jQuery i zapewni funkcjonalność zakładek we wszystkich obszarach tekstowych na stronie.
Czy możesz to sprawić, aby działało z 4 spacjami zamiast \ t? Jeśli zamienisz \ t na "", wstawi to spacje, ale pozostawi karetkę.
Sinaesthetic
1
@Sinaesthetic: tak, możesz zmienić tabulator na spacje, ale musisz trochę dostosować kod (zamiast jednej są 3-4 nowe litery). Inną alternatywą jest rozmiar karty CSS.
Adrian Maire
@Sinaesthetic Tak, po prostu zastąpić ostatni wiersz this.selectionEnd = s+1;z this.selectionEnd = s + "\t".length;. Byłoby bardziej przejrzyste użycie zmiennej lub parametru funkcji i przechowywanie w nim znaków wcięcia. Ale wiesz, co teraz zastąpić: +1określa, o ile znaków zostanie przesunięty daszek.
Jak napisali inni, możesz użyć JavaScript do przechwycenia zdarzenia, zablokowania domyślnej akcji (aby kursor nie zmienił ostrości) i wstawienia znaku tabulacji.
Jednak wyłączenie domyślnego zachowania uniemożliwia przeniesienie fokusu poza obszar tekstowy bez użycia myszy. Niewidomi użytkownicy wchodzą w interakcję ze stronami internetowymi za pomocą klawiatury i nic więcej - nie widzą wskaźnika myszy, aby zrobić z nim cokolwiek użytecznego, więc jest to klawiatura lub nic innego. Klawisz tabulatora to podstawowy sposób poruszania się po dokumencie, a zwłaszcza po formularzach. Zastępowanie domyślnego zachowania klawisza tabulatora uniemożliwi niewidomym użytkownikom przeniesienie fokusu do następnego elementu formularza.
Tak więc, jeśli piszesz witrynę internetową dla szerokiego grona odbiorców, odradzam robienie tego bez ważnego powodu i zapewniam jakąś alternatywę dla niewidomych użytkowników, która nie uwięzi ich w obszarze tekstowym.
Dziękuję Ci. Nie chcę brzmieć niegrzecznie, ale nie wiedziałem, że niewidomi używają komputerów. Będę o tym pamiętać
user780483
10
W porządku, wiele osób nie wie; to jest poza ich doświadczeniem. Oto wprowadzenie: webaim.org/intro
Will Martin,
Tak, naprawdę zły pomysł, jeśli jest to witryna dla ogółu odbiorców. Oprócz użytkowników czytników ekranu istnieje wielu innych użytkowników, którzy z różnych powodów muszą lub decydują się na nawigację za pomocą klawiatury. Uwięzienie klawisza tabulatora sprawi, że formularz będzie co najmniej denerwujący i prawdopodobnie bezużyteczny dla tych użytkowników.
steveax
6
Może użyj control + tab. Spowoduje to przechwycenie możliwości przeglądarki na inne karty (strony internetowe), ale użytkownicy mogą po prostu wyrzucić kartę z pola tekstowego, a następnie sterować kartą do innej strony. Powinien mieć podpowiedź na stronie, użyj ctrl + tab dla tabulatora.
Joseph McIntyre
Dzięki @WillMartin Bardzo cenna informacja. Zamierzałem zaimplementować to samo w całym swoim blogu dla wszystkich tekstów bez rozważania tego bardzo kluczowego punktu.
Imran
40
Oto mój oneliner, o czym wszyscy mówiliście w tym wątku:
Jak mogę zmodyfikować ten kod, aby używał 4 spacji zamiast tabulatora? Próbowałem zrobić & nbsp; cztery razy, ale nadal zamieniało go w jedną spację.
jiaweizhang
5
NiCk, proszę powiedz mojej żonie. jiaweizhang, zamień „\ t” na „<4 spacje>”, a 1 na 4.
elgholm
1
Najlepsza odpowiedź!
Marco Demaio
1
Bardzo fajnie, tutaj jest na odwrót przez 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
Oto moja wersja tego, obsługuje:
Tab + Shift Tab
utrzymuje stos cofania dla prostego wstawiania znaków tabulacji
obsługuje wcięcie / cofanie wcięcia linii, ale kasuje cofanie stosu
prawidłowo zaznacza całe wiersze, gdy wcięcie / cofnięcie wcięcia bloku
obsługuje automatyczne wcięcie po naciśnięciu klawisza Enter (utrzymuje stos cofania)
użyj klawisza Escape anuluj obsługę na następnej karcie / klawisz Enter (abyś mógł nacisnąć klawisz Escape, a następnie tabulator)
Działa na Chrome + Edge, inne niesprawdzone.
$(function(){var enabled =true;
$("textarea.tabSupport").keydown(function(e){// Escape key toggles tab on/offif(e.keyCode==27){
enabled =!enabled;returnfalse;}// Enter Key?if(e.keyCode ===13&& enabled){// selection?if(this.selectionStart ==this.selectionEnd){// find start of the current linevar 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 visiblethis.blur();this.focus();returnfalse;}}}// Tab key?if(e.keyCode ===9&& enabled){// selection?if(this.selectionStart ==this.selectionEnd){// These single character operations are undoableif(!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 linesvar 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 textvar lines = text.substr(selStart, selEnd - selStart).split('\n');// Insert tabsfor(var i=0; i<lines.length; i++){// Don't indent last line if cursor at start of lineif(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);elseif(lines[i].startsWith(" "))
lines[i]= lines[i].substr(4);}else
lines[i]="\t"+ lines[i];}
lines = lines.join('\n');// Update the text areathis.value = text.substr(0, selStart)+ lines + text.substr(selEnd);this.selectionStart = selStart;this.selectionEnd = selStart + lines.length;}returnfalse;}
enabled =true;returntrue;});});
textarea
{width:100%;height:100px;tab-size:4;}
<scriptsrc="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><textareaclass="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>
Działa to bez jQuery przy odrobinie pracy. Aby uzyskać pomoc, wejdź na youmightnotneedjquery.com. Zdecydowanie najlepsza odpowiedź również tutaj.
Jamon Holmgren
10
Nowoczesny sposób, który oba są proste i nie tracą możliwości cofnięcia (Ctrl + Z) ostatnich zmian.
$('#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));}});
Ta funkcja jest przestarzała. Chociaż może nadal działać w niektórych przeglądarkach, odradza się jego używanie, ponieważ można go usunąć w dowolnym momencie. Staraj się go unikać.
To jest jedyna poprawna odpowiedź w tym momencie. Wielkie dzięki. 🙏
Chris Calo,
2
Niestety brak obsługi przeglądarki Firefox. Wypróbuj rozwiązanie indent-textareadla różnych przeglądarek, które wykorzystuje tę metodę + rezerwę w przeglądarce Firefox.
fregante
W przeglądarce Firefox document.execCommandzostaje włączona dopiero po ustawieniu document.designMode = "on";. Jestem w stanie napisać tekst do elementów, które mają .contentEditable = 'true'. Jednak gdy próbuję to osiągnąć na obszarze tekstowym, wstawiony element textNode zostaje umieszczony bezpośrednio przed obszarem tekstu w dokumencie (zamiast w obszarze tekstowym). Proszę spróbować pomóc Mozilla rysunek to tutaj .
Lonnie Best
Należy pamiętać, że ta strona nie jest już uważana za „nowoczesną”, strona, do której utworzono łącze, zauważa (o której execCommand): „Ta funkcja jest przestarzała. Chociaż może nadal działać w niektórych przeglądarkach, odradza się jego używanie, ponieważ można go usunąć w dowolnym momencie. Staraj się go unikać.
kasimir
9
Szybko nie osiągnąłem niczego, próbując użyć odpowiedzi @ kasdega w środowisku AngularJS, nic, co próbowałem, nie było w stanie zmusić Angulara do działania na zmianę. Więc na wypadek, gdyby było to przydatne dla przechodniów, oto przepisanie kodu @ kasdega w stylu AngularJS, który zadziałał dla mnie:
Bardzo ważne jest, aby zadzwonić element.triggerHandler('change');, w przeciwnym razie model nie zostanie zaktualizowany (ze względu na element.triggerHandler('change');myślę.
Alvaro Flaño Larrondo
6
Musisz napisać kod JS, aby złapać naciśnięcie klawisza TAB i wstawić kilka spacji. Coś podobnego do tego, co robi JSFiddle.
Jak dotąd najlepsze rozwiązanie, ale prawdopodobnie nie powinno tworzyć selekcji, kiedy start === end.
mpen
6
To rozwiązanie umożliwia tabulatorowanie całego zaznaczenia, tak jak w typowym edytorze kodu, a także usuwanie tego zaznaczenia. Jednak nie wymyśliłem, jak zaimplementować shift-tab, gdy nie ma wyboru.
$('#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;}});
<scriptsrc="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><textareaid="txtInput">
$(document).ready(function(){
$("#msgid").html("This is Hello World by JQuery");
});
</textarea>
Działa to dobrze, ale możesz przynajmniej ograniczyć tabulator shift bez wybierania błędów. Zrobiłem to za pomocą prostego if (selected.length > 0) {...}Fiddle: jsfiddle.net/jwfkbjkr
3
W oparciu o wszystko, co ludzie mieli tutaj do powiedzenia na temat odpowiedzi, jest to po prostu kombinacja keydown (nie keyup) + PreventDefault () + wstawia znak tabulacji na daszku. Coś jak:
var keyCode = e.keyCode || e.which;if(keyCode ==9){
e.preventDefault();
insertAtCaret('txt','\t')}
Wcześniejsza odpowiedź miała działający plik jsfiddle, ale używała alert () w keydown. Jeśli usuniesz ten alert, to nie zadziałało. Właśnie dodałem funkcję wstawiania tabulatora w bieżącej pozycji kursora w obszarze tekstu.
Widzę, że ten temat nie został rozwiązany. Zakodowałem to i działa bardzo dobrze. Wstawia tabulację w indeksie kursora. Bez używania jquery
<textareaid="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 Tabthis.value.slice(cIndex)].join('');//Join with the end
event.stopPropagation();
event.preventDefault();//Don't quit the areathis.selectionStart=cIndex+1;this.selectionEnd=cIndex+1;//Keep the cursor in the right index}});</script>
Zauważ, że użyłem wielu funkcji ES6 w tym fragmencie ze względu na prostotę, prawdopodobnie będziesz chciał przetransponować go (za pomocą Babel lub TypeScript) przed wdrożeniem.
Powyższe odpowiedzi na wszystkie wipe undo history. Dla każdego, kto szuka rozwiązania, które tego nie robi, ostatnią godzinę spędziłem na kodowaniu dla Chrome:
Jaka część tego skryptu działa tylko w przeglądarce Chrome? Czy to „TextEvent”? help.dottoro.com/lagstsiq.php/#TextEvent Ta strona twierdzi, że powinna działać również w IE9 + i Safari. Ponieważ potrzebuję tego do aplikacji Chrome, jest to idealne.
Andreas Linnert
@Andreas Linnert masz rację. Udokumentowano, że działa zarówno w przeglądarce IE, jak i Safari. Jednak w momencie pisania tego tekstu IE nie działał dla mnie i po prostu nie miałem czasu, aby się temu przyjrzeć i nie testowałem w Safari. Przepraszamy za zamieszanie. Cieszę się, że pomogłem.
iautomation
0
Na Github znajduje się biblioteka do obsługi kart w obszarach tekstowych autorstwa wjbryant: Tab Override
Tak to działa:
// get all the textarea elements on the pagevar textareas = document.getElementsByTagName('textarea');// enable Tab Override for all textareas
tabOverride.set(textareas);
Niezła odpowiedź, ale patrząc na kod, używa prawie takich samych technik, jak te opisane w niektórych odpowiedziach tutaj: github.com/wjbryant/taboverride/blob/master/src/… . Oznacza to, że nie zachowuje historii cofania, która jest głównym problemem.
mihai
0
Jako opcję powyższego kodu kasdega, zamiast dołączania tabulatora do bieżącej wartości, możesz zamiast tego wstawiać znaki w bieżącym punkcie kursora. Ma to tę zaletę, że:
umożliwia wstawienie 4 spacji jako alternatywy dla tabulatora
cofnij i ponów będzie działać z wstawionymi znakami (nie będzie z OP)
więc wymień
// set textarea value to: text before caret + tab + text after caret
$(this).val($(this).val().substring(0, start)+"\t"+ $(this).val().substring(end));
z
// set textarea value to: text before caret + tab + text after caret
document.execCommand("insertText",false,' ');
$.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;returnfalse;}returntrue;});returnthis;};
$("textarea").getTab();// You can also use $("input").getTab();
Musiałem zrobić funkcję, aby zrobić to samo, jest prosta w użyciu, po prostu skopiuj ten kod do swojego skryptu i użyj: enableTab( HTMLElement )HTMLelement będący czymś w rodzajudocument.getElementById( id )
Kod to:
function enableTab(t){t.onkeydown=function(t){if(9===t.keyCode){var e=this.value,n=this.selectionStart,i=this.selectionEnd;returnthis.value=e.substring(0,n)+" "+e.substring(i),this.selectionStart=this.selectionEnd=n+1,!1}}}
Każde wejście elementu textarea ma zdarzenie onkeydown. W module obsługi zdarzeń możesz zapobiec domyślnej reakcji klawisza tabulatora, używając zdarzenia event.preventDefault (), gdy event.keyCode ma wartość 9.
Następnie umieść znak tabulatora we właściwej pozycji:
$("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 Tabthis.value.slice(cIndex)].join('');//Join with the endevent.stopPropagation();event.preventDefault();//Don't quit the areathis.selectionStart=cIndex+1;this.selectionEnd=cIndex+1;//Keep the cursor in the right index}});
Odpowiedzi:
Pożyczanie w dużym stopniu innych odpowiedzi na podobne pytania (zamieszczone poniżej) ...
jQuery: Jak przechwycić naciśnięcie klawisza TAB w polu tekstowym
Jak obsłużyć <tab> w obszarze tekstowym?
http://jsfiddle.net/jz6J5/
źródło
To rozwiązanie nie wymaga jQuery i zapewni funkcjonalność zakładek we wszystkich obszarach tekstowych na stronie.
źródło
this.selectionEnd = s+1;
zthis.selectionEnd = s + "\t".length;
. Byłoby bardziej przejrzyste użycie zmiennej lub parametru funkcji i przechowywanie w nim znaków wcięcia. Ale wiesz, co teraz zastąpić:+1
określa, o ile znaków zostanie przesunięty daszek.KeyboardEvent.keyCode
iKeyboardEvent.which
są przestarzałymi właściwościami. UżyjKeyboardEvent.key
zamiast tego.Jak napisali inni, możesz użyć JavaScript do przechwycenia zdarzenia, zablokowania domyślnej akcji (aby kursor nie zmienił ostrości) i wstawienia znaku tabulacji.
Jednak wyłączenie domyślnego zachowania uniemożliwia przeniesienie fokusu poza obszar tekstowy bez użycia myszy. Niewidomi użytkownicy wchodzą w interakcję ze stronami internetowymi za pomocą klawiatury i nic więcej - nie widzą wskaźnika myszy, aby zrobić z nim cokolwiek użytecznego, więc jest to klawiatura lub nic innego. Klawisz tabulatora to podstawowy sposób poruszania się po dokumencie, a zwłaszcza po formularzach. Zastępowanie domyślnego zachowania klawisza tabulatora uniemożliwi niewidomym użytkownikom przeniesienie fokusu do następnego elementu formularza.
Tak więc, jeśli piszesz witrynę internetową dla szerokiego grona odbiorców, odradzam robienie tego bez ważnego powodu i zapewniam jakąś alternatywę dla niewidomych użytkowników, która nie uwięzi ich w obszarze tekstowym.
źródło
Oto mój oneliner, o czym wszyscy mówiliście w tym wątku:
Testuj w najnowszych wersjach przeglądarek Chrome, Firefox, Internet Explorer i Edge.
źródło
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;}}
Oto moja wersja tego, obsługuje:
źródło
Nowoczesny sposób, który oba są proste i nie tracą możliwości cofnięcia (Ctrl + Z) ostatnich zmian.
Więcej o
execCommand
:Edytować:
Jak wskazano w komentarzu (i chociaż było to kiedyś „nowoczesne” rozwiązanie ), funkcja stała się przestarzała. Cytując dokumenty:
źródło
indent-textarea
dla różnych przeglądarek, które wykorzystuje tę metodę + rezerwę w przeglądarce Firefox.document.execCommand
zostaje włączona dopiero po ustawieniudocument.designMode = "on";
. Jestem w stanie napisać tekst do elementów, które mają.contentEditable = 'true'
. Jednak gdy próbuję to osiągnąć na obszarze tekstowym, wstawiony element textNode zostaje umieszczony bezpośrednio przed obszarem tekstu w dokumencie (zamiast w obszarze tekstowym). Proszę spróbować pomóc Mozilla rysunek to tutaj .execCommand
): „Ta funkcja jest przestarzała. Chociaż może nadal działać w niektórych przeglądarkach, odradza się jego używanie, ponieważ można go usunąć w dowolnym momencie. Staraj się go unikać.Szybko nie osiągnąłem niczego, próbując użyć odpowiedzi @ kasdega w środowisku AngularJS, nic, co próbowałem, nie było w stanie zmusić Angulara do działania na zmianę. Więc na wypadek, gdyby było to przydatne dla przechodniów, oto przepisanie kodu @ kasdega w stylu AngularJS, który zadziałał dla mnie:
i:
źródło
element.triggerHandler('change');
, w przeciwnym razie model nie zostanie zaktualizowany (ze względu naelement.triggerHandler('change');
myślę.Musisz napisać kod JS, aby złapać naciśnięcie klawisza TAB i wstawić kilka spacji. Coś podobnego do tego, co robi JSFiddle.
Sprawdź skrzypce jQuery :
HTML :
JavaScript :
źródło
event.preventDefault();
e.keyCode || e.which
.Skrypt wielowierszowy oparty na rozwiązaniu @kasdega.
źródło
start === end
.To rozwiązanie umożliwia tabulatorowanie całego zaznaczenia, tak jak w typowym edytorze kodu, a także usuwanie tego zaznaczenia. Jednak nie wymyśliłem, jak zaimplementować shift-tab, gdy nie ma wyboru.
źródło
if (selected.length > 0) {...}
Fiddle: jsfiddle.net/jwfkbjkrW oparciu o wszystko, co ludzie mieli tutaj do powiedzenia na temat odpowiedzi, jest to po prostu kombinacja keydown (nie keyup) + PreventDefault () + wstawia znak tabulacji na daszku. Coś jak:
Wcześniejsza odpowiedź miała działający plik jsfiddle, ale używała alert () w keydown. Jeśli usuniesz ten alert, to nie zadziałało. Właśnie dodałem funkcję wstawiania tabulatora w bieżącej pozycji kursora w obszarze tekstu.
Oto działający jsfiddle dla tego samego: http://jsfiddle.net/nsHGZ/
źródło
Widzę, że ten temat nie został rozwiązany. Zakodowałem to i działa bardzo dobrze. Wstawia tabulację w indeksie kursora. Bez używania jquery
źródło
Przytrzymaj ALT i naciśnij 0,9 na klawiaturze numerycznej. Działa w Google Chrome
źródło
Stworzyłem taki, do którego możesz uzyskać dostęp za pomocą dowolnego elementu textarea, który lubisz:
A element wyglądałby tak:
źródło
Najprostszym sposobem znalazłem to zrobić w nowoczesnych przeglądarkach z wanilii JavaScript jest:
Zauważ, że użyłem wielu funkcji ES6 w tym fragmencie ze względu na prostotę, prawdopodobnie będziesz chciał przetransponować go (za pomocą Babel lub TypeScript) przed wdrożeniem.
źródło
Powyższe odpowiedzi na wszystkie wipe undo history. Dla każdego, kto szuka rozwiązania, które tego nie robi, ostatnią godzinę spędziłem na kodowaniu dla Chrome:
Krótko mówiąc, zakładki są wstawiane na początku wybranych wierszy.
JSFiddle: http://jsfiddle.net/iausallc/5Lnabspr/11/
Streszczenie: https://gist.github.com/iautomation/e53647be326cb7d7112d
Przykładowe użycie:
$('textarea').enableTabs('\t')
Wady: działa tylko w Chrome, jak jest.
źródło
Na Github znajduje się biblioteka do obsługi kart w obszarach tekstowych autorstwa wjbryant: Tab Override
Tak to działa:
źródło
Jako opcję powyższego kodu kasdega, zamiast dołączania tabulatora do bieżącej wartości, możesz zamiast tego wstawiać znaki w bieżącym punkcie kursora. Ma to tę zaletę, że:
więc wymień
z
źródło
źródło
Wypróbuj tę prostą funkcję jQuery:
źródło
Musiałem zrobić funkcję, aby zrobić to samo, jest prosta w użyciu, po prostu skopiuj ten kod do swojego skryptu i użyj:
enableTab( HTMLElement )
HTMLelement będący czymś w rodzajudocument.getElementById( id )
Kod to:
źródło
Każde wejście elementu textarea ma zdarzenie onkeydown. W module obsługi zdarzeń możesz zapobiec domyślnej reakcji klawisza tabulatora, używając zdarzenia event.preventDefault (), gdy event.keyCode ma wartość 9.
Następnie umieść znak tabulatora we właściwej pozycji:
html
źródło
źródło
Prosty samodzielny skrypt:
źródło
Jeśli naprawdę potrzebujesz zakładek, skopiuj kartę ze słowa lub notatnika i wklej ją w polu tekstowym, w którym chcesz
1 2 3
12 22 33,
Niestety myślę, że usunęli zakładki z tych komentarzy :) Będzie on wyświetlany jako% 09 w Twoim POST lub GET
źródło