单击虚拟 rails 'submit' 按钮,在发布前进行最后检查

Click dummy rails 'submit' button that does final checks before posting

我目前正在升级我们的 Braintree SDK,它使用 JavaScript 劫持 Rails 表单 'submit' 按钮,调用 Braintree.js,成功后,允许我们Post我们的数据正常。

问题是我们已经在使用提交按钮,使用几个 JavaScript 方法检查表单数据,然后调用 $form.submit() 继续 Post 处理数据。两者是矛盾的。

我的解决方案是创建一个伪造的 "submit" 按钮并在点击时,让它 运行 验证数据的方法,然后让它调用 $form.submit(),允许 Braintree.js 劫持真正的提交按钮。我是否没有正确调用表单上的提交调用?

我的假提交按钮后跟实际提交按钮(id:place_order_submit)...

%p.advance-container.clearfix
    %input#check-order.btn.btn-xlarge.btn-primary.action-check-order{type: 'button', value: 'Check Order'}
    %input#place_order.btn.btn-xlarge.btn-primary.action-submit{type: 'submit', id: 'submit', value: 'Place Order'}

这是 Coffeescript 应该做的事情(即仔细检查订单)然后 "click" 提交表单按钮让它 process/post 正常(允许它被 Braintree 劫持) .

$form: $('form')
$formGroups: $(".form-group")
formGroupIds: $('.form-group').map -> $(this).attr('id')
lastFormGroupId: $(".form-group").last().attr('id')
$checkOrderButton: $('#check-order')

@$checkOrderButton.on 'click', (event)=>
    event.preventDefault()
    try
      q.Orders.items.isAssertAllAvailablePollEnabled = false
      @$pageCover.show()
      $.when(@items.ensureAllAvailable(), @shippingAddr.save(), @billingAddr.save())
      .done =>
        q.Logger.debug 'pre-Braintree requests done, go!'
        q.Util.resetSubmissionState 'form'
        @$checkOrderButton.off('click')
        $('#place_order_submit').submit() # <-- THIS ISN'T WORKING
      .fail ->
        q.Orders.items.isAssertAllAvailablePollEnabled = true
        q.Logger.warn "At least one pre-Braintree request failed, submit halted. Details: #{JSON.stringify(this, null, 4)}"
        q.Util.resetSubmissionState 'form'
        @$pageCover.hide()
    catch ex
      q.Logger.warn "pre-Braintree request failed with exception: #{ex}"
      q.Util.resetSubmissionState 'form'
      @$pageCover.hide()

我意识到我的错误...我所要做的就是更改此行...

$('#place_order_submit').submit() to $('#place_order_submit').click()

(感谢@agf 的建议。)