탭을 사용하여 텍스트 영역에 들여 쓰기


143

내 편에는 간단한 html 텍스트 영역이 있습니다. 탭을 클릭하면 다음 필드로 이동합니다. 대신 탭 버튼을 몇 칸 들여 쓰기하고 싶습니다. 어떻게해야합니까? 감사.


이것은 JavaScript로 가능하며 JS 라이브러리를 사용하면 거의 쉽습니다. 이러한 옵션 중 하나를 사용할 수 있습니까?
데이비드 모니카는

당신의 환경은 무엇입니까? 자바 스크립트, Jquery, 다른 것?
kasdega

@ david 나는 그 중 하나를 acutually 사용할 수 있습니다
user780483

jquery를 .focus ()와 .keydown ()의 조합으로 사용합니다
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 키 누르기를 캡처하는 방법

텍스트 영역에서 <tab>을 처리하는 방법은 무엇입니까?

http://jsfiddle.net/jz6J5/


13
"$ (this) .get (0) .selectionStart". "this.selectionStart"만 사용하십시오
Bohdan Yurov

\ t 대신 4 개의 공백으로 작업 할 수 있습니까? \ t를 ""로 바꾸면 공백이 삽입되지만 캐럿은 남겨 둡니다.
Sinaesthetic

@Sinaesthetic-늦은 답변이지만 캐럿을 이동하려면 'start + 1'대신 'start + 4'가되도록 마지막 줄을 조정하십시오.
nevada_scout

4
나는 일반적으로 Stackoverflow에서 코드를 직접 복사하여 프로젝트에 붙여 넣고 작동 시키지만, 내가 할 때이 코드였습니다. 고마워
Flat Cat

10
브라우저의 실행 취소 기능 (Ctrl + z)이 중단됩니다.
01 오토 몽키

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

1
@Sinaesthetic : 예, 탭을 공백으로 변경할 수 있지만 약간의 코드를 수정해야합니다 (1 개 대신 3-4 개의 새 문자가 있음). 다른 대안은 CSS 탭 크기입니다.
Adrian Maire

@Sinaesthetic 예, 간단히 마지막 줄을 this.selectionEnd = s+1;로 바꿉니다 this.selectionEnd = s + "\t".length;. 변수 또는 함수 매개 변수를 사용하고 들여 쓰기 문자를 저장하는 것이 더 깨끗합니다. 그러나 지금 무엇을 대체해야하는지 알 수 +1있습니다.
StanE

2
KeyboardEvent.keyCodeKeyboardEvent.which속성을 더 이상 사용되지 않습니다. KeyboardEvent.key대신 사용하십시오 .
Константин Ван

48

다른 사람들이 작성한 것처럼 JavaScript를 사용하여 이벤트를 캡처하고 기본 동작을 방지하고 (커서가 포커스를 이동하지 않도록) 탭 문자를 삽입 할 수 있습니다.

그러나 기본 동작을 비활성화하면 마우스를 사용하지 않고 포커스를 텍스트 영역 밖으로 이동할 수 없습니다. 맹인 사용자는 키보드를 사용하여 웹 페이지와 상호 작용하고 그 밖의 아무것도 수행하지 않습니다. 마우스 포인터가 유용한 기능을 수행하는 것을 볼 수 없으므로 키보드 또는 아무것도 아닙니다. 탭 키는 문서, 특히 양식을 탐색하는 기본 방법입니다. 탭 키의 기본 동작을 재정의하면 시각 장애인이 다음 양식 요소로 포커스를 이동할 수 없습니다.

따라서 광범위한 청중을 위해 웹 사이트를 작성하는 경우 강력한 이유 없이이 작업을 수행 하지 말고 텍스트 영역에 갇히지 않는 시각 장애인을위한 대안을 제공 하는 것이 좋습니다 .


2
감사합니다. 나는 rud 소리를 의미하지는 않지만 맹인들이 컴퓨터를 사용한다는 것을 몰랐습니다. 나는 이것을 명심할 것이다
user780483

10
괜찮습니다. 많은 사람들이 모릅니다. 그것은 그들의 경험 밖에 있습니다. 다음은 소개입니다 : webaim.org/intro
Will Martin

이 사이트가 일반 사용자를위한 웹 사이트라면 정말 나쁜 생각입니다. 화면 판독기 사용자 외에도 여러 가지 이유로 키보드를 사용하여 탐색하거나 선택해야하는 다른 많은 사용자가 있습니다. 탭 키를 트래핑하면 이러한 사용자가 양식을 최소한 성가 시게하고 사용할 수 없게됩니다.
steveax

6
아마도 control + tab을 사용하십시오. 이렇게하면 브라우저가 다른 탭 (웹 페이지)에 도달 할 수 있지만 사용자는 텍스트 상자를 탭 아웃 한 다음 탭을 다른 페이지로 제어 할 수 있습니다. 페이지에 힌트가 있어야 탭의 Ctrl + Tab을 사용하십시오.
Joseph McIntyre

감사합니다 @WillMartin 매우 유용한 정보입니다. 이 중요한 점을 고려하지 않고 모든 텍스트 영역에 대해 전체 블로그에서 동일한 것을 구현하려고했습니다.
Imran

40

가치있는 것을 위해, 당신 이이 스레드에서 모두 이야기 한 것에 대한 내 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에서 테스트되었습니다.


당신은 훌륭합니다.
NiCk Newman

1
탭 대신 4 개의 공백을 사용하도록이 코드를 수정하려면 어떻게해야합니까? & nbsp; 네 번이나 여전히 단일 공간으로 변환했습니다.
jiaweizhang

5
닉크, 내 아내에게 알려주세요. jiaweizhang, '\ t'를 '<4 spaces>'로
바꾸고

1
가장 좋은 답변!
Marco Demaio

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 키를 누를 때 자동 들여 쓰기 지원 (실행 취소 스택 유지)
  • 다음 탭 / 엔터 키에서 Esc 키 취소 지원 사용 (Escape 키를 누른 다음 탭 아웃)
  • 테스트되지 않은 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

이것은 약간의 작업으로 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
현재로서는 이것이 정답입니다. 대단히 감사합니다. 🙏
Chris Calo

2
슬프게도 Firefox는 지원하지 않습니다. indent-textareaFirefox에서이 방법 + 폴백을 사용하는 크로스 브라우저 솔루션을 사용해보십시오 .
fregante

Firefox에서는 을 설정 한 후에 document.execCommand활성화 됩니다 document.designMode = "on";. 가있는 요소에 쓸 텍스트를 얻을 수 있습니다 .contentEditable = 'true'. 그러나 텍스트 영역 에서이 작업을 수행하려고하면 삽입 된 textNode가 텍스트 영역 대신 문서 내의 텍스트 영역 바로 앞에 배치됩니다. 모질라 그림이를 도와 시도하십시오 여기 .
Lonnie Best

이 정보는 더 이상 '현대'로 간주되지 않으며 메모를 연결 한 페이지 (약 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ño Larrondo

6

Tab 키를 누르고 공백을 삽입하려면 JS 코드를 작성해야합니다. JSFiddle과 비슷한 기능.

jquery 바이올린을 확인하십시오 .

HTML :

<textarea id="mybox">this is a test</textarea>

자바 스크립트 :

$('#mybox').live('keydown', function(e) { 
  var keyCode = e.keyCode || e.which; 

  if (keyCode == 9) { 
    e.preventDefault(); 
    alert('tab pressed');
  } 
});

2
기본 동작도 방지하는 것을 잊지 마십시오. event.preventDefault();
Ryan

2
최신 버전에서는 라이브가에 대체되었습니다.
Eric Harms 2016 년

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

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

사람들이 대답에 대해 여기에서 말해야했던 모든 것을 기반으로, 키 다운 (키 업이 아님) + preventDefault () + 캐럿에 탭 문자를 삽입하십시오. 다음과 같은 것 :

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

이전 답변에는 작동하는 jsfiddle이 있었지만 keydown에 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 단계 뒤로 물러 설 수 없습니다.
Magnus Eriksson

2

ALT를 누른 상태에서 숫자 키패드에서 0.9를 누릅니다. 구글 크롬에서 작동


2

원하는 텍스트 영역 요소로 액세스 할 수있는 것을 만들었습니다.

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

간단한 방법은 내가 그렇게 발견 현대적인 브라우저에서바닐라 자바 스크립트 입니다 :

  <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

위의 답변은 모두 실행 취소 기록을 지 웁니다. 그렇게하지 않는 솔루션을 찾는 사람은 지난 한 시간 동안 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

0

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

나쁜 대답은 아니지만 코드를 보면 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 )는 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}}}

-1

textarea 요소의 모든 입력에는 onkeydown 이벤트가 있습니다. 이벤트 핸들러에서 event.keyCode가 9 일 때마다 event.preventDefault () 를 사용하여 탭 키의 기본 반응을 막을 수 있습니다 .

그런 다음 올바른 위치에 탭 표시를 넣으십시오.

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-Monica에게 사과드립니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.