【问题标题】:Populating dynamically created div's using ajax使用 ajax 填充动态创建的 div
【发布时间】:2017-09-26 12:32:58
【问题描述】:

我试图弄清楚如何将表单提交中的 ajax 响应输出到特定的 div。该表单是动态生成的按钮,其中来自 mysql 的数据作为值,并且对于生成的每个按钮,还为这样的结果创建了一个 div。

Example form id's:  
id="form1"
id="form2"
id="form3"
id="form4"

div id's:
<div class="res" id="result1">Display form1 data</div>
<div class="res" id="result2">Display form2 data</div>
<div class="res" id="result3">Display form3 data</div>
<div class="res" id="result4">Display form4 data</div>

这是我的示例表单。 $count 在 while 循环中增加 id “form”。

echo '<form name="v" action="test.php" value="' . $row['data'] . '" method="post" id="form' . $count . '"><input name="v" type="hidden" value="' . $row['data'] . '"><input type="submit" class="btn" value="Submit"></form>';

我可以让它工作,但如果我只对类使用“.res”,它会用单击提交按钮的成功响应填充所有 div,这就是为什么我需要使用递增数字的唯一 ID $计数。我不确定如何实现这一点。

$(document).ready(function(){
    $(document).on("submit", "#form", function(event)
    {
        event.preventDefault();        
        $.ajax({
            url: $(this).attr("action"),
            type: $(this).attr("method"),
            dataType: "text",
            data: new FormData(this),
            processData: false,
            contentType: false,
        success: function(data, status) {
            $(".res").html(data);
        },
        error: function() {
            alert('An error occurred.');
        }
        });        
    });
});   

有人可以帮帮我吗?谢谢。

【问题讨论】:

    标签: javascript php jquery ajax


    【解决方案1】:

    您可以使用包含目标 div 的数据属性扩展表单标签。

    echo '<form name="v" action="test.php" value="' . $row['data'] . '" method="post" id="form' . $count . '" data-target="result' . $count . '">...';
    

    稍后在你的 ajax 成功函数中,做这样的事情

    $(document).ready(function(){
        $(document).on("submit", "form[data-target]", function(event)
        {
            var $target = $('#' + $(this).data('target'));
            event.preventDefault();        
            $.ajax({
                url: $(this).attr("action"),
                type: $(this).attr("method"),
                dataType: "text",
                data: new FormData(this),
                processData: false,
                contentType: false,
            success: function(data, status) {
                $target.html(data);
            },
            error: function() {
                alert('An error occurred.');
            }
            });        
        });
    });   
    

    【讨论】:

    • 这不会处理表单上的重复 ID
    • @mplungjan 我应用了一个小改动来摆脱“重复的表单 id”问题
    【解决方案2】:

    您可以使用.each() 提供计数器变量的事实:

    $("form").each(function (i) {
        $(this).on("submit", function () {
        // ...
    
        // in the ajax success callback:
        $(".res").eq(i).html(data);
    

    【讨论】:

    • 如果表单需要针对其他 div,这相当脆弱并且容易出错
    • 没错,但让它变得更健壮很容易。我只是表明存在这种方法,而不是理想的解决方案。
    【解决方案3】:

    ID 必须是唯一的,所以应该这样做

    $(document).on("submit", "form", function(event) {
      event.preventDefault();
      var id = this.id; // form1, form2 etc
      ....
    

    或

    $(document).on("submit", "form[name='v']", function(event) {
      event.preventDefault();
      var id = this.id; // form1, form2 etc
      ....
    

    然后

      $("#"+id.replace("form","result")).html(data); // result1, result2 etc
    

    或者在表单上使用数据属性:

    echo "<form data-id='result".$count."' ....>
    

    并且拥有

    $(document).on("submit", "form[name='v']", function(event) {
      event.preventDefault();
      var id = $(this).data("id"); // result1, result2 etc
      ....
    

    然后

      $("#"+id).html(data); // result1, result2 etc
    

    【讨论】:

    • 在我看来它比公认的答案更完整 - 它处理没有 ID 的表单,因为您似乎有重复的 ID
    • 老实说,这很难选择,您也确实先回复并提供了很多有用的信息,我很感激,但由于我只是复制并粘贴了其他人的代码并做了一些小改动,所以我接受了他的。
    • 嗯,没错。因此,我实际上受到了惩罚,因为我根据您的需要提供了多个建议。不管。享受
    • 不,一点也不,他的代码确实解决了重复 id 问题,因为表单和 div 是通过循环运行并分配递增 id 的,它似乎工作得很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    相关资源
    最近更新 更多