2011-11-16 131 views
0

我想在一個名爲activity-div的主div中添加一些使用jQuery的div,然後爲每個div添加一個列表。但是每個div的列表項不一樣。所以我認爲我需要給每個div的id,然後使用該id我可以訪問div並將該列表項放入該div。我使用此jQuery代碼:我們如何動態地編寫jquery選擇器?

for (i=0;i<obj.length;i++){ 
    $('#activity-div').append('<div class="area" id="area"'+i+'><h3><a href="#">'+obj[i].name+'</a></h3></div>'); 

     } 

允許假設obj.length是5。然後5周的div將被添加。他們的ID將是區域1,區域2,區域3,區域4和區域5。我的問題是我怎樣才能得到這些div由id使用循環。我知道,一個div可以使用此訪問:

('#area1').append('<ul><li></li></ul>'); 

我要訪問的所有div我使用循環創建,然後在添加列表。我怎樣才能做到這一點?那會是什麼語法?我試過

('#area'+i).append('<ul><li></li></ul>'); 

但它沒有工作。我是jQuery的新手,無法找到任何聯機幫助。提前致謝。

+1

'(「#區」 + I)'是正確的語法,檢查i'的'的價值,如果它給你的任何問題。 – Ben

回答

3

$('#area'+i).append();應該努力!

你做在你的代碼中的錯誤:

append('<div class="area" id="area"'+i+'><h3> 

應該是:

append('<div class="area" id="area'+i+'"><h3> 
+2

+1只是因爲我想讓你的代表遠離1337; P哦,你有一個正確的答案:) http://i.imgur.com/MhcIh.jpg – g19fanatic

+0

謝謝你的截圖! –

+0

哈,沒問題! – g19fanatic

3

問題出在您的for循環中,id屬性未正確添加數字值。

根據您當前的代碼,它會出來id="area"1而不是id="area1"

這是正確的代碼:

$('#activity-div').append('<div class="area" id="area'+i+'"><h3><a href="#">'+obj[i].name+'</a></h3></div>'); 

也只是在底部更添加到此您的追加行中缺少jQuery的$標識符和應該像

$('#area1').append('<ul><li></li></ul>'); 
+1

你錯過了i後的結束引號:id =「area」+ i +'「> –

+1

是的,我加了它,正在編輯它。 :) –

1

您也可以選擇所有id=area<num>的div jQuery選擇的:

$('div[id^="area"]').append('<ul><li></li></ul>'); 

這將選擇所有以「區域」開頭並帶有ID的div元素並附加一個ul元素。

文檔的jQuery選擇可以在這裏找到:http://api.jquery.com/category/selectors/

+0

但每個div都會有不同數量的列表項。 area1可以有5,area2可以有3。這是否也適用於此? – Piscean

+0

'$('div [id^=「area」]')'會選擇DOM中以「area」開頭的任何元素。因此「area1」到「area5」將起作用,以及「area_not_5」和「area_to_calculate」。所以這種選擇器的樣式只有在沒有其他對象具有以「區域」開頭的id時才起作用。您可以從一個容器元素開始,以消除像「area_not_5」這樣的選擇元素:'$('#activity-div')。find('div [id^=「area」]')...'看起來好像區域div是'activity-div'元素的直接子元素,所以你可以使用:'$('#activity-div')。children('div [id^=「area」]')。 ..'這將表現更快。 – Jasper

2

這是一個更好的做法是建立自己的DOM插入到一個字符串,並添加他們都在同一時間。代碼中添加了DIV的代碼中也有錯誤。試試這個:

var insertion = ""; 
for (i=0;i<obj.length;i++){ 
    insertion += '<div class="area" id="area'+i+'"><h3><a href="#">'+obj[i].name+'</a></h3></div>'; 
} 
$('#activity-div').append(insertion); 
+1

+1,這是一個非常好的建議。我相信舊版瀏覽器將數據推入數組然後在最後加入數組會更快:'var insertion = []; (...){insertion.push(...);} $('#activity-div')。append(insertion.join(''));' – Jasper

1

讓假設obj.length是5。然後5個格將被添加。並且他們的id將是area1,area2,area3,area4和area5 ...

錯誤。看看你的代碼在這裏:

for (i=0;i<obj.length;i++){ 
    $('#activity-div').append('<div class="area" id="area"'+i+'><h3><a href="#">'+obj[i].name+'</a></h3></div>'); 
} 

如果有5個obj學分,他們將根據i編號。在for循環中,您將得到值0,1,2,3和4,因爲i++直到循環重複之前的最後一步纔會發生(即,i<obj.length的評估發生在循環之前,而i++之後發生)。

id="area"'+i+'除非這個問題(這應該是id="area'+i+'"),如果你希望從值1至5,相應地調整你的for循環:

for(i=1; i<=obj.length; i++) { 
    $('#activity-div').append('<div class="area" id="area'+i+'"><h3><a href="#">'+obj[i].name+'</a></h3></div>'); 
} 

如果再要添加的列表中,你可以這樣做:

for(i=1; i<=obj.length; i++) { 
    $('#activity-div').append('<div class="area" id="area'+i+'"><h3><a href="#">'+obj[i].name+'</a></h3></div>'); 
    $('#area'+i).append('<ul><li></li></ul'); 
} 

有沒有真正的理由來創建循環第二和位置應嘗試只在創建後追加到$('#area'+i)。如果你有問題,使用firefox和firebug可能會有所幫助。您可以添加行如:

console.log(i); 

for循環爲它增加在各階段的跟蹤i的值。

2

完全跳過ID,只是按類和指數選擇:

$("#activity-div .area").eq(i).append("<ul><li></li></ul>"); 

或者,更好的是,跳過不必要的jQuery查找並只保留到元素的參考。

areas[i].append("<ul><li></li></ul>"); 

如果有可能你的循環合併成一個,這將是理想的:

var areas = []; 
for (i=0;i<obj.length;i++) { 
    var area = $('<div class="area"><h3><a href="#">'+obj[i].name+'</a></h3></div>'); 
    $('#activity-div').append(area); 
    areas.push(area); 
} 

然後通過索引來訪問該地區

for (i=0;i<obj.length;i++) { 
    var area = $('<div class="area"><h3><a href="#">'+obj[i].name+'</a></h3></div>'); 
    area.append("<ul><li></li></ul>"); 
    $('#activity-div').append(area); 
} 

但是,這些都不解決方案真的爲你做 - 沒有你實際添加列表項。我會使用$.each迭代obj,然後在同一個循環中追加列表項,避免循環兩次。這樣吧,假設你的列表中的項目也包含在obj[i]

$.each(obj, function() { 
    var list = $('<div class="area"><h3><a href="#">'+this.name+'</a></h3><ul></ul></div>') 
     .appendTo("#activity-div") 
     .find("ul"); 
    $.each(this.listItems, function() { 
     list.append("<li>" + this.Name + "</li>"); 
    }); 
}); 
+0

這是一個很好的閱讀,謝謝! –