JQuery: как получить, какая кнопка была нажата при отправке формы?
У меня есть событие .submit()
, настроенное для отправки формы. У меня также есть несколько форм на странице, но только один здесь для этого примера. Я хотел бы знать, какая кнопка отправки нажата без применения события .click()
для каждого из них.
Здесь настройка:
<html>
<head>
<title>jQuery research: forms</title>
<script type='text/javascript' src='../jquery-1.5.2.min.js'></script>
<script type='text/javascript' language='javascript'>
$(document).ready(function(){
$('form[name="testform"]').submit( function(event){ process_form_submission(event); } );
});
function process_form_submission( event ) {
event.preventDefault();
//var target = $(event.target);
var me = event.currentTarget;
var data = me.data.value;
var which_button = '?'; // <-- this is what I want to know
alert( 'data: ' + data + ', button: ' + which_button );
}
</script>
</head>
<body>
<h2>Here my form:</h2>
<form action='nothing' method='post' name='testform'>
<input type='hidden' name='data' value='blahdatayadda' />
<input type='submit' name='name1' value='value1' />
<input type='submit' name='name2' value='value2' />
</form>
</body>
</html>
Живой пример на jsfiddle
Помимо применения события .click() на каждой кнопке, существует ли способ определить, какая кнопка отправки нажата?
Ответы
Ответ 1
Я задал этот же вопрос: Как я могу получить кнопку, которая вызвала отправку из формы отправки?
В итоге я придумал это решение, и он работал очень хорошо:
$(document).ready(function() {
$("form").submit(function() {
var val = $("input[type=submit][clicked=true]").val();
// DO WORK
});
$("form input[type=submit]").click(function() {
$("input[type=submit]", $(this).parents("form")).removeAttr("clicked");
$(this).attr("clicked", "true");
});
});
В вашем случае с несколькими формами вам может потребоваться немного изменить его, но он все равно должен применяться
Ответ 2
Я обнаружил, что это сработало.
$(document).ready(function() {
$( "form" ).submit(function () {
// Get the submit button element
var btn = $(this).find("input[type=submit]:focus" );
});
}
Ответ 3
Это работает для меня:
$("form").submit(function() {
// Print the value of the button that was clicked
console.log($(document.activeElement).val());
}
Ответ 4
Когда форма отправлена:
-
document.activeElement
предоставит вам кнопку отправки, которая была нажата.
-
document.activeElement.getAttribute('value')
даст вам это значение кнопки.
Ответ 5
Здесь подход, который кажется более чистым для моих целей.
Во-первых, для любых и всех форм:
$('form').click(function(event) {
$(this).data('clicked',$(event.target))
});
Когда это событие клика запускается для формы, оно просто записывает исходную цель (доступную в объекте события) для доступа позже. Это довольно широкий штрих, поскольку он срабатывает для любого щелчка в любом месте формы. Комментарии оптимизаций приветствуются, но я подозреваю, что это никогда не вызовет заметных проблем.
Затем в $('form'). submit() вы можете узнать, что было последним нажато, с чем-то вроде
if ($(this).data('clicked').is('[name=no_ajax]')) xhr.abort();
Ответ 6
Ничего себе, некоторые решения могут усложниться! Если вы не против использования простого глобального, просто воспользуйтесь тем, что сначала запускается событие нажатия кнопки ввода. Можно было бы дополнительно фильтровать селектор $('input') для одной из многих форм, используя $('# myForm input').
$(document).ready(function(){
var clkBtn = "";
$('input[type="submit"]').click(function(evt) {
clkBtn = evt.target.id;
});
$("#myForm").submit(function(evt) {
var btnID = clkBtn;
alert("form submitted; button id=" + btnID);
});
});
Ответ 7
Я нашел лучшее решение
$(document.activeElement).attr('id')
Это не только работает на входах, но также работает с тегами кнопок.
Также он получает идентификатор кнопки.
Ответ 8
Другим возможным решением является добавление скрытого поля в вашу форму:
<input type="hidden" id="btaction"/>
Затем в готовой функции добавьте функции для записи того, что нажата клавиша:
$('form#myForm #btnSubmit').click(function() {
$('form#myForm #btaction').val(0);
});
$('form#myForm #btnSubmitAndSend').click(function() {
$('form#myForm #btaction').val(1);
});
$('form#myForm #btnDelete').click(function() {
$('form#myForm #btaction').val(2);
});
Теперь в обработчике формы прочитайте скрытую переменную и решите на ней:
var act = $('form#myForm #btaction').val();
Ответ 9
Основываясь на том, что сделал Стэн и Янн-ч, но по умолчанию первая кнопка. Красота этого общего подхода заключается в том, что он выбирает как щелчок, так и клавишу ввода (даже если фокус не был на кнопке. Если вам нужно разрешить ввод в форму, просто ответьте на это, когда кнопка сфокусирована ( т.е. ответ Stan). В моем случае я хотел разрешить ввод, чтобы отправить форму, даже если текущий фокус пользователя находился в текстовом поле.
Я также использовал атрибут 'name', а не 'id', но это тот же подход.
var pressedButtonName =
typeof $(":input[type=submit]:focus")[0] === "undefined" ?
$(":input[type=submit]:first")[0].name :
$(":input[type=submit]:focus")[0].name;
Ответ 10
Если вы не подразумеваете, что вы не добавляете событие .click, вы не хотите иметь отдельные обработчики для этих событий, вы можете обрабатывать все клики (отправления) в одной функции:
$(document).ready(function(){
$('input[type="submit"]').click( function(event){ process_form_submission(event); } );
});
function process_form_submission( event ) {
event.preventDefault();
//var target = $(event.target);
var input = $(event.currentTarget);
var which_button = event.currentTarget.value;
var data = input.parents("form")[0].data.value;
// var which_button = '?'; // <-- this is what I want to know
alert( 'data: ' + data + ', button: ' + which_button );
}
Ответ 11
Это работало для меня
$('#Form').submit(function(){
var btn= $(this).find("input[type=submit]:focus").val();
alert('you have clicked '+ btn);
}
Ответ 12
$("form input[type=submit]").click(function() {
$("<input />")
.attr('type', 'hidden')
.attr('name', $(this).attr('name'))
.attr('value', $(this).attr('value'))
.appendTo(this)
});
добавить скрытое поле
Ответ 13
Для меня лучшие решения были такими:
$(form).submit(function(e){
// Get the button that was clicked
var submit = $(this.id).context.activeElement;
// You can get its name like this
alert(submit.name)
// You can get its attributes like this too
alert($(submit).attr('class'))
});
Ответ 14
Поскольку я не могу прокомментировать принятый ответ, я привожу здесь модифицированную версию, которая должна учитывать элементы, которые вне формы (т.е. прикреплены к форме с помощью атрибута form
). Это для современного браузера: http://caniuse.com/#feat=form-attribute. closest('form')
используется как резерв для неподдерживаемого атрибута form
$(document).on('click', '[type=submit]', function() {
var form = $(this).prop('form') || $(this).closest('form')[0];
$(form.elements).filter('[type=submit]').removeAttr('clicked')
$(this).attr('clicked', true);
});
$('form').on('submit', function() {
var submitter = $(this.elements).filter('[clicked]');
})
Ответ 15
Работая с этим отличным ответом, вы можете проверить активный элемент (кнопку), добавить скрытый ввод в форму и, при необходимости, удалить его в конце обработчик отправки.
$('form.form-js').submit(function(event){
var frm = $(this);
var btn = $(document.activeElement);
if(
btn.length &&
frm.has(btn) &&
btn.is('button[type="submit"], input[type="submit"], input[type="image"]') &&
btn.is('[name]')
){
frm.append('<input type="hidden" id="form-js-temp" name="' + btn.attr('name') + '" value="' + btn.val() + '">');
}
// Handle the form submit here
$('#form-js-temp').remove();
});
Боковое примечание. Я лично добавляю класс form-js
для всех форм, которые передаются через JavaScript.
Ответ 16
Похоже на ответ Стэна, но:
- Если у вас несколько кнопок, вы должны получить только
первая кнопка = > [0]
- если форма может быть отправлена с ключом ввода, вам необходимо управлять значением по умолчанию = > myDefaultButtonId
$(document).on('submit', function(event) {
event.preventDefault();
var pressedButtonId =
typeof $(":input[type=submit]:focus")[0] === "undefined" ?
"myDefaultButtonId" :
$(":input[type=submit]:focus")[0].id;
...
}
Ответ 17
Это решение, используемое мной и работающее очень хорошо:
// prevent enter key on some elements to prevent to submit the form
function stopRKey(evt) {
evt = (evt) ? evt : ((event) ? event : null);
var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
var alloved_enter_on_type = ['textarea'];
if ((evt.keyCode == 13) && ((node.id == "") || ($.inArray(node.type, alloved_enter_on_type) < 0))) {
return false;
}
}
$(document).ready(function() {
document.onkeypress = stopRKey;
// catch the id of submit button and store-it to the form
$("form").each(function() {
var that = $(this);
// define context and reference
/* for each of the submit-inputs - in each of the forms on
the page - assign click and keypress event */
$("input:submit,button", that).bind("click keypress", function(e) {
// store the id of the submit-input on it enclosing form
that.data("callerid", this.id);
});
});
$("#form1").submit(function(e) {
var origin_id = $(e.target).data("callerid");
alert(origin_id);
e.preventDefault();
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<form id="form1" name="form1" action="" method="post">
<input type="text" name="text1" />
<input type="submit" id="button1" value="Submit1" name="button1" />
<button type="submit" id="button2" name="button2">
Submit2
</button>
<input type="submit" id="button3" value="Submit3" name="button3" />
</form>
Ответ 18
Это помогло мне fooobar.com/questions/37075/...
Форма, отправленная только после нажатия кнопки отправки.
var theBtn = $(':focus');
if(theBtn.is(':submit'))
{
// ....
return true;
}
return false;
Ответ 19
Я также сделал решение, и он работает достаточно хорошо:
Он использует jQuery и CSS
Во-первых, я сделал быстрый класс CSS, это может быть встроено или в отдельный файл.
<style type='text/css'>
.Clicked {
/*No Attributes*/
}
</style>
Далее. В событии клика кнопки в форме добавьте класс CSS к кнопке. Если кнопка уже имеет класс CSS, удалите ее. (Нам не нужны два класса CSS [на всякий случай]).
// Adds a CSS Class to the Button That Has Been Clicked.
$("form :input[type='submit']").click(function ()
{
if ($(this).hasClass("Clicked"))
{
$(this).removeClass("Clicked");
}
$(this).addClass("Clicked");
});
Теперь протестируйте кнопку, чтобы увидеть, что у нее есть класс CSS, если у тестируемой кнопки нет CSS, тогда другая кнопка будет.
// On Form Submit
$("form").submit(function ()
{
// Test Which Button Has the Class
if ($("input[name='name1']").hasClass("Clicked"))
{
// Button 'name1' has been clicked.
}
else
{
// Button 'name2' has been clicked.
}
});
Надеюсь, это поможет!
Ура!
Ответ 20
Вы можете создать тип ввода = "скрытый" как держатель для информации о кнопке.
<input type="hidden" name="button" id="button">
<input type="submit" onClick="document.form_name.button.value = 1;" value="Do something" name="do_something">
В этом случае форма передает значение "1" (id вашей кнопки) при отправке. Это работает, если onClick встречается перед submit (?), Что я не уверен, что он всегда прав.
Ответ 21
Простой способ определить, какая <button> или < input type="button"... > нажатие, это проверка их "id":
$("button").click(function() {
var id = $(this).attr('id');
...
});
Ответ 22
Вот пример, который использует this.form, чтобы получить правильную форму, в которую отправляется, и поля данных для хранения последнего элемента с щелчком/сфокусированным. Я также завернул код отправки в таймаут, чтобы убедиться, что события щелчка произойдут до его выполнения (некоторые пользователи сообщили в комментариях, что в Chrome иногда происходит событие щелчка после отправки).
Работает при навигации как с помощью клавиш, так и с помощью мыши/пальцев, не рассчитывая, что браузеры отправят событие клика на клавишу RETURN (хотя это и не повредит), я добавил обработчик событий для событий фокуса для кнопок и полей.
Вы можете добавлять кнопки типа = "submit" к элементам, которые сохраняются при нажатии.
В демоверсии я установил красную рамку, чтобы отобразить выбранный элемент и предупреждение, которое показывает имя и значение/метку.
Вот FIDDLE
И вот код (тот же):
JavaScript:
$("form").submit(function(e) {
e.preventDefault();
// Use this for rare/buggy cases when click event is sent after submit
setTimeout(function() {
var $this=$(this);
var lastFocus = $this.data("lastFocus");
var $defaultSubmit=null;
if(lastFocus) $defaultSubmit=$(lastFocus);
if(!$defaultSubmit || !$defaultSubmit.is("input[type=submit]")) {
// If for some reason we don't have a submit, find one (the first)
$defaultSubmit=$(this).find("input[type=submit]").first();
}
if($defaultSubmit) {
var submitName=$defaultSubmit.attr("name");
var submitLabel=$defaultSubmit.val();
// Just a demo, set hilite and alert
doSomethingWith($defaultSubmit);
setTimeout(function() {alert("Submitted "+submitName+": '"+submitLabel+"'")},1000);
} else {
// There were no submit in the form
}
}.bind(this),0);
});
$("form input").focus(function() {
$(this.form).data("lastFocus", this);
});
$("form input").click(function() {
$(this.form).data("lastFocus", this);
});
// Just a demo, setting hilite
function doSomethingWith($aSelectedEl) {
$aSelectedEl.css({"border":"4px solid red"});
setTimeout(function() { $aSelectedEl.removeAttr("style"); },1000);
}
DUMMY HTML:
<form>
<input type="text" name="testtextortexttest" value="Whatever you write, sir."/>
<input type="text" name="moretesttextormoretexttest" value="Whatever you write, again, sir."/>
<input type="submit" name="test1" value="Action 1"/>
<input type="submit" name="test2" value="Action 2"/>
<input type="submit" name="test3" value="Action 3"/>
<input type="submit" name="test4" value="Action 4"/>
<input type="submit" name="test5" value="Action 5"/>
</form>
DUMB CSS:
input {display:block}
Ответ 23
Я пишу эту функцию, которая помогает мне
var PupulateFormData= function (elem) {
var arr = {};
$(elem).find("input[name],select[name],button[name]:focus,input[type='submit']:focus").each(function () {
arr[$(this).attr("name")] = $(this).val();
});
return arr;
};
а затем использовать
var data= PupulateFormData($("form"));
Ответ 24
Uma solução para pegar o valor do item clickado emm submit
$("form").submit(function() {
// Print the value of the button that was clicked
console.log($(document.activeElement).val());
}
Ответ 25
Вы хотите использовать window.event.srcElement.id следующим образом:
function clickTheButton() {
var Sender = window.event.srcElement;
alert("the item clicked was " + Sender.id)
}
для кнопки, которая выглядит так:
<input type="button" id="myButton" onclick="clickTheButton();" value="Click Me"/>
вы получите предупреждение, которое гласит: "Щелкнутый элемент был myButton.
В вашем улучшенном примере вы можете добавить window.event.srcElement в process_form_submission, и у вас будет ссылка на любой элемент, вызванный процессом.