如何在Yii中加载AJAX的表单上绑定beforeSubmit事件?

时间:2016-04-05 00:08:30

标签: javascript jquery ajax yii2

我有一个通过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框架。

3 个答案:

答案 0 :(得分:5)

ActiveForm在此处生成初始化所需的javascript:https://github.com/yiisoft/yii2/blob/49aec24ae1f01d51b4f3cec8e44d44387022d06b/framework/widgets/ActiveForm.php#L201-L206

要在客户端执行此Javascript代码,您必须确保以下内容:

  1. 确保已注册的JS是响应的一部分,如果您在控制器中使用renderAjax()呈现视图,则应该是这种情况。
  2. 执行响应中包含的Javascript。根据{{​​3}},如果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
 }