텍스트 영역에서 "shift+enter"를 감지하고 새 줄을 생성하려면 어떻게 해야 합니까?
현재, 그 사람이 텍스트 영역 안에서 누르면, 양식이 제출될 것입니다.
좋아요, 저는 그걸 원해요.
그러나 +를 입력하면 텍스트 영역이 다음 행으로 이동합니다.\n
어떻게 해야 하나요?JQuery
아니면 가능한 한 단순한 자바스크립트?
쉽고 우아한 솔루션:
첫째, 텍스트 영역 내부를 누르면 양식을 제출할 스크립트가 없는 경우 양식이 제출되지 않습니다.이것이 사용자가 기대하는 행동이며 변경하지 않는 것이 좋습니다.그러나 이 작업을 수행해야 하는 경우 양식을 제출하는 스크립트를 찾아서 변경하는 것이 가장 쉬운 방법입니다.코드에는 다음과 같은 것이 있을 것입니다.
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);
더 단순한 솔루션을 사용하는 것이 좋습니다.
아래 Tim의 솔루션이 더 낫습니다. https://stackoverflow.com/a/6015906/4031815 을 사용하는 것이 좋습니다.
나의 해결책
제 생각에 당신은 이런 것을 할 수 있을 것 같습니다.
EDIT : 캐럿 위치에 관계없이 작동하도록 코드가 변경되었습니다.
코드의 첫 번째 부분은 캐럿 위치를 얻는 것입니다.
참조: 처음부터 문자로 텍스트 영역에서 캐럿 열(픽셀이 아님) 위치를 가져오는 방법은 무엇입니까?
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;
}
그런 다음 +가 함께 있을 때 텍스트 영역 값을 적절하게 바꾸고, 단독으로 누를 경우 양식을 제출합니다.
$('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();
}
}
});
여기 데모가 있습니다.
이 답변들의 대부분은 이것을 너무 복잡하게 만듭니다.이런 식으로 시도해 보는 게 어때요?
$("textarea").keypress(function(event) {
if (event.keyCode == 13 && !event.shiftKey) {
submitForm(); //Submit your form here
return false;
}
});
캐럿 위치를 어지럽히거나 줄을 JS로 밀지 않습니다.기본적으로 시프트 키를 누르고 있으면 이 기능이 실행되지 않으므로 입력/반환 키가 정상적인 기능을 수행할 수 있습니다.
왜 그냥
$(".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
}
});
jQuery 단축키 플러그인 및 이 코드 사용
jQuery(document).bind('keydown', 'shift+enter',
function (evt){
$('textarea').val($('#textarea').val() + "\n");// use the right id here
return true;
}
);
여기 앵귤러가 있습니다.Angular를 사용하여 동일한 문제를 가진 사람이 있는 경우 ng-keyup을 사용하는 JS 솔루션제이에스
ng-keyup="$event.keyCode == 13 && !$event.shiftKey && myFunc()"
ReactJS ES6를 사용하는 가장 간단한 방법은 다음과 같습니다.
shift 임의의enter 위치에 있는 새 줄
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>
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));
});
});
나는 텍스트 영역을 사용하는 대신 콘텐츠 편집 가능한 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
}
}
})
Shift+Engular2+로 키 입력을 감지하는 다른 솔루션
Inside Component.html
<input type="text" (keydown.shift.enter)="newLine($event)">
내부 구성요소.ts
newLine(event){
if(event.keyCode==13 && event.shiftKey){
alert('Shift+Enter key Pressed');
}
}
이 코드는 내 목적에 완벽하게 잘 작동합니다.
document.getElementById('text').addEventListener('keypress', (e) => {
if (e.key == 'Enter' && !e.shiftKey) {
e.preventDefault()
console.log('your code goes here');
}
if (e.key == 'Enter' && e.shiftKey) {
e.preventDefault();
console.log("insertLineBreak");
const txtArea = document.getElementById('text');
txtArea.value += '\r\n';
}
})
그리고 jquery 예제
$.fn.pressEnter = function(fn) {
return this.each(function() {
$(this).bind('enterPress', fn);
$(this).keyup(function(e){
/*When SHIFT return false*/
if(e.shiftKey==true) return false;
if(e.keyCode == 13)
{
/*You can do the thing on ENTER*/
alert('Enter press');
}
})
});
};
$('.exampleClass').pressEnter(function(){})
div{
width:200px;
height:100px;
border:solid 1px #000;
float:left;
}
textarea{
width:200px;
height:100px;
border:solid 1px #000;
float:right;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="exampleClass" contenteditable></div>
<textarea class="exampleClass"></textarea>
누군가가 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();
}
})
이건 나한테 효과가 있어요!
$("#your_textarea").on('keydown', function(e){
if(e.keyCode === 13 && !e.shiftKey)
{
$('form').submit();
}
});
용사를 ng-keyup
된 , 를 누를 .JS로 된 지시문, 누를 때만 메시지 보내기Enter
와 와Shift+Enter
새로운 노선을 택할 겁니다
ng-keyup="($event.keyCode == 13&&!$event.shiftKey) ? sendMessage() : null"
이것이 오래된 질문이라는 것을 알지만, 저는 몇몇 사람들이 사용한다면 고려하고 싶어할 수 있는 암묵적인 관찰을 하고 싶었습니다.Shift
+A-Z
.
document.onkeydown = (k) => {
if (k.key === "Q") {
console.log("Shift + Q");
}
}
케이스로 키를 확인할 수 있습니다. 예를 들어,"Q"
또는"q"
만약 전자를 한다면, 그것은 암시됩니다.Shift
대문자이기 때문에 압박을 받고 있습니다.
여기서 기능과 관련된 한 가지 버그는 다음과 같습니다.CapsLock
시작했습니다. 하지만 저처럼 개인적인 대본에 사용한다면 큰 문제가 되지 않습니다.
또 다른 잠재적 이점은 다음을 찾는 명시적 조건을 "숨기는" 것일 수 있습니다.Shift
누를 키입니다.하지만 이것은 분명히 어설픈 제안입니다.
가지 이 전송됩니다.\n
필요하지 않습니다.keydown
▁key니합반▁the▁return▁event환.13
키를
$("#mytestarea").keydown(function (e) {
if (e.keyCode == 13) { // Enter pressed
//No shift or alt or ctrl
if (!e.shiftKey && !e.altKey && !e.ctrlKey) {
SendMsg(); // or submit or what you wan't
}
if (e.shiftKey) {
//replace the shift for keycode 13 only
return 13;
}
//method to prevent from default behaviour
e.preventDefault();
}
});
<input type="text" onkeydown="handleMessageKeydown" />
또는 일부 콘텐츠 편집 가능 요소:
<div contenteditable="true" onchange="handleMessageKeydown" />
handleMessageKeydown(e) {
if (!e.shiftKey && e.key === "Enter") {
e.preventDefault()
sendMessage()
}
}
shift 키를 Enter 키로 누르면 새 라인이 생성됩니다. 그렇지 않으면 위에 주어진 if 조건 안에 들어갑니다.if 조건에서 e.proventDefault() 라인이 가장 중요합니다.키다운 이벤트 핸들러의 경우 e.proventDefault()는 서버로 메시지 보내기 등과 같은 고유한 작업을 수행할 수 있도록 작업 실행을 중지합니다.
하는 가장 좋은 방법은 다음과 같습니다.
if (e.key === 'Enter') {
console.log('enter');
}
if (e.key === 'Enter' && e.ctrlKey) {
console.log('clt+enter');
}
if (e.key === 'Enter' && e.ctrlKey && e.shiftKey) {
console.log('clt+shift+enter');
}
언급URL : https://stackoverflow.com/questions/6014702/how-do-i-detect-shiftenter-and-generate-a-new-line-in-textarea
'source' 카테고리의 다른 글
NuGet Package Manager 콘솔에 특정 패키지의 사용 가능한 모든 버전 나열 (0) | 2023.07.26 |
---|---|
도커 합성을 수행한 후 컨테이너가 시작되지 않음 -d (0) | 2023.07.26 |
판다에서 0만 포함된 열을 삭제하려면 어떻게 해야 합니까? (0) | 2023.07.26 |
Mysql: 두 날짜 사이의 모든 데이터 선택 (0) | 2023.07.26 |
Windows에서 GTK+ 3.0을 어떻게 설치합니까? (0) | 2023.07.26 |