2011-04-28 40 views
2

我想创建一个HTML表格使用jQuery和上下文菜单插件的复制/粘贴系统,我试图唯一地命名所有新创建的行。所以我有一个克隆所选择的行和插入上述新行的函数:使用jQuery的.length检测现有元素没有看到新创建的元素

function cloneAbove(TR) { 
    var newRow = $(TR).clone(); 
    var lastID = $(TR).attr('id'); 
    var newID = Number(lastID.substring(3))-0.1; 

    //See if that row already exists: 
    if($('#tr_'+newID).length){ 
    alert('#tr_'+newID+' Exists'); 
    //If it does exist, we divide the newID by 10 until we find one that doesn't: 
    var i = 0; 
    while(i < 1){ 
     newID = newID/10; 
     if($('#tr_'+newID).length > 0){ 
     i = 1; 
     } 
    } 
    } 
    $(newRow).attr('id','tr_'+newID); 
    $(TR).before(newRow); 
    $(".target").contextmenu(option); 
} 

首先,它克隆所选择的行(即:“#TR_1”),为新的行的id减去0.1(即: '#tr_0.9'),那么它应该检查该id是否已经存在 - 这是我的问题所在 - 如果它存在,它将进入一个循环,除以10直到找到一个没有的id。

下面是表的样本:

<table id="table" border=1> 
     <tr class="target" id="tr_1" oncontextmenu="context('tr1')"> 
      <td id="tr_1_1">Row1</td> 
      <td id="tr_1_2">Row1</td> 
     </tr> 
     <tr class="target" id="tr_2" oncontextmenu="context('tr2')"> 
      <td id="tr_2_1">Row2</td> 
      <td id="tr_2_2">Row2</td> 
     </tr> 
</table> 

的。长度适用于“硬编码”的元素,因为它们存在的页面加载时,但它不会检测到任何新创建的元素。有什么建议么?

回答

4

您正在构建将混淆jQuery的“id”值。选择符“#tr_0.9”意思是“找到id为'tr_0'和类'9'”的元素,而不是“找到具有id'tr_0.9'的元素”。

撇开这个事实,我认为这是一个非常奇怪的方式来构建“id”值,您可以通过“引用”“”来使其工作。字符:

if ($(('#tr_' + newId).replace(/\./g, "\\.")).length) { 
    // ... found a duplicate ... 

所做的是替代“。”。为“。”。在构建的试用“id”值中。你只想做那个,当然,当通过jQuery选择器寻找元素;你不想让实际的“id”值在其中有反斜杠。

或者,您可以替换“。”带有“_”或其他字符的字符。

+0

这有效,但我明白你的意思,我的方法显然有缺陷。该表将包含与他们的TR的ID相同的命名约定的表单字段,并且我可以在通过POST(PHP)发送它们的值时看到这是一个问题。重要的是,所有字段都可以根据其父级TR轻松分组,并且它们按用户创建的顺序排列。因此,将tr_1复制到上面的行将给它的ID和子窗体字段名称的结束数<1。有没有更好的方法来完成这一点? – jreed121 2011-04-28 18:44:23

+1

保持“身份证”价值清洁可能是一个好主意,只是为了控制整体头痛水平。您可以在“id”值中使用破折号和下划线,并且如果您想继续使用这种数字技巧,则可以将原始数值存储在单独的属性中,如“data-num-id”。当为新元素计算新的“id”时,您会使用该属性值,但“id”字符串本身会具有“。”。变成 ”-”。只是一个想法;可能还有其他方法可以去。 – Pointy 2011-04-28 18:47:14

1

您需要考虑如何解析jQuery选择器。当你添加一个新行时,新行的id被设置为一个十进制数字(即'0.9')。但如果使用jQuery选择 $('#tr_0.9')当你说:

获得与“tr_0” id和一个类的“9”的元素。

点运算符是类选择符的表示法。尝试使用整数值而不是小数。

编辑:我太慢了!