日期:2013-10-14  浏览次数:20773 次

 

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