텍스트 영역에서 "shift + enter"를 감지하고 새 줄을 생성하려면 어떻게합니까?


145

현재 사람 enter이 텍스트 영역을 누르면 양식이 제출됩니다.
좋아, 난 원해

그러나 shift+ 를 입력 enter하면 텍스트 영역이 다음 줄로 이동하기를 원합니다.\n

JQuery가능한 한 간단하거나 일반 JavaScript로 어떻게 할 수 있습니까?


3
오, 내가 이렇게 변화된 행동을 싫어하는 이유는 무엇입니까? 글자를 단어로 쓰면 Enter 키를 누를 때 텍스트를 파일에 저장하거나 새 줄을 시작해야합니까?
Andreas

18
대화방을 만들고 있습니다. 이것이 Skype doe의 방식입니다.
TIMEX

10
확인하십시오 e.shiftKey.
Thai

6
Enter를 사용하여 양식을 제출하지 못하도록하는 코드를 찾고 이벤트의 shiftKey속성을 확인하기 만하면 됩니다.
Tim Down

3
텍스트 필드의 새 줄에 대한 Enter 키를 이동해도 "변경"되지 않습니다. 당나귀 시대, 온갖 종류의 행동이 예상되었습니다. 스프레드 시트에 텍스트를 입력 할 때 수십 년 전에 사용했습니다.
키프로스에서 휴식

답변:


81

더 간단한 솔루션을 더 잘 사용하십시오.

아래의 Tim 솔루션이 더 좋습니다 .https : //stackoverflow.com/a/6015906/4031815


내 솔루션

이런 식으로 할 수 있다고 생각합니다 ..

편집 : 캐럿 위치에 관계없이 작동하도록 코드가 변경되었습니다.

코드의 첫 번째 부분은 캐럿 위치를 얻는 것입니다.

참조 : 처음부터 텍스트 영역에서 캐럿 열 (픽셀이 아닌) 위치를 문자로 얻는 방법은 무엇입니까?

function getCaret(el) { 
    if (el.selectionStart) { 
        return el.selectionStart; 
    } else if (document.selection) { 
        el.focus();
        var r = document.selection.createRange(); 
        if (r == null) { 
            return 0;
        }
        var re = el.createTextRange(), rc = re.duplicate();
        re.moveToBookmark(r.getBookmark());
        rc.setEndPoint('EndToStart', re);
        return rc.text.length;
    }  
    return 0; 
}

그런 다음 Shift+ Entertogether 인 경우 텍스트 영역 값을 적절하게 바꾸고, Enter혼자 누르면 양식을 제출하십시오 .

$('textarea').keyup(function (event) {
    if (event.keyCode == 13) {
        var content = this.value;  
        var caret = getCaret(this);          
        if(event.shiftKey){
            this.value = content.substring(0, caret - 1) + "\n" + content.substring(caret, content.length);
            event.stopPropagation();
        } else {
            this.value = content.substring(0, caret - 1) + content.substring(caret, content.length);
            $('form').submit();
        }
    }
});

여기 데모가 있습니다


캐럿이 텍스트 영역의 내용 끝에 있지 않으면 작동하지 않습니다.
Tim Down

또한, 거기에 오타가 (당신이 무슨 뜻입니다 event.keyCode == 13) 그리고 당신이 아마 또한 원하는 생각 event.preventDefault()보다는 event.stopPropagation().
Tim Down

나는 그것을 바꿨다. 이제 캐럿 위치에 관계없이 작동합니다. 그리고 event.stopPropagation()나는 그가 양식을 제출하기 위해 작성한 다른 코드를 중지하려고했습니다.
Jishnu AP

7
해당 캐럿 위치 기능에 결함이 있습니다 (연결된 캐럿 위치 질문에 대한 내 의견 및 답변 참조).이 작업을 수행하기 위해 캐럿 위치가 필요하지 않습니다. 여기에 내 대답을 참조하십시오. Re event.stopPropagation()는 이벤트가 DOM을 더 많이 버블 링하지 못하게하지만 키 누르기가 줄 바꿈을 삽입하는 기본 작업을 수행하지 못하게합니다 (실제로 keyup제안 event.preventDefault()해도 그렇게하지는 않습니다).
Tim Down

2
잘 작동했지만 carent정의되지 않은 오류가 발생 했습니다. 캐럿으로 변경하면 2 개의 새로운 줄이 추가됩니다.
Aamir Mahmood

164

쉽고 우아한 솔루션 :

먼저 Enter텍스트 영역 내부를 눌러도 스크립트가 없으면 양식을 제출하지 않습니다. 그것은 사용자가 기대하는 행동이며 변경하지 않는 것이 좋습니다. 그러나이 작업을 수행해야하는 경우 가장 쉬운 방법은 Enter양식 을 제출하고 변경 하는 스크립트를 찾는 것입니다. 코드는 다음과 같습니다

if (evt.keyCode == 13) {
    form.submit();
}

... 그리고 당신은 그것을 바꿀 수 있습니다.

if (evt.keyCode == 13 && !evt.shiftKey) {
    form.submit();
}

반면에 어떤 이유로이 코드에 액세스 할 수없는 경우 캐럿이 텍스트 끝에 있지 않더라도 모든 주요 브라우저에서 작동하도록하려면 다음을 수행해야합니다.

jsFiddle : http://jsfiddle.net/zd3gA/1/

암호:

function pasteIntoInput(el, text) {
    el.focus();
    if (typeof el.selectionStart == "number"
            && typeof el.selectionEnd == "number") {
        var val = el.value;
        var selStart = el.selectionStart;
        el.value = val.slice(0, selStart) + text + val.slice(el.selectionEnd);
        el.selectionEnd = el.selectionStart = selStart + text.length;
    } else if (typeof document.selection != "undefined") {
        var textRange = document.selection.createRange();
        textRange.text = text;
        textRange.collapse(false);
        textRange.select();
    }
}

function handleEnter(evt) {
    if (evt.keyCode == 13 && evt.shiftKey) {
        if (evt.type == "keypress") {
            pasteIntoInput(this, "\n");
        }
        evt.preventDefault();
    }
}

// Handle both keydown and keypress for Opera, which only allows default
// key action to be suppressed in keypress
$("#your_textarea_id").keydown(handleEnter).keypress(handleEnter);

42

이러한 답변의 대부분은 이것을 복잡하게 만듭니다. 이런 식으로 시도해보십시오.

$("textarea").keypress(function(event) {
        if (event.keyCode == 13 && !event.shiftKey) {
         submitForm(); //Submit your form here
         return false;
         }
});

캐럿 위치로 엉망이되거나 JS로 줄 바꿈되지 않습니다. 기본적으로, Shift 키를 누르면 기능이 실행되지 않으므로 Enter / Return 키가 정상 기능을 수행 할 수 있습니다.


이것이 바로 내가 원하는 것입니다. 감사.
Taku Yoshi

18

왜 안돼

$(".commentArea").keypress(function(e) {
    var textVal = $(this).val();
    if(e.which == 13 && e.shiftKey) {

    }
    else if (e.which == 13) {
       e.preventDefault(); //Stops enter from creating a new line
       this.form.submit(); //or ajax submit
    }
});

2
(event.keyCode == 13 &&! event.shiftKey)와 같은 조건을 사용할 수 있습니다. 팁 : knockoutjs를 사용하는 경우 텍스트 영역 주먹의 초점을 해제하여 값을 업데이트해야합니다. jQuery (this) .blur ();
Justin

4

jQuery 단축키 플러그인과이 코드를 사용하십시오.

jQuery(document).bind('keydown', 'shift+enter', 
         function (evt){ 
             $('textarea').val($('#textarea').val() + "\n");// use the right id here
             return true;
         }
);

3

다음은 AngularJS를 사용 하는 사람과 동일한 문제가있는 경우 ng-keyup을 사용하는 AngularJS 솔루션 입니다.

ng-keyup="$event.keyCode == 13 && !$event.shiftKey && myFunc()"

3

ReactJS ES6를 사용하는 가장 간단한 방법은 다음과 같습니다.

shiftenter어느 위치에서나 + 새 줄

enter 막힌

class App extends React.Component {

 constructor(){
    super();
    this.state = {
      message: 'Enter is blocked'
    }
  }
  onKeyPress = (e) => {
     if (e.keyCode === 13 && e.shiftKey) {
        e.preventDefault();
        let start = e.target.selectionStart,
            end = e.target.selectionEnd;
        this.setState(prevState => ({ message:
            prevState.message.substring(0, start)
            + '\n' +
            prevState.message.substring(end)
        }),()=>{
            this.input.selectionStart = this.input.selectionEnd = start + 1;
        })
    }else if (e.keyCode === 13) { // block enter
      e.preventDefault();
    }
    
  };

  render(){
    return(
      <div>
      New line with shift enter at any position<br />
       <textarea 
       value={this.state.message}
       ref={(input)=> this.input = input}
       onChange={(e)=>this.setState({ message: e.target.value })}
       onKeyDown={this.onKeyPress}/>
      </div>
    )
  }
}

ReactDOM.render(<App />, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id='root'></div>


2

이 스레드는 Shift + 모든 키를 제어하는 ​​방법을 찾고 있습니다. 다른 솔루션을 함께 붙여서 필요한 기능을 수행하기 위해이 결합 된 기능을 만들었습니다. 다른 사람에게 도움이되기를 바랍니다.

function () {
    return this.each(function () {
    $(this).keydown(function (e) {
        var key = e.charCode || e.keyCode || 0;
        // Shift + anything is not desired
        if (e.shiftKey) {
            return false;
        }
        // allow backspace, tab, delete, enter, arrows, numbers 
        //and keypad numbers ONLY
        // home, end, period, and numpad decimal
        return (
            key == 8 ||
            key == 9 ||
            key == 13 ||
            key == 46 ||
            key == 110 ||
            key == 190 ||
            (key >= 35 && key <= 40) ||
            (key >= 48 && key <= 57) ||
            (key >= 96 && key <= 105));
    });
});

1

누군가 jQuery 없이이 작업을 수행하는 방법을 여전히 궁금해하는 경우.

HTML

<textarea id="description"></textarea>

자바 스크립트

const textarea = document.getElementById('description');

textarea.addEventListener('keypress', (e) => {
    e.keyCode === 13 && !e.shiftKey && e.preventDefault(); 
})

바닐라 JS

var textarea = document.getElementById('description');

textarea.addEventListener('keypress', function(e) {
    if(e.keyCode === 13 && !e.shiftKey) {
      e.preventDefault();
    }
})

1

텍스트 영역을 사용하는 대신 contenteditable true를 추가하여 div를 사용합니다.

희망이 당신을 도울 수 있습니다.

$("#your_textarea").on('keydown', function(e){//textarea keydown events
  if(e.key == "Enter")
  {
    if(e.shiftKey)//jump new line
    {
     // do nothing
    }
    else  // do sth,like send message or else
    {
       e.preventDefault();//cancell the deafult events
    }
  }
})

1

이것은 나를 위해 작동합니다!

$("#your_textarea").on('keydown', function(e){
    if(e.keyCode === 13 && !e.shiftKey) 
    {

          $('form').submit();

    }
});

0

ng-keyupangularJS에서 지시문을 사용 하면 Enter키 를 누를 때만 메시지를 보내고 Shift+Enter새 줄을 가져 옵니다 .

ng-keyup="($event.keyCode == 13&&!$event.shiftKey) ? sendMessage() : null"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.