使用jQuery追加多个项目

时间:2009-10-23 20:25:37

标签: javascript jquery

我从这个标记开始:

<div>
  <span>
    <label for="Item[0]">Item #1</label>
    <input type="text" value="" name="Item" id="Item[0]"/>
  </span>
</div>

在每个按钮上单击我想要完全添加另一个部分,但是增加了索引。

<div>
  <span>
    <label for="Item[0]">Item #1</label>
    <input type="text" value="" name="Item" id="Item[0]"/>
  </span>
</div>
<div>
  <span>
    <label for="Item[1]">Item #2</label>
    <input type="text" value="" name="Item" id="Item[1]"/>
  </span>
</div>

我正在尝试使用此javascript:

 $(document).ready(function(){

    var count = <%= Items.Count - 1 %>;

    $('#AddItem').click(function(e) {
        e.preventDefault();
        count++;

        var tb = $('#Item[0]').clone().attr('id', 'Item[' + count + ']');

        var label = document.createElement('label')
        label.setAttribute('For', 'Item[' + count + ']')

        $('#ItemFields').append(label);
        $('#ItemFields').append(tb);
    });
});

所以有几个问题:

附加标签有效,但我的克隆文本框没有。

标签没有文字。我似乎找不到那个属性。谁能告诉我它是什么?

我无法弄清楚如何在div和span中将标签和文本框包装在一起。如果我试试

$('#ItemFields').append('<div><span>' + label + tb + '</span></div>');

它输出[object HTMLLabelElement]而不是实际标签。如果我尝试将它们分成多个append语句,它会自行终止div和span。我是jQuery / Javascript的新手,所以我不太确定我做错了什么。

5 个答案:

答案 0 :(得分:5)

我想我会找到一种方法从标记中的现有数字中提取下一个数字,而不是依赖于保持变量同步。此外,我认为您只需要正确嵌套您的附件以获得您想要的收容。

$(document).ready(function(){

    $('#AddItem').click(function(e) {
        var count = $('[name=Item]:last').attr('id').replace(/Item\[/,'').replace(/\]/,'');
        count = Number(count) + 1;

        var newItemID = 'Item[' + count + ']';

        var tb = $('#Item[0]').clone();
        tb.attr('id', newItemID );

        var label = $('<label for="' + newItemID + '">Item #' + count + '</label>');

        var container = $('<div></div>');

        $('<span></span>').append(label)
                          .append(tb)
                          .appendTo(container);

        $('#ItemFields').append(container);
        return false;
    });
});

答案 1 :(得分:3)

首先是“出了什么问题”,你要混合本机DOM调用,jQuery和其他东西(我不知道<%= Items.Count - 1 %>是什么 - PHP,也许?)。我会留下最后一个,因为它听起来像是在为你工作。否则,如果您要使用jQuery,请尽量使用其方法。

标签文本的“属性”只是值,由jQuery value()方法获取/设置。

要附加标签,我建议你这样做:

$('#ItemFields').append('<label for=Item["' + count + ']">'+ '</label>')

我知道append可以使用text,jQuery对象或DOM元素,但我个人更喜欢用字符串来完成。如果您不愿意,可以这样做:

$('#ItemFields').append($('<label></label>')
    .attr('for', 'Item["' + count + ']')
    .value('your label text here'));

等等。

原因

$('#ItemFields').append('<div><span>' + label + tb + '</span></div>');

没有给你你想要的是你正在用字符串连接Javascript对象,它们(像Java一样)会在连接之前自动将对象转换为字符串。

由于tvanfosson的答案应该涵盖它,我将其余部分的答案都不完整。

答案 2 :(得分:3)

克隆整个块的示例(但是添加了一个item类),因为我认为它对未来更加健壮(如果您更改项目的html)并处理标签的文本:

<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <title>Demo</title>
  <script type="text/javascript" src="jquery-1.3.2.min.js"></script>
  <script type="text/javascript">
  $(document).ready(function(){
    $('#AddItem').click(function(e) {
      e.preventDefault();

      var count = $('.item').length;
      var id = 'Item[' + count + ']';
      var item = $('.item:first').clone();
      item.find('input:first').attr('id', id);
      item.find('label:first').attr('for', id)
          .html('Item #' + (1+count));
      item.appendTo('#ItemFields');
    });
  });
  </script>
</head>
<body>
  <input type="button" id="AddItem" value="Add" />
  <div id="ItemFields">
    <div class="item">
      <span>
        <label for="Item[0]">Item #1</label>
        <input type="text" value="" name="Item" id="Item[0]"/>
      </span>
    </div>
  </div>
</body>
</html>

答案 3 :(得分:1)

使用函数构建你的html;如果结构简单,将它组装成一个字符串就更容易了:

$(document).ready(function(){

    var count = <%= Items.Count - 1 %>;

    $('#AddItem').click(function(e) {
        e.preventDefault();
        count++;

        $('#ItemFields').append(create_item(count));
    });


    function create_item(i) {
        return $(['<div><span>'
                ,'<label for="Item[', i, ']">Item #', i, '</label>'
                ,'<input type="text" value="" name="Item" id="Item[', i ,']"/>'
            ,'</span></div>'].join(''), document);
    };
});

答案 4 :(得分:1)

var oldDiv = $('whatever');//Get div here somehow
var newHTML = $( oldDiv ).html();
newHTML.replace(/\[[0-9]+\]/g, '['+count+']');
newHTML.replace(/#[0-9]+/g, '#'+(count+1));    
var newDiv = $('<div></div>').html( newHTML );

这将创建一个新div,从oldDiv获取HTML,并为[index]和#number区域执行两次正则表达式替换。我没有对它进行测试,但它应该只需要很少的修改。