2011-04-28 24 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」的元素。

點運算符是類選擇符的表示法。嘗試使用整數值而不是小數。

編輯:我太慢了!