на самом деле это не так уж сложно реализовать, даже с использованием vanilla JS (т.е. без jQuery, прототипа и т. Д.), Но все проще с jQuery, поэтому я попробую использовать его что:
Предполагая такую структуру:
<form id="myForm">
<div class="inputRow">
<input type="text" name="myInput[]" />
</div>
<div class="inputRow">
<input type="text" name="myInput[]" />
</div>
...
</form>
Вот JS
$('#myForm :text').blur(onBlurHandler);
function onBlurHandler() {
$row = $(this).parent();
if ($row
.nextAll(":has(:text)") // all following divs with a text element
.length == 0 // but there aren't any, we're on the last one
) {
if ($.trim($row.find(":text").val())) { // the text box isn't empty
$copy = $row.clone(true);
$copy
.find(":text") // get the new text box,
.val('') // remove any text in it
.blur(onBlurHandler) // and add the event handler (is this necessary?)
;
$copy.insertAfter($row);
} else if ($row.prev(':has(:text)').length) { // the text box is empty, and this one isn't the first row
$row.remove(); // get rid of the row.
}
}
}
Ответ на комментарий:
спасибо за ответ! Я попробовал это, но это не работает, как задумано. Я на Mac Firefox. если я добавляю последнее поле, оно добавляет новое, но фокусируется на адресной строке. я попытался добавить: $copy.find(":text").focus();
после строки insertAfter, но это ничего не меняет. есть идеи?
также, если я нажму клавишу табло, то размыкатель не будет знать, что я иду в противоположном направлении. есть ли способ обойти это?
Хм, я не думал об этом. То, что вы можете попробовать сделать, это поместить элемент после всех ваших текстовых полей, которые могут сфокусироваться (например, текстовое поле, отображаемое вне экрана, например: margin-left: -10000px
). Добавьте к нему обработчик onfocus, чтобы увидеть, если последняя строка пуста, и если она есть, то она была бы добавлена только тогда функцией onBlurHandler, поэтому передайте фокус обратно в последнюю строку. Если последняя строка не пуста, тогда передайте фокус следующему элементу (вероятно, вашей кнопке отправки). Если есть проблемы с последней строкой, еще не существующей в DOM, поместите вышеуказанное в тайм-аут.
(Если это действительно работает), это должно позволить вашим пользователям перемещаться назад и вперед без хлопот.