原始Q對於內容/目的不是很具體,應該有變化,取決於IMO。我絕對不同意目前接受的答案。循環遍歷並將新ID附加到已經呈現的大量HTML中可能會導致大量的迴流計算,這可能會因'stuffContainer'表示的內容而變得很難看。
建立與標識首先從服務器或注入作爲一個塊上的客戶端如果必須
作爲一般規則,避免擊中的變化DOM反覆,如果你能避免它。就像瀏覽器加載頁面IMO一樣,事先在服務器上構建的ID幾乎可以忽略不計。當然,這是一個更大,因此速度更慢的哈希表,但如果我們談論的是數百個而不是數萬個,我真的懷疑你會注意到。
對於類似於根據數據構建的選擇列表的情況,更有效的客戶端方法是首先將其構建爲字符串,包含ID和全部,然後分配給容器的innerHTML,或者如果像某些我的js聊天的同事們,在每一個可能的用例中,你都會對innerHTML有一個奇怪的掛斷,儘管它現在已經在規範中了,至少在構建並附加到文檔片段之後。然後將其附加到您的容器中。
數據的屬性或類在標識
IMO,氣味因子是不是這麼多的性能,而是HTML膨脹並創建一個ID依賴於需要無,從而阻斷別的東西可能在您的單個項目div上找到自定義ID很有用。 ID絕對是縮小JavaScript元素查找範圍的理想方式,但在容器內容的情況下,您將比ID'd每個子項目獲得更多的靈活性。一步與二步的性能增益不值得將通用ID應用於元素的靈活性成本。
作爲替代,您可以使用具有唯一值或數據屬性的類,例如, '數據的itemId = 「0」'。對於像定製選擇列表那樣的較小的一組HTML,其ID與某些服務器端索引系統連接以便於更新數據,但我傾向於贊成這種高度可見的方法,因爲它可以更容易地理解架構,但它增加了很多在涉及數百到數千項目的場景中跟蹤不必要的屬性。
或理想(在大多數情況下),事件代表團
最理想,國際海事組織,你完全避免附加屬性在情況下,你只在乎你一下孩子單項元素,而不是什麼它的'ID'是或訂單這些單項貨物將保持靜態,並且您可以安全地假定這些頭寸是有效的ID。或者,這可能適用於非靜態單項集合的另一種情況是,如果您有一些對象數組中的單項數據被混洗,然後用於在用戶啓動的排序上構建和替換HTML,這些排序將始終將HTML的順序與其他數據跟蹤依賴關係聯繫起來。
非jQuery的方法(未經測試):
var myContainer = document.getElementById('stuffContainer');
//ignore following indent goof
myContainer.addEventListener('click', function(e){
var
singleItem,
elementOriginallyClicked = singleItem = e.target,
stuffContainer = this;
//anything clicked inside myContainer will trigger a click event on myContainer
//the original element clicked is e.target
//google 'event bubbling javascript' or 'event delegation javascript' for more info
//climb parentNodes until we get to a single-item node
//unless it's already single-item that was originally clicked
while(!singleItem.className.match(/[=\s'"]single-item[\s'"]/g)){
singleItem = singleItem.parentNode;
}
//You now have a reference to the element you care about
//If you want the index:
//Get the singleItem's parent's childNodes collection and convert to array
//then use indexOf (MDN has normalizer for IE<=8) to get the index of the single-item
var childArray = Array.prototype.slice.apply(stuffContainer.childNodes,[0]),
thisIndex = childArray.indexOf(singleItem);
doSomethingWithIndex(thisIndex);
//or
//doSomethingWithDOMObject(singleItem);
});
或者簡單的jQuery代表團風格(也未經測試):
$('#someContainer').on('click','.single-item', function(){
var $_singleItem = $(this), //jq handles the bubble to the interesting node for you
thisIndex = $_singleItem.index(); //also getting index relative to parent
doSomethingWithIndex(thisIndex);
//or
//doSomethingWithJQObject($_thisItem);
});
可以actualy給予加分,yopu似乎TOI有很多。只是設置一個賞金;-) – Pevara 2012-08-07 22:56:46
我做了[一個簡單的JSPerf測試](http://jsperf.com/html-dom-id-vs-no-id)和我得到非常混合的結果(測試可能不好儘管),即使在不同的窗口中使用同一瀏覽器(Chrome)。解析HTML可能需要大部分時間,所以[這裏是一個版本](http://jsperf.com/html-dom-id-vs-no-id/2)是每個元素具有相同數量的屬性,但結果相同。我認爲性能明智(如建立索引等)這實在沒有什麼差別。 – 2012-08-07 23:19:54
@FelixKling有趣,感謝您將測試放在一起;在我的最後(Chrome 20和Firefox 14),它看起來像no id版本略微(稍微)更快。 – Mahn 2012-08-08 00:48:46