我們知道要在Web頁面中引用一個HTML元素,最簡單的方法就是使用getElementById方法,或其類似的一組getElementsByXxx方法??墒沁@里需要注意的是,這些方法其實都不能完全絕對的唯一確定對一個元素的引用。
至于getElementsByXxx我們不說了,它本身就是getElements,很明白了,那么getElementById也不能唯一確定一個元素嗎?當(dāng)然是,不能。由于html的不嚴格性,在同一頁面中重復(fù)元素的id是被允許的。關(guān)于id的更多細節(jié)問題,請參考:細說HTML元素的ID和Name屬性的區(qū)別,一文。
那么怎么才能唯一的確定對一個元素的引用呢?使用DOM之間的引用結(jié)構(gòu)來查找?這個方法雖然是行的,但是可操作性是在是太差了。這里需要說說我原來介紹過的html屬性uniqueID,它是微軟為HTML元素擴充的專有屬性,不遵循W3C的規(guī)范。這個uniqueID有一些undocumented的特性,uniqueID其實也是和id類似的一套元素表示體系,只是它是純客戶端的標示方案。它的一些細節(jié)在前面一個鏈接中已經(jīng)介紹了,下面我們主要說說它的特性。
由于它是元素的表示體系,那么它也因該和id的特性一樣啰?實際上確實是這樣,除了uniqueID的生成方式和id完全不同外,uniqueID其它表現(xiàn)和id是一樣的。我們可以通過這個uniqueID直接引用元素,就像id一樣,只是由于uniqueID是動態(tài)生成的,所以我們也只能動態(tài)使用這個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到底有什么用?。科鋵嵲趧討B(tài)生成大量頁面元素時,使用uniqueID可以非常方面的為元素生成真正的unique的id,它的意義就在于可以將這些動態(tài)元素cache起來,做統(tǒng)一管理。特別是在實現(xiàn)動態(tài)在的TreeView時,如果合理使用uniqueID到來的好處,就可以避免很多需要對樹進行反復(fù)遞歸便利才能完成的工作。還有,uniqueID是IE的DOM提供的原生解決方案,比自己去做unique標示要方面高效的多,并且還利于對元素檢索。
參考信息:GetExpandoKeys(),另外就是本文不適合Firefox及其它非IE內(nèi)核瀏覽器。
http://www.cnblogs.com/birdshome/archive/2006/09/28/uniqueid_usage.html
新聞熱點
疑難解答