【问题标题】:Given a form with multiple submit buttons, can I control them individually?给定一个带有多个提交按钮的表单,我可以单独控制它们吗?
【发布时间】:2013-02-10 10:58:58
【问题描述】:

我有一个带有两个提交按钮的表单:一个更新购物车中的商品数量,另一个让用户继续结帐。如果购物车中没有物品是“运输”物品,那么我希望用户不能结帐。我仍然希望用户能够更新数量。

原来我用的是这个javascript:

  $('#cartform').submit(function (e) {
    console.log(e)

    if ($('.item.shipping').length > 0) {
      // there are Shipping items in the cart, so proceed
      console.log("OK to checkout")
    } else {
      // there are no Shipping items so display help
      console.log("NO")
      e.preventDefault();
      $('#shipping-calculator-info p').text("Please select shipping destination.")    
    }
  });

我很快意识到这也禁用了更新数量按钮。

我最初的想法是从我要处理的按钮中捕获click 事件,并在其上捕获preventDefault。不过,这似乎并不能阻止提交的发生。接下来我想也许e,事件,可能有一个指定事件来源的字段——然后我就可以在上面的submit代码中添加一个条件。虽然我找不到这样的字段(并且我读到了此信息不存在的提示)。

如何防止同一表单上的多个提交按钮之一的默认操作?

【问题讨论】:

    标签: javascript jquery forms


    【解决方案1】:

    我明白你现在做了什么,你引用的是表单,而不是按钮。没问题,您只需要使用 jQuery 很棒的选择器来查找提交按钮。这是一个工作示例:

    <form id="form1" method="post" action="formDataHandler.php">
    <input name='text1' type='text' value='text input'><br />
    <input id='subBtn1' type='submit' value='submit 1'><br />
    <input id='subBtn2' type='submit' value='submit 2'>
    </form>
    
    <script type="text/javascript">
    $("#form1").find('input[type=submit]').on('click', function (e) {
    alert($(e.target).val());
        if ($(e.target).val() == 'submit 1') { 
        e.preventDefault();
        } else {
            //do something else
        }
    });
    </script>
    

    【讨论】:

    • e.target 似乎给了我正在提交的 DOM 元素,即表单。你能举个例子说明你将如何使用 e.target 来确定点击哪个提交按钮来提交表单?
    【解决方案2】:

    与其附加到表单的提交事件,为什么不附加到实际按钮的点击事件?

    这样您就可以为每个按钮提供适当的代码。您可以在结帐按钮的处理程序中使用 JavaScript 提交表单,然后只需从更新按钮更新 DOM。

    【讨论】:

    • 我实际上无权访问表单本身,因此按钮将始终提交表单。我写了一个点击处理程序来防止默认,但这似乎并没有阻止表单被提交。你能举个例子吗?
    • @Ziggy:如果您可以为按钮编写单击处理程序,则始终可以阻止它提交表单。只需来自按钮处理程序的return false;
    • @EricJ。问题是他不知道如何引用表单中的元素。他引用的是表单 ID,而不是按钮 ID,我无法理解问题所在,直到我意识到:P。我刚刚发布了一个使用 jQuery 选择器获取按钮元素的解决方案。
    【解决方案3】:

    你只需要return false;

    $('#cartform').submit(function (e) {
        console.log(e)
    
        if ($('.item.shipping').length > 0) {
          // there are Shipping items in the cart, so proceed
          console.log("OK to checkout")
        } else {
          // there are no Shipping items so display help
          console.log("NO")
          e.preventDefault();
          $('#shipping-calculator-info p').text("Please select shipping destination.")    
          return false;
        }
    });
    

    【讨论】:

    • 给定一个包含多个提交按钮的表单,我可以单独控制它们吗?例如,如果有两个提交按钮,A 和 B,我是否可以在提交处理程序中编写逻辑,以在 A 提交表单时以某种方式运行,而在 B 提交表单时以另一种方式运行?
    • 如果您想控制离散按钮的 onsubmit 事件,我会接受 Eric J 的建议。
    • @Ziggy 你绝对可以,我发现了你的问题并更新了我的答案。
    【解决方案4】:

    您可以使用的快速解决方法是将提交按钮“转换”为简单按钮,然后将您的代码绑定到点击事件,并在适当的时候从点击事件中使用:

    $('#cartform').submit();
    

    手动提交表单。

    【讨论】:

    • 这是一个不错的选择,但我实际上无权访问该表单。我无法触摸表单本身,我只知道它有多少个按钮。
    • 好的,然后,将它们绑定到单击事件,然后在不需要时使用 preventDefault() 停止提交。我用一个简单的演示形式测试了它,但只在 Chrome 上运行了......
    • 就像下面@TheWeirdNerd 的帖子一样。如果您在选择按钮时遇到问题(如果它们没有任何特殊的 id 或类),那么您可以使用 .first() 和 .last() 或 :first 和 :last
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    相关资源
    最近更新 更多