因相容DOM0的關係,form被設計成支援直接可通過name直接access到control。例如如有一個<input name="user"/>則可直接使用形如document.forms[0]["user"],或在沒有特殊字元的情況下,可以直接document.forms[0].user。
然而這造成一個問題,即name若與form上的方法或屬性衝突的話(例如form具有length屬性,而同時給form增加一個name為length的控制項),會如何?
經過我的測試,在IE(XP下的6.0)和FireFox(1.5)中,name都會覆蓋原來的屬性或方法。也就是優先向前相容。
作為一種權衡,這種做法本無確定的好壞。但問題是這種行為,在編寫指令碼中,name與方法衝突下,會產生令developer意想不到的奇怪行為。而且沒有在我看到的任何文檔中記錄。(或許我孤陋寡聞,有方法可以避免?)特別是在IE中,對於Element和一些內建方法的toString()居然都不負責任的返回“[object]”,一旦發生問題,完全令人毫無頭緒。
比如,我正好有個指令碼要檢測form中是否含有特定name的control,而IE的form恰好有個額外的item方法,結果是我必須為此特別處理:
control = myForm[name];
if (typeof control == "undefined" ||
(name == "item" && control == "[object]"))
...
當然,實際上我應該為所有form的屬性和方法做特別檢測。
顯然,為了指令碼能正常運行,不應該允許任何name的屏蔽(試想name為action、method、submit、reset等的情況)。然而要網頁設計者記住一大堆應為form scripting保留的名字是不現實的。
所以結論是:這種向前相容是錯誤的設計決策。
註:將其作為bug向mozilla提交了。不知會有什麼回應。
https://bugzilla.mozilla.org/show_bug.cgi?id=322488