jQuery追加输入元素

时间:2014-09-30 09:12:56

标签: javascript jquery html

我正在尝试创建一个简单的Do to List,其中包含一个包含任务列表的Checklists。

想法是创建完整列表,然后将其提交到服务器以将其保存在数据库中。

我希望将输入框放在一个干净的结构中,如下所示

Array
(
    [checklist] => Array
        (
            [0] => Array
                (
                    [task] => Array
                        (
                            [0] => 
                            [1] => 
                        )

                )

            [1] => Array
                (
                    [task] => Array
                        (
                            [0] => 
                            [1] => 
                            [2] => 
                        )

                )

            [2] => 
        )

    [submit] => Submit
)

由于我需要将右name添加到输入框以保留我在数据库中收到的结构,我需要计算清单编号和任务编号,然后附加相同的内容。

一个独特的情况是,当用户从任务列表的中间删除输入框时,如何保留要增加的数字,以便我不会超过input name并丢失数据。

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>ToDo</title>
<script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
</head>

<body>
<form action="todo.php" method="post" name="todo">
  <ul>
    <li>
      <input name="checklist[0]" type="text">
      <ul>
        <li>
          <input name="checklist[0][task][0]" type="text">
        </li>
        <li>
          <input name="checklist[0][task][1]" type="text">
        </li>
      </ul>
      <a class="add" href="#">Add one</a> </li>
    <li>
      <input name="checklist[1]" type="text">
      <ul>
        <li>
          <input name="checklist[1][task][0]" type="text">
        </li>
        <li>
          <input name="checklist[1][task][1]" type="text">
        </li>
        <li>
          <input name="checklist[1][task][2]" type="text">
        </li>
      </ul>
      <a class="add" href="#">Add one</a> </li>
    <li>
      <input name="checklist[2]" type="text">
      <ul>
      </ul>
      <a class="add" href="#">Add one</a> </li>
  </ul>
  <input name="submit" type="submit" value="Submit">
</form>

<script language="javascript">


$( ".add" ).click(function() {

  // Find the Task Count
  var task_count = $(this).siblings('ul').children('li').length;
    var count = $(this).siblings('ul').count;
  var input = '<li><input name="checklist[][task][]" type="text"></li>';

  console.log(task_count);

  $(this).siblings('ul').append(input);
});

</script>
<hr/>
<pre>
<?php
print_r($_POST);
?>
</pre>
</body>
</html>

链接:http://play.mink7.com/todo.php

代码(位于页面底部)是:

$( ".add" ).click(function() {

  // Find the Task Count
  var task_count = $(this).siblings('ul').children('li').length;
    var count = $(this).siblings('ul').count;
  var input = '<li><input name="checklist[][task][]" type="text"></li>';

  console.log(task_count);

  $(this).siblings('ul').append(input);
});

2 个答案:

答案 0 :(得分:1)

当用户删除输入时,您可以将输入名称存储在数组中。在追加时,您可以检查数组中的名称。根据数组中名称的缺失或存在,您可以重命名新添加的输入。这样可以防止数据丢失。

另一种方法是在追加时不要理会这些名字。但在提交表单之前,您可以根据子计数和任务名称动态生成输入的名称。这肯定会阻止数据丢失。

以下是第二种方法的演示:http://jsfiddle.net/lotusgodkk/GCu2D/359/

$(document).ready(function () {
    $('input[type="submit"]').on('click', function (e) {
        $('form>ul').each(function () {
            var ul = $(this);
            var name = ul.attr('data-name');
            var inputs = $('input', ul);
            inputs.each(function () {
                var i = $(this);
                var index = inputs.index(i);
                var n = name + '_' + index; // Generate the name of input
                i.attr('name', n);
            });
        });
        return false;
    })
});

示例HTML

<form action="todo.php" method="post" name="todo">
    <ul data-name="listone">
        <li>
            <input name="checklist[0]" type="text" />
            <ul>
                <li>
                    <input name="checklist[0][task][0]" type="text" />
                </li>
                <li>
                    <input name="checklist[0][task][1]" type="text" />
                </li>
            </ul> <a class="add" href="#">Add one</a> 
        </li>
        <li>
            <input name="checklist[1]" type="text" />
            <ul>
                <li>
                    <input name="checklist[1][task][0]" type="text" />
                </li>
                <li>
                    <input name="checklist[1][task][1]" type="text" />
                </li>
                <li>
                    <input name="checklist[1][task][2]" type="text" />
                </li>
            </ul> <a class="add" href="#">Add one</a> 
        </li>
        <li data-name="listthree">
            <input name="checklist[2]" type="text" />
            <ul></ul> <a class="add" href="#">Add one</a> 
        </li>
    </ul>
    <input name="submit" type="submit" value="Submit" />
</form>

这里,对于命名,我在ul上使用了数据属性,在列表中使用了输入索引。

点击提交按钮,您将看到更改的输入名称。

答案 1 :(得分:0)

我认为您应该在提交时计算清单和任务。只需在“编辑时间”中忽略名称,并在结尾处将名称全部设置在一个块中,如下所示:

http://jsfiddle.net/s3j7ok56/1/

这样,如果用户删除或移动(拖动?)项目,您就不在乎,因为它们最终会被正确命名。

(例如删除:http://jsfiddle.net/s3j7ok56/2/

请注意,我还设置了debug的输入val(),以显示名称。我阻止了JsFiddle的表单提交,所有这些都应该被删除以允许正确的表单发布。

HTML:

<form method="post" id="todo" name="todo" onsubmit="/* for JSFIDDLE */ return false;">
    <ul id="all">
    </ul>
    <a id="addc" href="#">add checklist</a><br />
    <input name="submit" type="submit" value="Submit">
</form>

JS:

$(function() {

    $("#addc").click(function(e) {

        var elem=$('<li class="checklist"><input type="text"><ul class="tasks"></ul></li>');
        var link=$('<a class="add" href="#">Add task</a>');

        link.appendTo(elem);
        elem.appendTo("#all");

        link.click(function(e1) {
            var task=$('<li class="task"><input type="text"></li>');
            $(this).parent().children(".tasks").append(task);
        });
    });

    $("#todo").submit(function() {
        var countLists=0;
        var countTasks=0;
        $("#all>li.checklist>input").each(function() {
            $(this).attr("name","checklist["+countLists+"]");
            $(this).val("checklist["+countLists+"]");
            countTasks=0;
            $(this).parent().find("ul.tasks>li.task>input").each(function() {
                $(this).attr("name","checklist["+countLists+"]task["+countTasks+"]");
                $(this).val("checklist["+countLists+"]task["+countTasks+"]");
                countTasks++;
            });
            countLists++;
        })
        return true;
    });

});