4

我今天在IE8的DOM選擇元素的JavaScript'選項'屬性的實現中發現了一些奇怪的行爲。IE8 JavaScript:select.options行爲

考慮下面的HTML:

<select id="sel"><option value="val">An option</option></select> 

和JavaScript:

var sel = document.getElementById('sel'); 
alert(sel === sel.options); //alerts 'true' in IE8 

顯然,聰明的傢伙寫在IE8選擇執行寫select元素上的索引,然後過它將自己公開爲JavaScript自己的「選項」屬性。

我的問題是:根據JavaScript語言規範,這是預期的功能嗎?這是一個已知的錯誤?我是否應該繼續將「選項」屬性作爲對象來對待,而不是專門用於數組?

這不是選擇DOM元素火狐3.5,鉻1.0或Safari 3.1,其中「選項」屬性被公開爲JavaScript數組下如何表現...

作爲參考,我碰到這是當我將'options'屬性傳遞給jQuery構造函數以包裝其元素時。而不是帶有X元素的jQuery對象的預期結果(如使用Firefox,Chrome和Safari),我返回了一個帶有1個元素(select元素本身)的jQuery對象。

+0

它在IE7中也是一樣的行爲。但在FF中提醒虛假。 – rahul 2009-09-17 04:39:10

回答

2

首先,這是不相關的JavaScript語言,而是DOM :)

吹毛求疵不談,DOM L2,例如,作爲具有options屬性的對象定義HTMLSelectElement。該屬性被定義爲HTMLOptionsCollection類型,並表示 - 「此元素包含的OPTION元素的集合。」

現在,引用HTMLOptionsCollection

的HTMLOptionsCollection是代表HTML選項 元素 節點列表。單個節點可以是 ,由序號索引或 節點的名稱或ID屬性訪問。

注:在HTML DOM集合是 認爲是活的意義,他們 當 底層文件被改變自動更新。

從技術上講,有什麼防止HTMLSelectElement等於其HTMLOptionsCollection(而不是在DOM L2規格,至少)。只要符合標準行爲(即元素可以通過索引或名稱/ ID訪問,接口屬性/方法 - 例如itemlength - 按指定實現),實現完全符合標準。

坦率地說,我不明白你爲什麼會關心這個特性。如果通過索引/名稱訪問元素,那麼options等於什麼應該沒有關係。一如既往,最好的選擇是以符合標準的方式設計腳本(並且只能解決任何已知的缺陷)。

+0

我覺得有趣的是,在IE8的JavaScript DOM API(和只有IE8的API)下,.options集合的行爲不像一個數組(儘管你可以通過索引訪問它)。 這是一個簡單的區別,但它是JS API的另一個區別,看起來完全沒有必要。 我提交了一些代碼。在IE8下運行,它產生'真','真'。這不會是未定義的行爲? //其中'elem'是一個選擇元素 var elem = document.getElementById('id'); alert(elem [1] === elem.options [1]); alert(elem === elem.options.options); – 2009-09-18 10:28:35