2010-04-18 76 views
0

我有一個瘋狂的(但如此瘋狂,它可能會工作)想法在JavaScript中創建頁面上的每個元素,但給了一個ID,它是在DOM中其路徑的散列。Javascript瘋狂的想法找到一個節點

因此,不是通過搜索DOM來查找元素,而是使用該散列對散列路徑進行散列,然後使用getElementById()

這樣做的問題是,路徑可能比首先搜索DOM更昂貴。任何想法如何做到這一點或如果它只是愚蠢的?

+1

那麼重點是,id是節點的路徑。所以如果你有一個路徑,而不是搜索DOM來獲取它,它已經存在一個哈希ID。 – Louis 2010-04-18 10:44:45

+0

如何處理路徑比使用普通的舊'childNodes [n]','parentNode'等更容易? – bobince 2010-04-18 10:59:07

+0

首先找到元素不是問題嗎?一旦找到可以保存參考的元素。所以基本上你從一開始就搜索所有元素,而不是動態構建一個緩存。 – Kobi 2010-04-18 11:05:34

回答

2

如果你知道元素的完整路徑,是否會去實際上很難證明這種事情?通常情況下,像通過與絕對路徑無關的常見方面收集元素是一件麻煩事。而像Sizzle這樣的引擎在那裏,我不確定我看到了這個用例。 :-)

我也想知道如何在移動元素時處理它。重新分配他們的哈希,據推測,這開始越來越醜陋。

請注意,您的方法不只使用Javascript在運行時創建的元素;你可以用一個遞歸下降功能在事後爲它們分配足夠容易:

function createIDs(element) { 
    var child; 

    if (!element.id) { 
     element.id = createElementID(element); 
    } 
    for (child = element.firstChild; child; child = child.nextSibling) { 
     if (child.nodeType == 1) { // Element 
      createIDs(child); 
     } 
    } 
} 

// Kick things off 
createIDs(document.body); 

這是一個一次性打到預先生成的內容,而不是總是要重新生成內容。不提倡,只是指出。

0

我想問題是你試圖解決什麼樣的問題。

哈希通過一個唯一的ID獲取元素的路徑是好的,但你從哪裏得到的路徑?這些將是相當長的「IDS」,而且很笨拙。或者,如果您使用硬編碼,散列ID,則會極大地混淆您自己的代碼。如果你只是輕微地重構文檔,每個路徑,因此每個id都會改變。實際上,用Javascript編寫整個網站聽起來很瘋狂。 :)

總體而言,它聽起來不像是值得的麻煩。在任何現代JS框架元素中,使用CSS樣式選擇器的查找通常不是瓶頸,但開發起來要容易得多。如果你正在寫原始JS,這可能會有所不同,但是我認爲你不應該那樣做,除非你有一個受虐狂的連勝。 ;)

1

「凡在JavaScript中創建一個頁面上的每個元素」

有你的問題。現在,您可以完全在客戶端PC上創建一個頁面,而不是提供已經創建的頁面。他們必須爲每一頁都做到這一點。有些東西告訴我這將通過散列思想來抵消查找的任何積極影響。

+0

Touche,我想這隻適用於一切需要動態創建的應用程序。就像一個UI框架或其他東西。 – Louis 2010-04-18 10:47:48

1

聽起來像你正在重新創建一個JavaScript框架,如jQuery。

您可以將html片段插入到DOM中,並將這些引用保留爲函數指針,或者在插入它們時簡單地爲每個元素指定一個唯一的ID,然後它們會在稍後重新查詢id(這非常快)。

1

我看到了兩個主要問題是:

  • 由於頁面是動態生成的客戶端,搜索引擎機器人只會得到一個空白頁。

  • 如果頁面中有任何其他腳本改變DOM,元素路徑改變,哈希不再起作用。