我們知道要在Web頁面中引用一個HTML元素,最簡單的方法就是使用getElementById方法,或其類似的一組getElementsByXxx方法。可是這裡需要注意的是,這些方法其實都不能完全絕對的唯一確定對一個元素的引用。
至於getElementsByXxx我們不說了,它本身就是getElements,很明白了,那麼getElementById也不能唯一確定一個元素嗎?當然是,不能。由於html的不嚴格性,在同一頁面中重複元素的id是被允許的。關於id的更多細節問題,請參考:細說HTML元素的ID和Name屬性的區別,一文。
那麼怎麼才能唯一的確定對一個元素的引用呢?使用DOM之間的引用結構來尋找?這個方法雖然是行的,但是可操作性是在是太差了。這裡需要說說我原來介紹過的html屬性uniqueID,它是微軟為HTML元素擴充的專有屬性,不遵循W3C的規範。這個uniqueID有一些undocumented的特性,uniqueID其實也是和id類似的一套元素表示體系,只是它是純用戶端的標示方案。它的一些細節在前面一個連結中已經介紹了,下面我們主要說說它的特性。
由於它是元素的表示體系,那麼它也因該和id的特性一樣囉?實際上確實是這樣,除了uniqueID的產生方式和id完全不同外,uniqueID其它表現和id是一樣的。我們可以通過這個uniqueID直接引用元素,就像id一樣,只是由於uniqueID是動態產生的,所以我們也只能動態使用這個uniqueID,而不能以literal形式來使用。下面是一個使用樣本:
var g_ELEMENTS = {};
var span = document.createElement('SPAN');
document.body.appendChild(span);
g_ELEMENTS[span.uniqueID] = span;
這樣我們就通過uniqueID將span緩衝起來了,已有要引用這個span,就可以這樣:
var elements = g_ELEMENTS.GetExpandoKeys();
for ( var i=0 ; i < elements.length ; ++i )
{
var element = eval(elmenets[i]);
// todo: other logic
}
除了使用eval來引用這個uniqueID外,getElementById也有一個undocumented的特性,就是它也支援uniqueID,這樣一來,我們就可以使用getElementById(elements[i])來絕對唯一的引用一個頁面元素。
可能有人會疑惑,這個uniqueID到底有什麼用啊?其實在動態產生大量頁面元素時,使用uniqueID可以非常方面的為元素產生真正的unique的id,它的意義就在於可以將這些動態元素cache起來,做統一管理。特別是在實現動態在的TreeView時,如果合理使用uniqueID到來的好處,就可以避免很多需要對樹進行反覆遞迴便利才能完成的工作。還有,uniqueID是IE的DOM提供的原生解決方案,比自己去做unique標示要方面高效的多,並且還利於對元素檢索。
參考資訊:GetExpandoKeys(),另外就是本文不適合FireFox及其它非IE核心瀏覽器。