У меня есть форма для быстрого ввода продукта.
(К вашему сведению, у меня есть форма с таблицами, поэтому я могу выровнять метки для каждого входа.)
<table id="create-item">
<tbody>
<tr>
<th>
<label for="name">Name</label>
</th>
<td>
<input class="name" name="name" />
</td>
</tr>
<tr>
<th>
<label for="price">Price</label>
</th>
<td>
<input class="price" name="price" />
</td>
</tr>
<tr>
<th>
<label for="description">description</label>
</th>
<td>
<textarea class="description" name="description" rows="3" cols="50" />
</td>
</tr>
</tbody>
</table>
Я настроил его так, чтобы при нажатии клавиши табуляции или ввода в первых полях ввода он перемещал пользователя в следующее поле $ (": input"). Когда пользователь нажимает кнопку ввода (код клавиши 13) в последнем поле ввода, которое является текстовой областью, я получаю форму создания элемента в базе данных, очищаю значения трех полей ввода и снова фокусируюсь на первом поле ввода, чтобы подготовиться к введите другой элемент. Вот функция, которая связана «нажатием клавиши» с текстовой областью с классом «описание».
nextFieldOnEnter: function(e) {
var $that = $(e.currentTarget);
if (e.keyCode == (13 || 9)) {
$that
.closest("tr")
.next("tr")
.find(":input")
.focus();
};
},
createOnEnter: function(e) {
if (e.keyCode == 13) {
items.create(this.newAttributes());
this.$("#create-item :input").val('');
this.$("#create-item :input")[0].focus();
};
},
Проблема, с которой я столкнулся, заключается в том, что когда пользователь впервые загружает страницу, текстовая область пуста, но после того, как пользователь входит в первый элемент и нажимает клавишу ввода, текстовая область отображается пустой, но фактически теперь содержит символ новой строки. Это означает, что когда пользователь снова попадает в текстовую область для второго и всех будущих элементов, точка вставки находится во второй строке текстовой области, а не в первой, и когда пользователь нажимает клавишу ввода, чтобы сохранить эти дополнительные элементы, они сохраняются. с ведущим символом новой строки.
Я понял, что это происходит, потому что я получаю ключ ввода, и этот ключ ввода не только вызывает мой оператор if, но и добавляет эту новую строку после выполнения оператора if. Я понял это, потому что я пытался связываться с «keydown», и в следующий раз, когда вокруг textarea не было такого дополнительного пространства, это вызвало еще одну проблему. Теперь, когда он привязан к «keydown», это означает, что команда «enter» отправляется в первое поле ввода, в результате чего фокус переходит на второе поле ввода.
Затем я попытался привязать его к «keyup», и «enter» на входе класса «price» теперь вызывает createOnEnter, вызывая создание элемента, не позволяя пользователю вводить что-либо в текстовой области.
Резюме:
нажатие клавиши = дополнительная новая строка в текстовой области после очистки с помощью .val ('')
keydown = ввод события «nextFieldOnEnter» при вводе с классом «имя» срабатывает, и фокус вводится при вводе с классом «цена»
keyup = событие ввода от цены вызывает «createOnEnter», привязанный к текстовой области.
У кого-нибудь есть идеи, как я могу очистить текстовую область без этих проблем, потому что я собираю клавишу «ввод» для перемещения полей и сохранения элемента?
Я знаю, что мог .remove () перед новой строкой для второго и всех дополнительных элементов перед сохранением, однако это означает, что пользователю все равно будет представлена точка вставки во второй строке для каждого дополнительного элемента.