我为表单提交设置了一个 .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>
除了在每个按钮上应用 .click() 事件之外,还有没有办法确定单击了哪个提交按钮?
name
怎么样?
我问了同样的问题: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");
});
});
在您有多种表格的情况下,您可能需要稍微调整一下,但它仍然应该适用
我发现这行得通。
$(document).ready(function() {
$( "form" ).submit(function () {
// Get the submit button element
var btn = $(this).find("input[type=submit]:focus" );
});
}
这对我有用:
$("form").submit(function() {
// Print the value of the button that was clicked
console.log($(document.activeElement).val());
}
activeElement
的 id
,我做了 $(document.activeElement).attr('id');
document.activeElement.id
document.activeElement
不是输入。在我的例子中,它是一个模态 div(包含表单)。
提交表单时:
document.activeElement 将为您提供被点击的提交按钮。
document.activeElement.getAttribute('value') 将为您提供该按钮的值。
请注意,如果通过按 Enter 键提交表单,则 document.activeElement
将是当时关注的表单 input
。如果这不是提交按钮,那么在这种情况下,可能没有“被点击的按钮”。
document.activeElement
但仍然有效:在这种情况下,它为您提供提交表单的输入而不是按钮。我已经更新了答案以明确这一点。谢谢。
对于我的目的,这是看起来更清洁的方法。
首先,对于任何和所有形式:
$('form').click(function(event) {
$(this).data('clicked',$(event.target))
});
当为表单触发此单击事件时,它仅记录原始目标(在事件对象中可用)以供稍后访问。这是一个相当广泛的笔触,因为它会在表单上的任何位置单击。欢迎优化评论,但我怀疑它永远不会引起明显的问题。
然后,在 $('form').submit()
中,您可以查询上次点击的内容,例如
if ($(this).data('clicked').is('[name=no_ajax]')) xhr.abort();
return false
取消表单的提交事件时,这会导致困难,而此方法可以正常工作,因为单击绑定到表单而不是其子项。
... $(event.target))
后缺少分号,但无法编辑,因为编辑必须是 > 6 个字符
哇...很高兴在这里看到太多解决方案。但是 SubmitEvent 接口上有一个原生 Javascript 属性 submitter。 https://developer.mozilla.org/en-US/docs/Web/API/SubmitEvent/submitter
本机 Javascript
var btnClicked = event.submitter;
jQuery版本
var btnClicked = event.originalEvent.submitter;
哇,一些解决方案可能会变得复杂!如果您不介意使用简单的全局,只需利用输入按钮单击事件首先触发的事实。可以使用 $('#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);
});
});
我发现最好的解决方案是
$(document.activeElement).attr('id')
这不仅适用于输入,也适用于按钮标签。它还获取按钮的 id。
$(document.activeElement).attr('id')
返回 undefined
另一种可能的解决方案是在表单中添加一个隐藏字段:
<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);
});
现在在表单提交处理程序中读取隐藏变量并根据它做出决定:
var act = $('form#myForm #btaction').val();
建立在 Stan 和 yann-h 所做的基础上,但这个默认为第一个按钮。这种整体方法的美妙之处在于它同时获取了点击和回车键(即使焦点不在按钮上。如果您需要允许在表单中输入,那么只需在按钮获得焦点时响应( ie Stan's answer). 就我而言,即使用户当前的焦点在文本框上,我也希望允许 enter 提交表单。
我也使用了“name”属性而不是“id”,但这是相同的方法。
var pressedButtonName =
typeof $(":input[type=submit]:focus")[0] === "undefined" ?
$(":input[type=submit]:first")[0].name :
$(":input[type=submit]:focus")[0].name;
这个对我有用
$('#Form').submit(function(){
var btn= $(this).find("input[type=submit]:focus").val();
alert('you have clicked '+ btn);
}
这是我的解决方案:
$('#form').submit(function(e){
console.log($('#'+e.originalEvent.submitter.id));
e.preventDefault();
});
event.originalEvent.submitter
是按钮,因此可以从中读取其他唯一分配的属性。
如果您不添加 .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 );
}
event.preventDefault
或执行类似 input.parents("form")[0].submit()
的操作。
由于我无法对已接受的答案发表评论,因此我在这里带来了一个修改版本,该版本应考虑表单之外的元素(即:使用 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]');
})
"button,[type=submit]"
您可以在提交表单时简单地获取事件对象。从中获取提交者对象。如下:
$(".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>
如果您有任何疑问,请告诉我。
尝试这个:
$(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;
});
});
event.originalEvent.submitter
是按钮,因此可以从中读取其他唯一分配的属性。
$("form input[type=submit]").click(function() {
$("<input />")
.attr('type', 'hidden')
.attr('name', $(this).attr('name'))
.attr('value', $(this).attr('value'))
.appendTo(this)
});
添加隐藏字段
button[type=submit]
和 input[type=image]
。
对我来说,最好的解决方案是:
$(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'))
});
使用 this excellent answer,您可以检查活动元素(按钮),将隐藏的输入附加到表单,并可选择在提交处理程序的末尾将其删除。
$('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();
});
旁注:我个人在通过 JavaScript 提交的所有表单上添加了类 form-js
。
类似于 Stan 的回答,但是:
如果您有多个按钮,则必须只获得第一个按钮 => [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;
...
}
这是我使用的解决方案,效果很好:
// 防止在某些元素上输入键以防止提交表单 function stopRKey(evt) { evt = (evt) ? evt:((事件)?事件:空); 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; // 获取提交按钮的 id 并将其存储到表单 $("form").each(function() { var that = $(this); // 为每个提交输入定义上下文和引用 /* - 在页面上的每个表单中 - 分配点击和按键事件 */ $("input:submit,button", that). bind("click keypress", function(e) { // 将提交输入的 id 存储在它的封闭表单上 that.data("callerid", this.id); }); }); $("#form1 ").submit(function(e) { var origin_id = $(e.target).data("callerid"); alert(origin_id); e.preventDefault(); }); });
这对我来说可以获得活动按钮
var val = document.activeElement.textContent;
它帮助了我https://stackoverflow.com/a/17805011/1029257
仅在单击提交按钮后才提交表单。
var theBtn = $(':focus');
if(theBtn.is(':submit'))
{
// ....
return true;
}
return false;
我能够通过 ASP.Net Core Web 应用在 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。
假设我有这些“提交”按钮:
<button type="submit" name="submitButton" id="update" value="UpdateRecord" class="btn btn-primary">Update Record</button>
<button type="submit" name="submitButton" id="review_info" value="ReviewInfo" class="btn btn-warning sme_only">Review Info</button>
<button type="submit" name="submitButton" id="need_more_info" value="NeedMoreInfo" class="btn btn-warning sme_only">Need More Info</button>
而这个“提交”事件处理程序:
$('#my_form').on('submit', function (e) {
let x1 = $(this).find("input[type=submit]:focus");
let x2 = e.originalEvent.submitter.textContent;
任何一种表达方式都有效。如果我单击第一个按钮,“x1”和“x2”都返回 Update Record
。
我也做了一个解决方案,效果很好:它使用 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.
}
});
希望这可以帮助!干杯!
button[type=submit]
和 input[type=image]
。
hasClass()
和 removeClass()
的行是多余的,因为 addClass()
不会将同一个类添加两次。
您可以创建 input type="hidden" 作为按钮 id 信息的持有者。
<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 在提交(?)之前发生,则此方法有效,我不确定它是否总是正确的。
区分哪个
$("button").click(function() {
var id = $(this).attr('id');
...
});
这是一个示例,它使用 this.form 来获取提交的正确表单,并使用数据字段来存储最后点击/聚焦的元素。我还将提交代码包装在超时内,以确保在执行之前发生点击事件(一些用户在评论中报告说,在 Chrome 上有时会在提交后触发点击事件)。
在使用键和鼠标/手指导航时工作,而不指望浏览器在 RETURN 键上发送点击事件(虽然没有伤害),我为按钮和字段的焦点事件添加了一个事件处理程序。
您可以将 type="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);
}
虚拟 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>
愚蠢的CSS:
input {display:block}
我写了这个对我有帮助的函数
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"));