0

我在 jquery 中使用 tr:last 命令遇到了一个独特的错误。

我有一个基于模板行的.clone() 的动态表。

当我添加一行时,我想增加行数来命名字段

但是由于我也可以删除一行,因此增量因子需要查看最后一行的 id 以查看计数是否不是新行 var,而是 max+1。(实际上,由于克隆行,max+2)

我遇到的问题是它每隔一段时间都有效……这很奇怪。

这是添加 3 行的示例警报序列。

最大值 = 4 计数 = 5

最大值 = 4 计数 = 6

最大值 = 6 计数 = 7

因此,实际上永远不会找到 5 的最大值。

function addrow(table){
var className;
var count = $("#"+table+" tbody tr").length;
//since we have a th that server-side prints, no need to count++.  if th removed, count++ this.

//in case of rows removed, need to find last row and check its number...
var max = $("#"+table+" tbody tr:last").attr('id').split("_").pop();
alert('max='+max+'   count='+count);
if(parseInt(max)+2>count){
    count = max;
}

var $clone = $("#"+table+" tbody tr:first").clone();
$clone.attr({
        id: "dynrow_" +$('#'+table).attr("id")+"_"+ count.toString(),
    "class": "" , //remove template class
    style: "" // remove "display:none"
    });
$clone.find("input,select,textarea").each(function(){
    var xname = $(this).attr("name") + count.toString();
        $(this).attr({
            id: $(this).attr("id") + count.toString(),
            name: xname
        });     
    //populate fields that don't exist on page build by reading datacollector div with html5 data 
    $(this).val($("#datacollector").data(xname));
});

if(count%2==0){
    className="even";
}
else{
    className="odd";
}

$clone.find("td").each(function(){
    if($(this).hasClass("xcol")){
        className = className + ' xcol';
    }
        $(this).attr({
            'class': className
        });                 
});
$clone.find("label").each(function(){
        $(this).attr({
            "for": $(this).attr("for") + count.toString()
        });
});
$clone.find("a.removerow").each(function(){
        $(this).attr({
            id: $(this).attr("id") + count.toString()
        });
});
$("#"+table+" tbody").append($clone);

//update row counter
$("#initialrows_"+table).val(count.toString());

}

<input type="hidden" id="initialrows_table_aaa" name="initialrows_table_aaa" value="1">
<table id="table_aaa" class="dynrow">
<thead>
    <tr>
        <th>A</th>
        <th>B</th>
        <th>C</th>
    </tr>
</thead>
<tbody>
<!--template-->
    <tr class="template" id="template_aaa" style="display:none;">
        <td class="even"><label for="inp_16">a</label><input type="text" name="a_" id="inp_16" value=""></td>
        <td class="even"><label for="inp_17">b</label><select id="inp_17" name="b_">
            <option value="">Select</option>
            <option value="A">A</option>
            </select>
        </td>
        <td class="even"><label for="inp_18">c</label><select id="inp_18" name="c_">
            <option value="">Select</option>
            <option value="A">A</option>
            </select>
        </td>
    </tr>
<!--end template-->
</tbody>

工作小提琴, http://jsfiddle.net/briansol/5h4cM/1/

有任何想法吗?

4

1 回答 1

1

这就是问题:

if (parseInt(max)+2>count){
    count = max;
}

因此,当您添加一行时,并且max = 4 count = 6,max + 2 = 6不大于count (6),因此count不会增加,因此它会添加具有相同 的另一行id

这是一个小提琴

于 2013-10-17T15:05:00.067 回答