jQuery:如何在表单提交时点击哪个按钮?

时间:2011-04-19 19:39:46

标签: jquery forms

我为表单提交设置了.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's 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>

Live example on jsfiddle

除了在每个按钮上应用.click()事件之外,有没有办法确定单击了哪个提交按钮?

29 个答案:

答案 0 :(得分:215)

我问了同样的问题:How can I get the button that caused the submit from the form submit event?

我最终想出了这个解决方案并且效果很好:

$(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");
    });
});

在您使用多种表单的情况下,您可能需要稍微调整一下,但它仍然应用

答案 1 :(得分:81)

我发现这很有用。

$(document).ready(function() {
    $( "form" ).submit(function () {
        // Get the submit button element
        var btn = $(this).find("input[type=submit]:focus" );
    });
}

答案 2 :(得分:57)

这对我有用:

$("form").submit(function() {
   // Print the value of the button that was clicked
   console.log($(document.activeElement).val());
}

答案 3 :(得分:39)

提交表单时:

  • document.activeElement会为您提供点击的提交按钮。

  • document.activeElement.getAttribute('value')会为您提供该按钮的价值。

答案 4 :(得分:27)

这种方法对我来说似乎更清晰。

首先,对于任何和所有形式:

$('form').click(function(event) {
  $(this).data('clicked',$(event.target))
});

当为表单触发此click事件时,它只记录稍后要访问的原始目标(在事件对象中可用)。这是一个相当广泛的笔划,因为它将触发表单上任何位置的任何单击。欢迎优化评论,但我怀疑它永远不会引起明显的问题。

然后,在$('form')。submit()中,您可以查询最后点击的内容,例如

if ($(this).data('clicked').is('[name=no_ajax]')) xhr.abort();

答案 5 :(得分:13)

哇,有些解决方案会变得复杂!如果您不介意使用简单的全局,只需利用输入按钮单击事件首先触发的事实。可以使用$('#myForm input')进一步过滤$('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);
      });
    });

答案 6 :(得分:7)

我发现最好的解决方案是

$(document.activeElement).attr('id')

这不仅适用于输入,也适用于按钮标签。 它也获得了按钮的ID。

答案 7 :(得分:6)

以Stan和yann-h所做的为基础,但这个默认为第一个按钮。这种整体方法的优点在于它可以同时选择点击和输入键(即使焦点不在按钮上。如果你需要允许输入表单,那么只需在按钮聚焦时响应这一点(即Stan的答案。在我的情况下,即使用户当前关注的是文本框,我也希望允许输入提交表单。

我还使用了一个名字&#39;属性而不是&#39; id&#39;但这是同样的方法。

var pressedButtonName =
     typeof $(":input[type=submit]:focus")[0] === "undefined" ?
     $(":input[type=submit]:first")[0].name :
     $(":input[type=submit]:focus")[0].name;

答案 8 :(得分:6)

另一种可能的解决方案是在表单中添加隐藏字段:

<input type="hidden" id="btaction"/>

然后在ready函数中添加函数来记录按下的键:

$('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);
});

现在在表单submition处理程序中读取隐藏变量并根据它来决定:

var act = $('form#myForm #btaction').val();

答案 9 :(得分:5)

哇...很高兴在这里看到太多解决方案。但是在 SubmitEvent 界面上有一个原生的 Javascript 属性 submitterhttps://developer.mozilla.org/en-US/docs/Web/API/SubmitEvent/submitter

原生 Javascript

var btnClicked = event.submitter;

JQuery 版本

var btnClicked = event.originalEvent.submitter;

答案 10 :(得分:4)

这个对我有用

$('#Form').submit(function(){
var btn= $(this).find("input[type=submit]:focus").val();
alert('you have clicked '+ btn);

}

答案 11 :(得分:4)

如果您不添加.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 );
}

答案 12 :(得分:3)

试试这个:

$(document).ready(function(){
    
    $('form[name="testform"]').submit( function(event){
      
        // This is the ID of the clicked button
        var clicked_button_id = event.originalEvent.submitter.id; 
        
    });
});

答案 13 :(得分:3)

对我来说,最好的解决方案是:

$(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 :(得分:3)

$("form input[type=submit]").click(function() {
    $("<input />")
        .attr('type', 'hidden')
        .attr('name', $(this).attr('name'))
        .attr('value', $(this).attr('value'))
    .appendTo(this)
});

添加隐藏字段

答案 15 :(得分:3)

由于我无法对接受的答案发表评论,因此我在此处提供了一个修改后的版本,该版本应考虑表单之外的元素(即:使用form属性附加到表单)。这适用于现代浏览器:http://caniuse.com/#feat=form-attributeclosest('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]');
})

答案 16 :(得分:2)

这是我使用的解决方案并且运作良好:

// 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's 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>

答案 17 :(得分:2)

您可以在提交表单时简单地获取事件对象。从中获取提交者对象。如下:

$(".review-form").submit(function (e) {
        e.preventDefault(); // avoid to execute the actual submit of the form.

        let submitter_btn = $(e.originalEvent.submitter);
        
        console.log(submitter_btn.attr("name"));
}

如果您想将此表单发送到后端,您可以通过 new FormData() 创建一个新的表单元素并设置按下按钮的键值对,然后在后端访问它。像这样 -

$(".review-form").submit(function (e) {
        e.preventDefault(); // avoid to execute the actual submit of the form.

        let form = $(this);
        let newForm = new FormData($(form)[0]);
        let submitter_btn = $(e.originalEvent.submitter);
        
        console.log(submitter_btn.attr("name"));

        if (submitter_btn.attr("name") == "approve_btn") {
            newForm.set("action_for", submitter_btn.attr("name"));
        } else if (submitter_btn.attr("name") == "reject_btn") {
            newForm.set("action_for", submitter_btn.attr("name"));
        } else {
            console.log("there is some error!");
            return;
        }
}

我基本上是想有一个表单,用户可以在其中批准或不批准/拒绝产品,以便在任务中进行进一步的处理。 我的 HTML 表单是这样的 -

<form method="POST" action="{% url 'tasks:review-task' taskid=product.task_id.id %}"
    class="review-form">
    {% csrf_token %}
    <input type="hidden" name="product_id" value="{{product.product_id}}" />
    <input type="hidden" name="task_id" value="{{product.task_id_id}}" />
    <button type="submit" name="approve_btn" class="btn btn-link" id="approve-btn">
        <i class="fa fa-check" style="color: rgb(63, 245, 63);"></i>
    </button>
    <button type="submit" name="reject_btn" class="btn btn-link" id="reject-btn">
            <i class="fa fa-times" style="color: red;"></i>
    </button>
</form>

如果您有任何疑问,请告诉我。

答案 18 :(得分:2)

这是我的解决方案:

   $('#form').submit(function(e){   
        console.log($('#'+e.originalEvent.submitter.id));
        e.preventDefault();
    });

答案 19 :(得分:2)

与斯坦回答相似但是:

  • 如果您有多个按钮,则必须只获取 第一个按钮=&gt; [0]
  • 如果可以使用回车键提交表单,则必须管理默认值=&gt; myDefaultButtonId

$(document).on('submit', function(event) {
    event.preventDefault();
    var pressedButtonId = 
         typeof $(":input[type=submit]:focus")[0] === "undefined" ? 
         "myDefaultButtonId" :
         $(":input[type=submit]:focus")[0].id;
    ...
 }

答案 20 :(得分:1)

我能够在带有 ASP.Net Core 网络应用程序的 Chrome 上使用 jQuery originalEvent.submitter

我的 .cshtml 表单:

<div class="form-group" id="buttons_grp">
    <button type="submit" name="submitButton" value="Approve" class="btn btn-success">Approve</button>
    <button type="submit" name="submitButton" value="Reject" class="btn btn-danger">Reject</button>
    <button type="submit" name="submitButton" value="Save" class="btn btn-primary">Save</button>
    ...

jQuery 提交处理程序:

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
<script type="text/javascript">
    $(document).ready(function() {
    ...
    // Ensure that we log an explanatory comment if "Reject"
    $('#update_task_form').on('submit', function (e) {
        let text = e.originalEvent.submitter.textContent;
        if (text == "Reject") {
           // Do stuff...
        }
    });
    ...

与我的 ASP.Net Core 环境捆绑在一起的 jQuery Microsoft 是 v3.3.1。

答案 21 :(得分:1)

它帮助了我https://stackoverflow.com/a/17805011/1029257

仅在单击提交按钮后提交表单。

var theBtn = $(':focus');
if(theBtn.is(':submit'))
{
  // ....
  return true;
}

return false;

答案 22 :(得分:0)

您可以创建输入类型=&#34;隐藏&#34;作为按钮ID信息的持有者。

<input type="hidden" name="button" id="button">
<input type="submit" onClick="document.form_name.button.value = 1;" value="Do something" name="do_something">

在这种情况下,表单传递值&#34; 1&#34;提交时(你的按钮的ID)。如果onClick在提交(?)之前发生,这是有效的,我不确定它是否总是正确。

答案 23 :(得分:0)

区分哪个&lt; button&gt;的简单方法或&lt; input type =“button”...&gt;按下,是通过检查他们的'id':

$("button").click(function() {
  var id = $(this).attr('id');
  ... 
});

答案 24 :(得分:0)

这是一个示例,它使用this.form来获取提交所使用的正确表单,以及用于存储最后一次单击/聚焦元素的数据字段。我还在超时内包装提交代码以确保点击事件在执行之前发生(一些用户在评论中报告Chrome上有时会在提交后触发点击事件)。

当使用键和鼠标/手指导航两者而不指望浏览器在RETURN键上发送点击事件时(虽然没有伤害),我可以使用按钮和字段为焦点事件添加事件处理程序。

您可以将类型=“提交”的按钮添加到单击时自行保存的项目。

在演示中,我设置了一个红色边框来显示所选项目以及一个显示名称和值/标签的警报。

以下是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}

答案 25 :(得分:0)

我写了这个对我有帮助的功能

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"));

答案 26 :(得分:0)

$('form').submit(function (ev) {
  let clickedButton = ev.originalEvent.explicitOriginalTarget;
});

答案 27 :(得分:0)

我也做了一个解决方案,效果很好:
它使用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.
        }
    });

希望这有帮助! 干杯!

答案 28 :(得分:-1)

你想像这样使用 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,并且您将引用任何调用该进程的元素。