1

我有一个动态生成行的表,该表具有多个需要唯一 ID 和名称的输入。我已经在 jQuery 验证器中编写了一个 submitHandler 函数来处理这个问题,但是我遇到了两个问题:

  1. 我的表有一个标题行,JQuery 包含在迭代中
  2. 我的所有输入类型都在每个循环中分配,而不是每行的输入类型。

这是我的代码:

var accessorylist = document.getElementById("accessorybody");
            var i = 1;
            $("tr").each(function(){
                var e = this;
                $('select').attr({
                    'id': 'accessory' + i,
                    'name': 'accessory' + i
                });
                $('input[type=checkbox]').attr({
                    'id': 'accessoryrequired' + i,
                    'name': 'accessoryrequired' + i
                });
                $('input[type=text]').attr({
                    'id':'accessoryqty' + i,
                    'name': 'accessoryqty' + i
                });
                alert(e);
                i++;
                alert(i);
            });
            alert(accessorylist);
            return false;

警报和返回 false 对我来说只是调试行。我很确定对于第二个答案,我需要指定我的输入只关注行 (e),但我尝试了一些不起作用的不同方法,我有点难过。至于标题行,它被包裹在一个thead标签中;'accessorybody' 是一个 tbody 标签,它只包含我的数据行,所以我不知道它是如何或为什么包含在我的循环中的。

4

3 回答 3

1

您可以通过检查 的内容来跳过对标题行的迭代tr,例如:

if (!$(this).has('th').length) {
  // run code
}

或者您可以更改循环,使其仅循环不包含<th>s的行

$('tr:not(:has(th))').each(function() { 
  // run code
});

针对您的第二个问题,您只需要为您的选择器提供一个上下文:

$('select', this);

这样,只有当前行中的元素会受到影响。

于 2012-10-15T14:28:35.150 回答
1

1)使用:not:firstjQuery选择器跳过第一行

$("tr:not(:first)").each(function(){ ... });

2)this用作 jQuery 对象以使用行 ( $this) 作为上下文来查找输入元素

var $this = $(this);
...
$this.find('select').attr({ ... })
$this.find('input[type=checkbox]').attr({ ... })
$this.find('input[type=text]').attr({ ... })
...
于 2012-10-15T14:32:42.083 回答
0
  1. 使用 th 标签,或者给标题行一个 id,这样你就可以跳过它,或者只是跳过第一行......

  2. 使用.children()函数,而不是全局选择器。

例如:this.children('select').attr( ...

于 2012-10-15T14:27:08.117 回答