#javascript #jquery #html
#javascript #jquery #HTML
Вопрос:
У меня есть HTML-форма и две кнопки отправки. У одного из них есть formaction
атрибут.
<form action="Action1" method="POST" id="myForm">
<input type="text" name="field1">
<input type="text" name="field2">
<button type="submit">Search</button>
<button type="submit" formaction="Action2">Save search defaults</button>
</form>
Затем у меня есть следующий код Javascript:
$('#myForm').on('submit', function () {
var form = $(this);
var url = form.attr('action');
console.log(url);
});
Почему url
всегда равно Action1
, даже если я нажимаю на кнопку с formaction="Action2"
? Как я могу получить правильное действие формы при нажатии на вторую кнопку?
Комментарии:
1. Потому что $(this) всегда будет указывать на тег <form>, атрибутом действия которого является «Action1»
Ответ №1:
Проблема в том, что вы прослушиваете отправку формы — следовательно, $(this)
в вашем коде создается form
<form>
элемент. Вместо этого вы можете прослушать нажатие кнопки отправки:
$("[type='submit']").on("click", function() {
var url = $(this).attr("formaction");
console.log(url);
});
Ответ №2:
Как уже указывалось, $(this).attr('action')
всегда ссылается на action
атрибут самой вашей формы, поскольку это элемент, для которого определено ваше событие.
Что вы можете сделать сами, так это проверить наличие formaction
of document.activeElement
, что дает вам элемент, который в данный момент сфокусирован. Если он не определен, вы возвращаетесь к самому действию формы.
ДЕМОНСТРАЦИЯ:
$('#myForm').on('submit', function (e) {
e.preventDefault();
var url = $(document.activeElement).attr('formaction') || $(this).attr('action');
console.log(url);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form action="Action1" method="POST" id="myForm">
<input type="text" name="field1">
<input type="text" name="field2">
<button type="submit">Search</button>
<button type="submit" formaction="Action2">Save search defaults</button>
</form>