Как я могу обнаружить "shift+enter" и создать новую строку в Textarea?
В настоящее время, если человек нажимает введите внутри текстовой области, форма будет представлять.
Хорошо, я хочу этого.
но когда они типа shift + введите, Я хочу, чтобы текстовая область перешла к следующей строке:n
Как я могу сделать это в JQuery или простой JavaScript как можно проще?
11 ответов:
Я думаю, что вы можете сделать что-то подобное..
EDIT: изменен код для работы независимо от позиции каретки
первая часть кода, чтобы получить позицию каре.
Ref:положение курсора в текстовой области, в символах с самого начала
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 соответственно, когда Shift + введите вместе, отправьте форму, если введите нажимается в одиночку.
$('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 не отправляет форму, если у вас нет скрипта, чтобы сделать это. Это поведение, которое ожидает пользователь, и я бы рекомендовал не менять его. Однако, если вы должны сделать это, самый простой подход будет найти скрипт, который делает введите отправьте форму и измените ее. Код будет иметь что-то вроде
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);
большинство этих ответов усложняют это. Почему бы не попробовать этот способ?
$("textarea").keypress(function(event) { if (event.keyCode == 13 && !event.shiftKey) { submitForm(); //Submit your form here return false; } });нет возиться с каретки позиции или толкая линии разрывов в JS. В принципе, функция не будет работать, если нажата клавиша shift, поэтому позволяет клавише enter/return выполнять свою обычную функцию.
почему бы просто не
$(".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 plugin и этот код
jQuery(document).bind('keydown', 'shift+enter', function (evt){ $('textarea').val($('#textarea').val() + "\n");// use the right id here return true; } );
вот решение AngularJS с использованием ng-keyup Если у кого-то есть такая же проблема с использованием AngularJS.
ng-keyup="$event.keyCode == 13 && !$event.shiftKey && myFunc()"
Я нашел этот поток, ищущий способ управления 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)); }); });
Я использую div, добавляя contenteditable true вместо использования textarea.
Надежда может помочь вам.
$("#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 } } })
используя
ng-keyupдиректива в angularJS, только отправить сообщение при нажатии иShift+Enterпросто возьму новую строку.ng-keyup="($event.keyCode == 13&&!$event.shiftKey) ? sendMessage() : null"
в случае, если кто-то все еще задается вопросом, как это сделать без jQuery.
HTML
<textarea id="description"></textarea>Javascript
const textarea = document.getElementById('description'); textarea.addEventListener('keypress', (e) => { e.keyCode === 13 && !e.shiftKey && e.preventDefault(); })Vanilla JS
var textarea = document.getElementById('description'); textarea.addEventListener('keypress', function(e) { if(e.keyCode === 13 && !e.shiftKey) { e.preventDefault(); } })
для тех, кто использует ReactJS ES6 вот самый простой способ
shift + введите Новая Строка
введите заблокированные
class App extends React.Component { constructor(){ super(); this.state = { message: 'Enter is blocked' } } onKeyPress = (e) => { if (e.keyCode === 13) { // block enter e.preventDefault(); } if (e.keyCode === 13 && e.shiftKey) { e.preventDefault(); this.setState(prevState => ({ message: prevState.message+'\n' })) } }; render(){ return( <div> New line with shift enter<br /> <textarea value={this.state.message} 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>
Comments