Javascript 从Jquery回调函数重新提交表单时未调用操作方法

Javascript 从Jquery回调函数重新提交表单时未调用操作方法,javascript,jquery,jsf-2,Javascript,Jquery,Jsf 2,我正在使用JSF/Javascript/Jquery使用Stripe构建一个信用卡支付表单。代码如下: JSF表单 <h:form id="payment-form"> : : Input text fields : <h:commandButton id="submitBtn" value="Submit Payment" styleClass="button round blue" action=

我正在使用JSF/Javascript/Jquery使用Stripe构建一个信用卡支付表单。代码如下:

JSF表单

<h:form id="payment-form">
:
    :
    Input text fields
    :                       
    <h:commandButton id="submitBtn" value="Submit Payment" styleClass="button round blue" action="#{userBean.submitPayment}">
    </h:commandButton>
</h:form>

:
:
输入文本字段
:                       
Jquery中的提交事件处理程序如下-

function stripeResponseHandler(){
    alert("in responseHandler");

    var f = $("#payment-form");
// Token contains id, last4, and card type:
var token = response['id'];

    // Insert the token into the form so it gets submitted to the server
      f.append("<input type='hidden' name='stripeToken' value='" + token + "' />");

// re-enable the submit button
    $("#payment-form\\:submitBtn").attr("disabled", false);

// Submit the form
    //$("#payment-form")[0].submit();
    return false;
}

function reportError(msg) {
    // Show the error in the form:
    $('#payment-errors').text(msg).addClass('alert alert-error');
    // re-enable the submit button:
    $("#payment-form\\:submitBtn").prop('disabled', false);
    return false;
}

$(document).ready(function(){
    $("#payment-form").submit(function(event) {
        alert("in eventHandler");

        // Flag variable:
        var error = false;

        // disable the submit button to prevent repeated clicks:
        $("#payment-form\\:submitBtn").attr("disabled", "disabled");

        // Get the values:
        // Validate the fields
        // Validate other form elements, if needed!

        // Check for errors:
        if (!error) {
            //alert("Getting the token");
            // Get the Stripe token:
            Stripe.card.createToken({
                number: ccNum,
                cvc: cvcNum,
                exp_month: expMonth,
                exp_year: expYear
            }, stripeResponseHandler);

        }
        event.preventDefault();
    });
});
函数stripeResponseHandler(){
警惕(“负责人”);
var f=$(“付款单”);
//令牌包含id、last4和卡类型:
变量标记=响应['id'];
//将令牌插入表单,以便将其提交到服务器
f、 附加(“”);
//重新启用提交按钮
$(“#付款表\\:提交”).attr(“已禁用”,错误);
//提交表格
//$(“#付款单”)[0]。提交();
返回false;
}
函数报告错误(msg){
//在表单中显示错误:
$(“#支付错误”).text(msg.addClass('alert error');
//重新启用“提交”按钮:
$(“#付款表\\:提交”).prop('disabled',false);
返回false;
}
$(文档).ready(函数(){
$(“#付款表”)。提交(功能(事件){
警报(“在事件处理程序中”);
//标志变量:
var错误=错误;
//禁用“提交”按钮以防止重复单击:
$(“#付款表\\:提交”).attr(“禁用”、“禁用”);
//获取值:
//验证字段
//如果需要,验证其他表单元素!
//检查错误:
如果(!错误){
//警报(“获取令牌”);
//获取条带标记:
Stripe.card.createToken({
编号:ccNum,
cvc:cvcNum,
exp_月:exp月,
出口年份:出口年份
},stripeResponseHandler);
}
event.preventDefault();
});
});
(代码取自Stripe以与JSF表单集成)

当从stripeResponseHandler调用h:commandButton的action参数中提到的backingbean方法时,上面的代码不会调用该方法,stripeResponseHandler是Stripe异步响应的回调


有人能解释一下上面代码中的错误吗。

@BalusC-谢谢你的回答,但这个问题没有回答,在这种情况下也不起作用。禁用实际上发生在控件传递给事件处理程序之后,并在重新提交之前重新启用。如果同步调用stripeResponsehandler(在event.preventDefault之后立即调用),则上述代码有效,但在异步回调情况下不起作用。Stripe建议将上述代码用于与php、java等关联的常规html表单。。但它不适用于JSF。有什么具体原因吗?