【问题标题】:Use dynamic input fields in combination with php foreach结合 php foreach 使用动态输入字段
【发布时间】:2016-01-10 02:09:22
【问题描述】:

我正在尝试构建一个包含一些任务列表的页面。对于这一部分,我想使用动态输入字段。表单被一个 foreach 循环,它查看用户的数量。

现在的问题是标签(添加、删除和重置)除了在“第一个循环”之外不起作用。当我点击第一个循环值时,将在所有“循环”中添加一个字段,而不仅仅是第一个循环。

我的 PHP 代码:

<?php 
    foreach (glob(/*user as file*/) as $filename) {
        echo '
            <div class="col-md-4 taskblock">
                <img class="taskimage" src="../../../'.$filename.'"/>
                <div class="name">User</div>
                <div class="dynamic-form">

                <a id="add">Add</a> | <a id="remove">Remove</a>  | <a id="reset">Reset</a>  

                    <form>
                    <div class="inputs">
                    <div><input name="dynamic[]" class="field" value="1" type="text"></div>
                    </div>
                    <input name="submit" class="submit" value="Submit" type="button">
                    </form>
                    </div>

                </div>
            ';
    }
?>

还有我的脚本:

$(document).ready(function(){

    var i = $('input').size() + 1;

    $('#add').click(function() {
        $('<div><input type="text" class="field" name="dynamic[]" value="' + i + '" /></div>').appendTo('.inputs');
        i++;
    });

    $('#remove').click(function() {
        if(i > 1) {
            $('.field:last').remove();
            i--;
        }
    });

    $('#reset').click(function() {
        while(i > 2) {
        $('.field:last').remove();
        i--;
        }
    });

    // here's our click function for when the forms submitted

    $('.submit').click(function(){

        var answers = [];
        $.each($('.field'), function() {
            answers.push($(this).val());
        });

        if(answers.length == 0) {
            answers = "none";
        }

        alert(answers);

        return false;

    });

});

【问题讨论】:

    标签: javascript php jquery dynamic foreach


    【解决方案1】:

    序言

    这里有很多问题要解决。

    idclass

    id 属性在文档中必须是唯一的。这就是addremovereset 只影响第一项的原因。我们必须将它们更改为class

    <a class="add">Add</a> | <a class="remove">Remove</a>  | <a class="reset">Reset</a>
    

    统计字段

    因为您使用的是var i = $('input').size() + 1;,所以实际上您同时计算了文本字段和提交按钮。因此,如果您有 3 个项目并添加一个文本字段,它将使用值 7 而不是 4 填充。我们必须将计数限制为文本字段,将它们的类定位为.field

    var i = $('input.field').size() + 1;
    

    仅针对当前项目

    因为您使用appendTo('.inputs');,所以您向所有项目添加了一个新文本字段,因为它们每个都具有该元素。您必须限制对当前项目的添加。

    为此,我们使用了this 关键字,它将返回触发事件的add 元素。从那里,我们到达父元素,在其中查找 .inputs 元素,然后将新元素注入其中。

    $(this).parent().find('.inputs')
        .append('<div><input type="text" class="field" name="dynamic[]" value="' 
        + i + '" /></div>');
    

    同样的基本逻辑必须应用于remove,但出于下一部分解释的原因,我们将做一些稍微不同的事情:

    var field = $(this).parent().find('.field:gt(0):last')
    i -= field.length;
    field.remove();
    

    更好的重置

    因为变量i 对所有项目都是通用的,所以它的值总是大于在任何项目中找到的文本字段的数量。使用 reset 将简单地删除所有文本字段。相反,我们必须从当前项目中删除除第一个以外的所有字段,并通过减去我们删除的字段数来更改 i

    我们使用:gt()选择器选择除第一个以外的所有字段,从i中减去返回字段的数量,然后删除这些字段。

    var fields = $(this).parent().find('.field:gt(0)');
    i -= fields.length;
    fields.remove();
    

    结语

    JSFiddle 中提供了一个演示。

    我也不太确定变量 i 的用途,由于它的全局性质,我会立即放弃它。

    【讨论】:

    • 感谢您的回答,成功了!我删除了 i 变量,它仅用于测试。
    猜你喜欢
    • 2017-04-05
    • 2016-09-29
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 2019-03-24
    相关资源
    最近更新 更多