【问题标题】:Trying to capture a form submit event, then not capture it again尝试捕获表单提交事件,然后不再捕获它
【发布时间】:2016-08-22 06:48:32
【问题描述】:

编辑:@mhodges 回答了这个问题。 Jsfiddle 已更新。谢谢!

我正在设置一个小计算器/捐款表格。表单很简单:输入一个数字,然后提交按钮执行计算并获得一个新值,此时我希望它链接到捐赠页面。下面是一些示例代码:

<form id = "donation" action = "donation/page">
  <input id = "firstNumber" placeholder = "400.00">
  <input type = "submit" id = "submit" value = "Calculate Number">
</form>

这是我运行的 jquery:

$(document).ready(function(){
  $("#donation:not(.ready)").submit(function(e){
    e.preventDefault;
    var amount = $("#firstNumber").val() / 5;
    $("#firstNumber").val(amount);
    $("#submit").val("Donate Now!");
    $("#donation").addClass("ready");
  });
});

编辑:拼写和 JS 小提琴的链接:

JS Fiddle

所以计算器工作得很好,新值在输入中显示得很好。我的问题是提交按钮的值没有改变,即使在获得 .ready 类之后,提交按钮也会继续执行计算。我认为在我的 jquery 中使用 not:(.ready) 选择器可以解决这个问题,但事实并非如此。有什么想法吗?谢谢!

【问题讨论】:

    标签: jquery forms submit calculator


    【解决方案1】:

    您需要使用event delegation 而不是事件绑定。代码如下所示:

    $(document).ready(function(){
      $(document).on("submit", "#donation:not(.ready)", function(e){
        e.preventDefault();
        var amount = $("#firstNumber").val() / 5;
        $("#firstNumber").val(amount);
        $("#submit").val("Donate Now!");
        $("#donation").addClass("ready");
      });
    });
    

    另请注意 - e.preventDefault() 是一个函数,因此需要括号

    【讨论】:

    • 这似乎是最好的答案。我是 jquery 的新手,所以没有考虑委托与绑定。非常感谢。
    • @JamesHamann 不用担心,即使您已经使用 jQuery 很长时间,也很容易上当。查看我在帖子中添加的事件委托链接,我认为它很好地解释了差异。
    【解决方案2】:

    您首先进行选择,然后将您的函数绑定到找到的元素。选择器找到的对象列表稍后不会更改。如果您只想对每个元素和事件执行一次事件处理程序,请尝试 jQuery.one

    【讨论】:

    • 这是可以接受的,但是 .one() 的唯一问题是它不再依赖于“就绪”类。如果出于某种原因,在事件处理程序期间出现某些错误并且类没有被应用,那么这是一个问题。如果不刷新页面,用户将无法重试。对于这个非常基本的示例,这是极不可能的,但如果代码变得更复杂,尤其是如果有一个 ajax 调用来执行计算,出错的机会就会显着增加,你需要一种让应用程序优雅地失败的方法.
    • 然后检查处理程序中的元素是否为“.ready”。无论如何,你的答案更好,@mhodges。
    • 是的,不幸的是,如果你在其中抛出一个 if(hasClass(".ready")) ,如果它没有通过,你的事件处理程序仍然会得到 .off() 让你同样的问题。这绝对是一个边缘案例,但我认为值得一提。只要您围绕错综复杂的错误处理进行编码,您的解决方案就有效,我只是想指出为 OP 和未来的观众使用此解决方案的警告
    • 这对我来说很完美。太感谢了。甚至不知道 one()
    猜你喜欢
    • 2010-11-23
    • 2016-02-18
    • 2013-08-29
    • 1970-01-01
    • 2013-07-12
    • 2019-08-25
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    相关资源
    最近更新 更多