我有一个通过AJAX动态加载的表单。我尝试在表单上绑定beforeSubmit
,但它似乎失败,因为表单正在提交,浏览器正在加载新页面。当表单在页面中是静态的时,beforeSubmit
事件处理程序正在运行,浏览器没有更改位置。我试图从$('#emailForm').on('beforeSubmit', function(event) {
更改为以下但它没有工作。如何在表单上附加beforeSubmit
?
view
<div id="emailBody"><!-- Placeholder for email form w/CAPTCHA --></div>
<?#= $this->render('_email_form.php', ['emailModel' => new EmailModel()]) ?>
partial
<?php $form = ActiveForm::begin(['id' => 'emailForm', 'action' => 'send-email', 'method' => 'post', 'enableAjaxValidation' => false, 'options' => ['class' => '']]) ?>
<?= $form->field($emailModel, 'fromName') ?>
JavaScript
jQuery(function() {
$('#emailModal').on('show.bs.modal', function (event) { // load email form w/CAPTCHA
$('#emailBody').load('email-form');
});
$('#emailBody').on('beforeSubmit', '#emailForm', function(event) {
event.preventDefault();
rendered HTML
<div id="emailBody"><form id="emailForm" class="" action="send-email" method="post">
<input type="hidden" name="_csrf" value="aS1LcTJfeU4tXHkuQG4yCjYbDCMfLTEMLEB4EwY4TygGaAAJdBNMPw==">
并非它相关,我使用的是PHP,Bootstrap和Yii框架。
答案 0 :(得分:5)
ActiveForm在此处生成初始化所需的javascript:https://github.com/yiisoft/yii2/blob/49aec24ae1f01d51b4f3cec8e44d44387022d06b/framework/widgets/ActiveForm.php#L201-L206
要在客户端执行此Javascript代码,您必须确保以下内容:
dataType
设置为html
,则ajax请求就是这种情况:
"html"
:以纯文本形式返回HTML;包含的脚本标记在插入DOM时会被评估。
答案 1 :(得分:1)
您正在执行您的beforeSubmit,而该表单尚未出现在dom上。
试试这个:
jQuery(function() {
$('#emailModal').on('show.bs.modal', function (event) { // load email form w/CAPTCHA
$('#emailBody').load('email-form',function(){
$(this).on('beforeSubmit', function(event) {
event.preventDefault();
//The rest of your form code.
});
});
});
});
答案 2 :(得分:1)
使用
$(document).on('beforeSubmit', 'form', function(e) {
// code here
}
而不是
$('form').on('beforeSubmit', function(e) {
// code here
}