`$(函数提交后没有被调用按钮
我使用stripe.js来学习自定义付款,我使用.net MVC创建一个简单的网站来处理付款。我对webdev并不陌生,不能为生我找出为什么这个js函数在提交按钮点击后没有被调用,我现在把标记放入ViewBag中,这样我就可以查看数据了。进一步的上下文中,我想处理令牌服务器端,同时生成令牌客户端,我可能错过了一些简单的,但在这一点上,我已经尝试了我能找到的所有东西
这是我用来测试卡充电的代码 这是一个部分cshtml文件,在输入数据时,这个cshtml将通过调用@Html.Partial("~/Views/Home/processors.cshtml")
@using System.Web.Mvc
@using System.Web.Mvc.Html
@using System
@using System.Web.UI
@model Dependency_Injection_MEF_MVC.Models.Payment
<script type="text/javascript" src="https://js.stripe.com/v2/"></script>
<script type="text/javascript">
Stripe.setPublishableKey('pk_test_rob8TRTyyRseiTwrqSmheKiZ');
</script>
<script type="text/javascript">
$(function() {
var $form = $('#payment-form');
$form.submit(function (event) {
// Disable the submit button to prevent repeated clicks:
$form.find('.submit').prop('disabled', true);
// Request a token from Stripe:
Stripe.card.createToken($form, stripeResponseHandler);
// Prevent the form from being submitted:
return false;
});
});
function stripeResponseHandler(status, response) {
// Grab the form:
var $form = $('#payment-form');
if (response.error) { // Problem!
// Show the errors on the form:
$form.find('.payment-errors').text(response.error.message);
$form.find('.submit').prop('disabled', false); // Re-enable submission
} else { // Token was created!
// Get the token ID:
var token = response.id;
// Insert the token ID into the form so it gets submitted to the server:
$form.append($('<input type="hidden" name="Token">').val(token));
// Submit the form:
$form.get(0).submit();
}
};
</script>
<div class="row">
<div class="col-md-12 form-column">
<div class="form-container">
<form asp-controller="home" asp-action="InvoicePayment" method="POST" id="payment-form">
<span class="payment-errors"></span>
<div class="form-group">
<h3>Membership Amount: USD XX</h3>
</div>
<div class="form-group">
<label for="cardNumber">Card Number</label>
<input class="form-control form-input" id="cardNumber" type="text" size="20" data-stripe="number" style= "width:250px;height:25px;font-size:120%">
</div>
<div class="form-group">
<label>Expiration (MM/YY)</label>
<div>
<input class="form-control form-input date-input" type="text" size="2" data-stripe="exp_month" style= "width:250px;height:25px;font-size:120%">
<input class="form-control form-input date-input" type="text" size="2" data-stripe="exp_year" style= "width:250px;height:25px;font-size:120%">
</div>
</div>
<div class="form-group">
<label for="cvc">CVC</label>
<input class="form-control form-input" id="cvc" type="text" size="4" data-stripe="cvc" style= "width:250px;height:25px;font-size:120%">
</div>
<input class="submit" type="submit" id="submit" value="Submit Payment">
</form>
</div>
</div>
</div>
您的JavaScript在您指定的实际表单存在之前运行。您需要将它移动到HTML格式之后,或者更好,在关闭正文标记之前。
UPDATE
,可能会导致你的事件处理程序不会被解雇是唯一的东西:
它不结合形成。这可能是由许多因素造成的,其中之一是上面讨论的原始问题。所以,正如我所说的,您的JavaScript必须在它所针对的HTML之后运行,所以不要仅仅因为它仍然无法正常工作而将其移回。还有其他问题。这也可能是由选择器不匹配引起的,但在这里似乎不是这种情况。
存在阻止脚本运行的JavaScript错误。 JavaScript中断了错误,所以任何进一步的JavaScript都不会运行。不过,您声称没有错误报告,所以这似乎也不是问题。
-
唯一的另外一个问题是,作为对AJAX请求的HTML响应的一部分包含的JavaScript未运行。尽管您没有明确提到过AJAX,但您的问题似乎表明此表单可能会作为AJAX请求的结果显示出来。为了安全起见,浏览器将在AJAX响应中转义任何脚本标记,所以你只是在那里运气不好。您唯一的选择是将此脚本作为主视图的一部分,然后推迟您的事件处理程序绑定。例如:
$(body).on('submit', '#payment-form', function() {
这将允许你绑定到
#payment-form
即使它目前不存在在页面上,你实际上是结合body
和jQuery会直接转给的#payment-form
处理此事件后,气泡直到那里。但是,您不应该实际绑定到body
。我这样做只是因为它保证了工作,但它也非常低效。您应该选择与绑定时存在的付款表单绝对最接近的父级(即,不包含在AJAX响应中的内容)。
现在好了,但我确定我曾尝试过。我会尽快通知你。谢谢! –
确实可能还有其他问题需要进一步解决,但您肯定无法在表单存在之前运行JavaScript,因此,这是第1步。 –
除非它发布并重置,否则Nope仍然没有任何效果整个页面。 HTML加载正常,但由于某种原因js方法没有被调用!你是正确的,它真的很难调试,并找出它发生的原因,你知道一种调试方法,并找到他们根源的问题是? –
单击提交时,浏览器开发人员控制台中是否显示任何错误? – justiceorjustus
nope它只是POSTS,然后重置页面 –
我有这个部分视图之外的另一个按钮,也发布基于'id = submit'会这是你认为的冲突吗?它不应该是正确的,因为这只是关于'id =“payment-form”''var'form = $('#payment-form');' –