2011-07-04 22 views
0

獨立於HTML id屬性,是否有一種很好的方法可以在JavaScript中定義唯一的元素標識符以便與HTML5本地存儲一起使用?本地存儲器的JavaScript唯一標識符

localStorage.setItem('uniqueid', value); 

可以這樣做:

var uid = ancestor.index(element); // uid = 0 

localStorage.setItem(namespace + uid, value); 

的問題是,如果元素順序的變化,數據不是用正確的元素相關聯:

var uid = ancestor.index(element); // another element is prepended, so uid = 1 

localStorage.getItem(namespace + uid); 

編輯 - 實例

HTML代碼:

<ul> 
<li aria-hidden="true">foo</li> 
<li>bar</li> 
</ul> 

jQuery代碼:

var ul = $('ul'); 

ul.find('li').each(function() { 

    var element = $(this), 
     uid = ul.index(element), 
     data = JSON.parse(this.storage.getItem(uid)); 

    // load 
    console.log(data.hidden); 

    // save 
    this.$window.bind('unload', function() { 

     localStorage.setItem(uid, JSON.stringify({ 
      hidden: typeof element.attr('aria-hidden') === 'string', 
     })); 
    }); 
}); 

現在我使用每個列表項的索引創建一個唯一的標識符。我可以設置數據的uid與HTML像這樣:

<li data-uid="foo">foo</li> 

有沒有辦法動態設置的唯一標識?

+0

你可以使用一個簡單的計數器遞增呢?將值賦給元素的* data- *屬性,並賦給相關數據的一個鍵。每次添加另一個元素和數據塊時增加它。 – RobG

+0

我不確定我完全理解你的建議。你能用一個例子來闡述一下嗎? – DADU

+0

創建一個唯一的ID,使用'node.setAttribute('data-myId',id)'將其添加到該元素,然後將其添加到本地存儲。您還可以將它作爲'{...,id:node,...}存儲在一個對象中,因此訪問速度也很快。 – RobG

回答

1

如果要存儲的數據取決於元素的特定順序,那麼似乎表明將此數據保留在當前頁面之外沒有任何幫助。您不妨查看data-*屬性,例如$.data中的jQuery實現。

這將允許您存儲與任何元素相關聯的任意數據。

+1

「jQuery確保在通過jQuery方法刪除DOM元素時以及在用戶離開頁面時刪除數據。」使用本地存儲的要點是在用戶離開頁面時記住數據。 – DADU

+0

我不希望它依賴於元素的特定順序,但這是我目前唯一知道的方法。這就是爲什麼我要求替代方案。 – DADU

+0

是的,我理解localStorage的重點。但我很好奇你如何期望知道你在localStorage中擁有的數據是否與元素相關聯,一旦它們處於不同的順序。您確實需要一些特定於應用程序的標識符來進行關聯,但似乎您沒有。 –

-2
localStorage.setItem(localStorage.length, value); 

一樣創建一個計數器,每一次

+4

這將工作到您刪除的地步東西 –

+0

好點Mike! –