Что вам нужно сделать, это переместить функцию нажатия клавиш из имеющейся у вас функции фокусировки. JSFiddle
Поскольку вы проверяете, нажали ли они клавишу ввода, внутри функции фокусировки, она не ведет себя так, как вы ожидаете.
После перемещения его за пределы этой функции он ведет себя как ожидалось, предупреждение срабатывает только один раз, и строка создается, даже если фокус все еще находится внутри элемента ввода.
$(document).on('focusout', (e) => {
const row = e.target.parentElement.parentElement
if (e.target.matches("[name=itemNametd]")) { // whene focus is out from itemNametd
getValues(e.target.parentElement.parentElement)
}
if (e.target.matches('[name=unitQtytd]')) { //when focus is out from unitQty
calc(e.target.parentElement.parentElement)
}
});
// Move this outside of the above focusout function,
// you will also need to rename all of the e elements to event,
// or the other way around. Also include line where you declare the row variable
$(document).keypress(function(event) {
const row = event.target.parentElement.parentElement
var keycode = event.keyCode || event.which;
if (keycode == '13') {
alert("presed")
calcDiscount(event.target.parentElement.parentElement)
if ($(row).parent().find('tr').length - $(row).index() === 1) {
rowappend(event.target.parentElement.parentElement.parentElement)
}
}
});
Не имеет отношения к вопросу (поскольку вы говорили о взаимодействии с пользователем):
Следует помнить одну вещь: «Как пользователь узнает, что нажать Enterсоздать новую строку ".Также может быть полезно добавить кнопку для добавления строки и, возможно, небольшой элемент, который раскрывает дополнительную информацию о наведении, объясняющую, что они могут использовать ввод для создания новой строки.
Кроме того, рассмотрите стиль всей строки.чтобы он выглядел отдельно от таблицы, таким образом, пользователь знал бы, с какими числами совпадают.