因兼容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提交了。不知会有什么回应。