2014-10-06 104 views
-1

如果我們有以下代碼使用變量作爲對象分配的值 - 的JavaScript

<ul> 
    <li id='car'>ok</li> 
    <li id='color'>dd</li> 
</ul> 

我可以申請一個名字直接與下面的代碼屬性

car.setAttribute('name', 'bmw'); 

但是如果我想使用在汽車的地方變量。

var z = 'car'; 
z.setAttribute('name', 'bmw'); 

這是行不通的。還是更難,那麼使用兩者呢?

var z = 'r'; 
ca + z.setAttribute('name', 'bmw'); 

也不起作用。

這可能嗎?

+0

c是一個字符串。 setAttribute是一個[DOM元素方法](http://www.w3schools.com/jsref/met_element_setattribute.asp)。你期待什麼發生? – yuvi 2014-10-06 15:45:05

+0

c是一個字符串。它沒有'setAttribute'方法。這是DOM對象中的東西。你會想'var c = document.getElementById('car'); c.setAttribute(...)' – 2014-10-06 15:45:29

+2

是'name'有效的'LI'屬性?我不這麼認爲。 – 2014-10-06 15:46:13

回答

2

它看起來像你依靠的是瀏覽器對於具有id秒(這是我不建議)元素創建自動全局變量。如果是這樣,你可以通過使用window對象做到這一點:

var c = 'car'; 
window[c].setAttribute('name', 'car'); 

var ca = 'ca'; 
window[ca + 'r'].setAttribute('name', 'car'); 

所有的全局變量都是全局對象,你可以在瀏覽器作爲window訪問的性能。 (實際上,window本身是全局對象的一個​​屬性,它用於引用自身。)在JavaScript中,可以使用點符號和文字名稱(obj.foo)或括號表示法和來引用對象的屬性字符串名稱(obj["foo"])。在後一種情況下,字符串可以是任何表達式的結果,包括變量查找。

我不推薦依賴自動全局變量,但是,全局命名空間是真的是擁擠和其他東西(聲明變量,函數)可以陰影元素。使用getElementById代替:

var c = 'car'; 
document.getElementById(c).setAttribute('name', 'car'); 

var ca = 'ca'; 
document.getElementById(ca + 'r').setAttribute('name', 'car'); 

旁註:name不是li elements有效的屬性。

2

使用document.getElementById來查找元素:

document.getElementById(c).setAttribute('name', 'car'); 

document.getElementById('ca' + c).setAttribute('name', 'car'); 
+0

'setAttribute'是DOM元素的一種方法 – Barmar 2014-10-06 15:47:35

+1

這是不同的從他在這個問題上想要做的事情,所以我認爲它不是相關的。 – Barmar 2014-10-06 15:49:47

+0

好的,考慮到他有HTML,我想這畢竟是一個公平的假設。 – Alnitak 2014-10-06 15:51:30

1

您不能(不訴諸於eval)通過字符串訪問局部變量。

可以但不應該)與全局變量做到這一點,或者如果有問題的變量實際上是另一個對象的屬性(前者是一個特例,因爲全局變量是在現實性window對象),即:

var o = {}; 
o.car = document.getElementById('car'); 
o.color = document.getElementById('color'); 

var c = 'car'; 
o[c].setAttribute('name', 'bmw');