Я пытаюсь получить значения из полей ввода после нажатия кнопки "Удалить" и перед удалением строки с помощью jQuery. Прямо сейчас я просто пытаюсь получить первую коробку, но мне не повезло с моими попытками выбора.
Вот последняя попытка получить входное значение, имеющее класс.editing. Кстати, это не весь код. Функция removeIng срабатывает, как предполагалось, я просто не возвращаю то, что мне нужно.
$('.remove_ing').click(removeIng);
function removeIng(){ //removes the row
alert($(this).parentsUntil('tr').find('.editing').val());
$(this).parent().parent().remove();
}
Вот HTML, у меня есть несколько строк, подобных этому (добавляется динамически)
<tr>
<td><input type='text' name='ingredient' value='' class='editing' /></td>
<td><input type="text" class='editing_amt' name="amount" size="8" value="100"/></td>
<td><select name='meas' class='editing_meas'></select></td>
<td><input type="button" name="remove_ing" class="remove_ing" value="Remove"/></td>
</tr>
Спасибо за помощь
Использовать .on()
Поскольку элементы добавляются динамически, вы не можете напрямую связывать события с ними. Поэтому вам нужно использовать Event Delegation.
$(document).on('click','.remove_ing',removeIng);
function removeIng(){ //removes the row
alert($(this).parentsUntil('tr').find('.editing').val());
$(this).parent().parent().remove();
}
Синтаксис
$( elements ).on( events, selector, data, handler );
Используйте .closest()
Вместо
$(this).parent().parent().remove();
использование
$(this).closest('tr').remove();
$(this).parents("tr")
также будет работать. но $(this).closest('tr')
быстрее.
Если ваш html статический (он не динамический), вы должны дать кнопке id и, предпочтительно, tr. Если это не так, то делегация событий - это путь. @Tushar дал вам представление о делегировании событий.
Во всяком случае, здесь небольшой фрагмент, который может вам помочь.
var btn = $(".remove_ing");
btn.click( removeIng );
function removeIng(){
// get the row
var tr = $(this).parents("tr").first();
//get the text boxes
var txt = tr.find("input[type='text']");
//loop through the texts
txt.each(function(){
alert( $(this).val() );
});
}
В обоих случаях (динамический или статический html) эта функция получит весь текст ввода. Надеюсь, поможет.
.parent().parent()
вы, вероятно, должны сделать что-то более явное, например, closest . Таким образом, если вы добавите обертку к своемуinput
позже, вы не прервете свой вызов.