對Web頁面元素的絕對唯一引用方法

來源:互聯網
上載者:User
    我們知道要在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核心瀏覽器。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.