Javascript `$(函数`提交按钮后未被调用

Javascript `$(函数`提交按钮后未被调用,javascript,asp.net-mvc,asp.net-mvc-4,stripe-payments,Javascript,Asp.net Mvc,Asp.net Mvc 4,Stripe Payments,我正在使用stripe.js学习定制支付,我正在使用.net MVC创建一个简单的网站来处理支付。我对webdev是相当陌生的,我一辈子都不明白为什么在单击submit按钮后没有调用这个js函数,我现在正在将令牌放入ViewBag中,这样我就可以查看数据了。进一步的上下文,我想在生成令牌客户端的同时处理令牌服务器端。我可能缺少一些简单的东西,但在这一点上,我已经尝试了我能找到的一切 这是我用来测试信用卡收费的代码。 这是一个部分cshtml文件,在输入数据时,通过调用@Html.partial(

我正在使用stripe.js学习定制支付,我正在使用.net MVC创建一个简单的网站来处理支付。我对webdev是相当陌生的,我一辈子都不明白为什么在单击submit按钮后没有调用这个js函数,我现在正在将令牌放入ViewBag中,这样我就可以查看数据了。进一步的上下文,我想在生成令牌客户端的同时处理令牌服务器端。我可能缺少一些简单的东西,但在这一点上,我已经尝试了我能找到的一切

这是我用来测试信用卡收费的代码。 这是一个部分cshtml文件,在输入数据时,通过调用
@Html.partial(“~/Views/Home/processors.cshtml”)

@使用System.Web.Mvc
@使用System.Web.Mvc.Html
@使用系统
@使用System.Web.UI
@模型依赖性\u注入\u MEF\u MVC.Models.Payment
Stripe.setPublishableKey('pk_test_rob8TRTyyRseiTwrqSmheKiZ');
$(函数(){
var$form=$(“#付款单”);
$form.submit(函数(事件){
//禁用“提交”按钮以防止重复单击:
$form.find('.submit').prop('disabled',true);
//从Stripe请求令牌:
Stripe.card.createToken($form,stripeResponseHandler);
//阻止提交表单:
返回false;
});
});
函数stripeResponseHandler(状态、响应){
//抓取表格:
var$form=$(“#付款单”);
if(response.error){//问题!
//在表单上显示错误:
$form.find('.payment errors').text(response.error.message);
$form.find('.submit').prop('disabled',false);//重新启用提交
}否则{//令牌已创建!
//获取令牌ID:
var token=response.id;
//将令牌ID插入表单,以便将其提交到服务器:
$form.append($('').val(标记));
//提交表格:
$form.get(0.submit();
}
};
会员金额:XX美元
卡号
有效期(年月日)
CVC

您的JavaScript在目标实际表单存在之前运行。您需要将其移动到表单HTML之后,或者更好,刚好在结束正文标记之前

更新

导致事件处理程序不被触发的唯一原因是:

  • 它不绑定到表单。这可能是由多个因素造成的,其中一个是上面讨论的原始问题。因此,正如我所说,JavaScript必须在它所针对的HTML之后运行,所以不要仅仅因为它仍然不工作就将其移回。还有其他问题在起作用。它也可能是由选择器不匹配引起的,但这里的情况似乎不是这样

  • 有一个JavaScript错误导致脚本无法运行。JavaScript会在出现错误时中断,因此任何进一步的JavaScript都不会运行。但是,您声称没有报告任何错误,因此这似乎也不是问题所在

  • 唯一的另一件事是,作为对AJAX请求的HTML响应的一部分包含的JavaScript没有运行。虽然您没有明确提到AJAX,但您的问题似乎表明此表单可能显示为AJAX请求的结果。为了安全起见,浏览器将转义AJAX响应中的任何脚本标记,因此您需要我们在这方面运气不佳。您唯一的选择是将此脚本作为主视图的一部分,然后推迟事件处理程序绑定。例如:

    $(body).on('submit', '#payment-form', function () {
    
    这将允许您绑定到
    #支付表单
    ,即使它当前在页面上不存在,因为您实际上绑定到
    正文
    ,一旦事件出现,jQuery将直接转发到处理
    #支付表单
    。但是,您不应该实际绑定到
    正文
    。我只是这么做的因为这保证会起作用,但效率也很低。您应该选择绑定时存在的与您的支付表单最接近的父级(即,AJAX响应中不包含的内容)


  • 当您单击“提交”时,浏览器开发人员控制台中是否显示任何错误?不,它只是发布然后重置页面。我在这个局部视图之外还有另一个按钮,它也基于
    id=Submit
    进行发布。您认为这会是一个冲突吗?它不应该正确,因为这只涉及
    id=“付款表单”
    自从
    var$form=$(“#支付表单”);
    当您在浏览器调试器中设置断点时,调试器是否会一步一步地执行所有代码?我已经看到了在不运行代码的情况下提交的问题。您可以始终尝试
    。单击()
    ,只需执行
    $(“#formId”)。提交()
    或其他一些我认为正在发生的事情,我仍然不熟悉在windows中使用调试器。Visual Studio中的调试器甚至没有达到这一点,因为在cshtml中进行JS调试可能是不可能的。好的,现在尝试一下,但我确信我以前已经尝试过。我会很快告诉你。谢谢!可能确实有潜在的问题还有其他需要进一步解决的问题,但是在表单存在之前运行JavaScript肯定是行不通的,所以这就是步骤1。不,除了发布和
    $(body).on('submit', '#payment-form', function () {