javascript - 将动态输入字段与 php foreach 结合使用

标签 javascript php jquery dynamic foreach

我正在尝试构建一个包含一些任务列表的页面。对于这部分,我想使用动态输入字段。该表单由 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;

    });

});

最佳答案

序言

这里有很多问题要解决。

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 元素,然后将新元素注入(inject)其中。

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

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

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

更好的重置

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

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

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

结语

JSFiddle 中提供了一个演示.

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

关于javascript - 将动态输入字段与 php foreach 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33083795/

相关文章:

javascript - Zapier中的JavaScript使用分页来循环API调用

javascript - 如何将变量注入(inject)子指令

javascript可链接嵌套子类

javascript - 如何在 Node.js 中使用 MySQL 查询更新 MySQL 数据库中的 JSON 记录?

php - Symfony2 : no extension to load Buzz

JavaScript - jQuery - 我的 dataSource() 函数安全吗? - 如何测试

javascript - 使用ajax发送数据时,我想创建加载栏

php - jQuery ajax函数调用php脚本返回一个值?

jquery - 当我向下滚动页面时,背景从居中向左移动,如何在滚动时保持居中?

javascript - Jquery UI Dialog 多对话框创建问题