0

我覺得這應該有一個非常簡單的答案中的其他元素,但我仍然抓我的頭和谷歌是沒有幫助。我試圖在數組中存儲有關元素的信息。但是,在Google Chrome中,當我設置第二個元素的信息時,它會覆蓋第一個元素。下面的代碼的簡化版本:的getElementById()在Array()被覆蓋陣列

<!DOCTYPE HTML> 
<html> 
    <head> 
    <script> 
     var $box = new Array(); 
     $box['test'] = new Array(); 
     function load(){ 
     $box['test'][document.getElementById('box')] = true; 
     $box['test'][document.getElementById('boxinfo')] = false; 

     console.log('box: ' + $box['test'][document.getElementById('box')]);    // box: false  // Should be true 
     console.log('boxinfo: ' + $box['test'][document.getElementById('boxinfo')]);  // boxinfo: false // Should be false 
     console.log(document.getElementById('box') == document.getElementById('boxinfo')); // false   // Should be false 
     } 
    </script> 
    </head> 
    <body onload="load();"> 
    <div id="box"> 
     <div id="boxinfo">BoxInfo</div> 
     Box 
    </div> 
    </body> 
</html> 

我怎樣才能讓這個

$box['test'][document.getElementById('box')]   // is true 
$box['test'][document.getElementsByTagName('div')[0]] // is true 
$box['test'][document.getElementById('boxinfo')]  // is false 
+0

順便說一句,在陣列上,不創建命名屬性;改用索引。 –

回答

2

在做

foo[ bar ] = someValue; 

bar轉換成字符串價值,這是然後用作屬性名稱(正在分配給)。在你的情況下,你的DOM元素被轉換成像'[object HTMLDivElement]'這樣的字符串。如果兩個您的元素的DIV,它們將被轉換成相同的字符串值,這就是爲什麼第二分配覆蓋第一個,即兩個分配分配給相同的屬性。

你想實現什麼,不能用一個簡單的陣列來實現。

+0

啊,我明白了。那麼有沒有什麼辦法可以將每個元素轉換爲一個唯一的字符串,以便'$ box ['test'] [document.getElementById('box')]'和'box ['test'] [document.getElementsByTagName(' div')[0]]'是相同的值,'$ box ['test'] [document.getElementById('boxinfo')]'是不同的。我知道''box ['test'] [document.getElementById('box')。outerHTML]'會起作用,但是還有什麼更高效的嗎? – SuperKingT

+1

@SuperKingT'.outerHTML',即串行化DOM用於產生唯一字符串的目的將是一個可怕的溶液(以及,該字符串*不*是guaranteedly唯一的)。考慮使用將DOM引用轉換爲唯一字符串的自定義函數,例如'$ box.test [refToStr(document.getElementById('box'))]'。 –

+0

感謝您的幫助! – SuperKingT