jQuery触发器单击 – 请求中没有按钮值

我正在使用ASP.NET MVC4和jQuery进行一项调查。 而且我不是网络开发人员,所以我遇到了一些困难。

我的网站包含(简要说明)顶级菜单和表单。 表单是多步骤,提交按钮“previous”和“next”。 我需要知道步骤类型,所以我命名了按钮,因此它们的值与其他字段一起传递。

当满足某些条件时,我需要在顶部菜单中显示一个额外的按钮(不是表单的一部分;我们现在称之为“addButton”),单击这将导致表单提交。 但我仍然需要知道“步骤类型”,所以我在表单中创建了一个隐藏的提交按钮(让我们称之为“opButton”),当我点击“addButton”时,我只需点击一些javascript / jquery来模拟点击“ opButton“:

onclick="$('#opButton').trigger('click');" 

当我使用桌面浏览器时,一切都完美无瑕 – Request对象中有一个合适的项,它包含按钮的值。 但是,当我在移动设备上工作时(使用Chrome的远程调试进行测试),没有这样的项目 – 我只是得到null,就是这样。

可能是什么原因? 我很感激任何建议。

TLDRPrepend event.preventDefault(); 添加按钮的onclick处理程序或确保添加按钮正确键入type="button"

默认情况下,如果在表单中,则任何未指定其类型的button元素都将被视为提交按钮。 因此,如果您未在HTML中指定type="button" ,则只要您点击它就会触发表单提交,无论是否通过事件处理程序为其提供任何其他行为。

**如果使用event.preventDefault();则例外event.preventDefault(); 或同等学历; 或者如果你从你的处理程序返回false (不, 这些不等同 )。 要么阻止表单提交。*

如果你没有在添加按钮上指定type="button" ,则会触发两个表单提交 – 第一个是提交按钮( #opButton )触发的点击; 第二步通过“原始”添加按钮单击。 提交按钮首先进入表单提交,因为添加按钮将“等待”直到其所有onclick内容都已执行,然后再转到其自己的默认提交。 sumbit按钮的“click”(以及它的表单提交)都在add按钮的onclick处理程序中调用,因此它将在最终退出该处理程序之前执行。

特殊的桌面与移动行为来自于各种浏览器/操作系统组合处理竞争forms提交的方式:有些将在第一个之后阻止并且只发送一个( #opButton提交)(我猜是为了打击双击双提交其他人将开始处理第一个,但如果在卸载页面之前及时发送第二个,则发送第二个。 您的桌面测试正在执行前者,只处理第一个表单提交; 你的移动测试正在做后者并允许最后一个表单提交“覆盖”第一个。

最终,你的代码中没有办法告诉浏览器哪个会有最终决定权:为了获得可靠的性能,你需要制作非提交按钮( #addButtontype=button或者添加event.preventDefault(); 到您的( #addButton )事件处理程序,以便只发生一个表单提交。

当您处于移动环境中时,也许您的被解雇事件(“点击”)不一样,例如“点按”事件。 试着检查一下。

此外,如果您不需要发送opButton,可以直接提交表单,而不是触发隐藏的提交按钮,例如

 $('your_form').submit(); 

使用隐藏项有时可能非常有用,因为每个浏览器根据隐藏它的方式对它们进行不同的处理。

我的消化是摆脱隐藏的按钮。 然后,您可以动态创建隐藏的 ,附加到表单,然后使用jQuery提交:

 $(function() { $('').attr({ type: 'hidden', value: 'addButton', name: 'operation' }).appendTo('form'); $('form').submit(); }); 

然后在您的请求对象上查找“操作”项并从中获取值。