在jQuery验证器的提交处理程序上更改表输入的名称和ID

时间:2012-10-15 14:20:45

标签: jquery jquery-validate

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

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

    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标签,只包含我的数据行,所以我不知道它是如何或为什么被包含在我的循环中。

3 个答案:

答案 0 :(得分:1)

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

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

或者您可以更改循环,以便它只会循环遍历不包含<th>的行

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

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

$('select', this);

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

答案 1 :(得分:1)

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

$("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({ ... })
...

答案 2 :(得分:0)

  1. 使用th标签,或者在标题行中输入id,以便跳过它,或者只跳过第一行......

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

  3. Ex:this.children('select')。attr(...