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, и у вас будет ссылка на любой элемент, вызванный процессом.