简体   繁体   English

注册事件处理程序以动态添加内容

[英]Registering event handlers for dynamically added content

So, I have several files: 因此,我有几个文件:

-- model      -- step1.php
              -- step2.php
-- view       -- main.php
              -- step1.php
              -- step2.php
-- controller -- step1.php
              -- step2.php

Now basically what I'm trying to do is to call step1 view from main.php: 现在基本上我想做的是从main.php调用step1视图:

$(document).ready(function(){
    $("#MyForm").validate({
        submitHandler: function(form) {
            $.post('../controller/step1.php', $("#MyForm").serialize(), function(data) {
                $('#step1_controller').html(data);
            });
        }
    });
});

This works, but when you submit the form in main.php step1 controller is executed and step2 view loaded. 这可行,但是当您在main.php中提交表单时,将执行step1控制器并加载step2视图。

Problem is, when I load step2 view via this ajax request, step2 view is no longer able to load step2 controller. 问题是,当我通过此ajax请求加载step2视图时,step2视图不再能够加载step2控制器。 When I open step2 view in browser, however, everything works fine and step2 controller is loaded. 但是,当我在浏览器中打开step2视图时,一切正常,并且step2控制器已加载。

main.php -> loads step2.php -> loads step2 controller main.php->加载step2.php->加载step2控制器

  • main.php successfully loads step2 view main.php成功加载step2视图
  • step2 view successfully loads step2 controller step2视图已成功加载step2控制器

  • BUT main.php isn't able to load step2 controller 但是main.php无法加载step2控制器

I know this is little confusing but I'll be very thankful if somebody can help me. 我知道这有点令人困惑,但是如果有人可以帮助我,我将非常感激。

Anyway, how do all these pages using these dynamic ajax loaded installation steps work? 无论如何,使用这些动态ajax加载的安装步骤的所有这些页面如何工作?

You know, you fill out a form in step1, click submit, step2 shows, fill out a form, submit step3 shows. 您知道,您在步骤1中填写了一个表格,单击提交,步骤2显示,填写了一个表格,提交步骤3显示。 What's the best way? 最好的方法是什么?

step2 view: 第二步视图:

<script>
$(document).ready(function(){
    $("#Foo").validate({
        submitHandler: function(form) {
                $.post('../controller/step2.php', $("#Foo").serialize(), function(data) {
                $('#results_step2').html(data);
            });
        }
    });
});
</script>


<h1 class="header_step2">Lorem</h1>

<p />

<form name="Foo" id="Foo" action="" method="POST" enctype="multipart/form-data">
<select size="1" name="Bar">
  <option value="Foo">Bar</option>
  <option value="Foo">Bar</option>
  <option value="Foo">Bar</option>
  <option value="Foo">Bar</option>
  <option value="Foo">Bar</option>
</select>

<button type="submit">
<div id="results_step2"> Save </div>
</button>
</form>

The reason your code is not working is that document.ready has already happened by the time you load view2. 您的代码无法正常工作的原因是,在加载view2时document.ready已经发生。

A quick fix for this is to attach the validation listener in the success callback that renders the corresponding form. 快速解决方案是将验证侦听器附加到呈现相应表单的成功回调中。 This will allow you to remove your javascript from view2. 这将允许您从view2中删除JavaScript。 Ideally, you will probably eventually want to organize your code differently to ease this kind of pain. 理想情况下,您最终可能会希望以不同的方式组织代码以减轻这种痛苦。 It is nice to be able to separate javascript from html. 很高兴能够将javascript与html分开。

In the meantime, the following should fix your problem: 同时,以下应解决您的问题:

Option 1 选项1

$(document).ready(function(){

    var attachFooValidation = function() {
        $("#Foo").validate({
            submitHandler: function(form) {
                $.post('../controller/step2.php', $("#Foo").serialize(), function(data) {
                    $('#results_step2').html(data);
                });
            }
        });
    }

    $("#MyForm").validate({
        submitHandler: function(form) {
            $.post('../controller/step1.php', $("#MyForm").serialize(), function(data) {
                $('#step1_controller').html(data);
                attachFooValidation();
            });
        }
    });
});

Option 2 选项2

if you don't want to do that, you could also just lose the document.ready from view2 and move the script after the form as follows: 如果您不想这样做,也可以从view2中丢失document.ready并将脚本移到表单后,如下所示:

<h1 class="header_step2">Lorem</h1>

<p />

<form name="Foo" id="Foo" action="" method="POST" enctype="multipart/form-data">
<select size="1" name="Bar">
  <option value="Foo">Bar</option>
  <option value="Foo">Bar</option>
  <option value="Foo">Bar</option>
  <option value="Foo">Bar</option>
  <option value="Foo">Bar</option>
</select>

<button type="submit">
<div id="results_step2"> Save </div>
</button>
</form>

<script>
$("#Foo").validate({
    submitHandler: function(form) {
            $.post('../controller/step2.php', $("#Foo").serialize(), function(data) {
            $('#results_step2').html(data);
        });
    }
});
</script>

That said, I recommend reorganizing your code to separate your scripts from your markup. 也就是说,我建议重新组织代码以将脚本与标记分开。

You need to read up on binding listeners to events in Javascript (jQuery) so that new elements loaded via ajax are correctly handled 您需要阅读将侦听器绑定到Javascript(jQuery)中的事件的方法,以便正确处理通过ajax加载的新元素

Basically as it stands all your code is in the document.ready block, which only runs when the page loads. 基本上,所有代码都位于document.ready块中,该块仅在页面加载时运行。 At that point your step 2 form doesn't exist and so doesn't get the Javascript event bound to it 此时,您的第2步表单不存在,因此也没有绑定Javascript事件

Something like 就像是

$("#MyForm").on('submit', function() {
   $(this).validate({
       // your code here
   });
});

would bind the submit event of all forms with the id #MyForm to the validate code 会将ID为#MyForm的所有表单的Submit事件绑定到验证代码

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM