`
hax
  • 浏览: 964910 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

再贴一次form的属性和控件name冲突的老问题

    博客分类:
  • AJAX
阅读更多
更新:
John Resig也谈到了这个问题
而这里是一个非常详尽的分析

本来要是给realazy写的form 元素内的字段 name 不要跟 form 属性名称一致的comment,但是大概是给出链接太多,被认为是spam的缘故,所以发不出来,只好在这里再贴一次。


这个问题不仅是IE的问题,其他浏览器也是如此。
我提交到mozilla的bug:
https://bugzilla.mozilla.org/show_bug.cgi?id=322488

(我用蹩脚的英文分析了这为什么是一个bug,以及提出了折衷解决方法,不过至今没人睬我 -_-凸,所以这个bug的状态始终是unconfirmed)

全文如下:
DOM level 0 support access form controls via such script:
var f = document.forms[0];
var control1 = f['controlNameOrId'];
var control2 = f.controlNameOrId;

Though DOM HTML spec provide HTMLFormElement.elements to replace this approach,
but MSIE and Firefox still remain this problematic feature.

The issue here is named control may override the attribute or method of
HTMLFormElement. For example, if there is <input name="action" /> in the form,
then document.forms[0].action will return that HTMLInputElement. And there is a
bizarre behavior in firefox that assign still works

document.forms[0].action = 'http://url'
alert(document.forms[0].action == 'http://url')
document.forms[0].submit()

the 1st line is ok in Firefox(but failed in MSIE), but I find no way to
retrieve it back. the 2nd line will alert false, but u still submit to
http://url (if there is no control named 'submit'

Such behavior is undocumented (maybe i missed...), and will confuse developers
if they unfortunately meet some controls named 'method', 'length', 'id',
'item'(IE only), 'target', 'elements'...

To make the script works, especially when you write a reused component or
script library, there should be no such uncontrolled name conflict. But in most
case the web page is written by designer who has no concern about script, so
it's hard to avoid such case. And, even a script master won't remember all
attribute/method of HTMLFormElement.

As a conclusion, form['controlName'] approach should be removed or limited(ie.
won't override the attribute/method of HTMLFormElement).


javaeye也有人曾提及这个问题:http://yipsilon.iteye.com/blog/136211
更新:http://anweixiao.iteye.com/blog/86997也描述了所遇到的问题:名为submit的控件会遮蔽form.submit()方法。

这里是CSDN以前的讨论(注意大多数回复都是垃圾,只看我写的就好 -_-# 汗):
http://topic.csdn.net/t/20060118/23/4524484.html

我所知最早提到这个问题的:
http://dulao5.blog.hexun.com/1398177_d.html

最后是我以前写的分析:
http://blog.csdn.net/hax/archive/2006/01/06/571658.aspx
全文如下:

因兼容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保留的名字是不现实的。

所以结论是:这种向前兼容是错误的设计决策
2
0
分享到:
评论
3 楼 hax 2009-09-21  
9月11日,此bug终于被标记为了NEW。
2 楼 shqlsl 2008-11-08  
当你<input name="submit"/>
会照片 form.submit() 不能工作。
因为 submit 被认为是一个Input of Element.而不是一个事件。
我之前遇到过。
经常遇到这个 问题比较多如:
http://anweixiao.iteye.com/blog/86997

1 楼 zbm2001 2008-11-08  
比较赞同你的观点,
这个历史遗留问题处理的不严谨,
并且似乎也找不出什么很特别的理由来让它继续遗留下去。

相关推荐

    ASP.NET的用户控件

    `TagPrefix`属性用于定义一个独特的命名空间,确保在页面中使用相同名称的多个控件时不会发生冲突。通过为每个用户控件分配一个唯一的`TagName`,可以区分不同的控件实例。 7. **虚拟路径与物理路径** 用户控件的...

    asp.net C# 动态生成控件及其取值

    动态生成控件是ASP.NET中的一个重要特性,它允许开发者根据用户需求或者后台数据动态地创建和添加控件到网页上。这个过程通常涉及从数据库获取数据,然后根据数据生成相应的界面元素,如文本框、下拉列表或复选框等...

    javascript获得服务器端控件的ID的实现代码.docx

    - **确保ID的唯一性**:在使用`ClientID`时,需要注意确保每个控件的ID在整个页面中是唯一的,避免ID冲突导致的问题。 - **动态生成控件**:对于动态生成的控件,需要确保其ID也在客户端动态生成,或者通过其他...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    ExtAspNet是一组专业的Asp.net控件库,拥有原生的AJAX支持和丰富的UI效果, 目标是创建没有JavaScript,没有CSS,没有UpdatePanel,没有WebServices的Web应用程序。 支持的浏览器: IE 7.0+, Firefox 3.0+, Chrome ...

    ExtAspNet_v2.3.2_dll

    ExtAspNet是一组专业的Asp.net控件库,拥有原生的AJAX支持和丰富的UI效果, 目标是创建没有ViewState,没有JavaScript,没有CSS,没有UpdatePanel,没有WebServices的Web应用程序。 支持的浏览器: IE 7.0+, Firefox...

    表单项的name命名为submit、reset引起的问题

    表单项的name属性命名是前端开发中经常需要关注的一个细节问题。在HTML中,form元素允许我们收集和发送数据,而submit和reset是form元素中的两个非常重要的按钮类型。submit按钮用于提交表单数据到服务器,而reset...

    从VS2003(.net1.1)升级到vs2005(.net2.0)全程跟踪记录

    为修复此问题,需创建一个非抽象类TestProxy,将Migrated_Test的属性和方法复制到TestProxy中,同时将Test.aspx.cs中的类名更改为Test,并将实例化部分的代码`Test test = new Test();`更改为`TestProxy test = new ...

    asp.ner_页面传值总结

    ASP.NET 是微软开发的一种用于构建动态 Web 应用程序的技术,它提供了丰富的功能来处理页面间的传值问题。本文将深入探讨ASP.NET中页面传值的常见方法,并提供实际应用场景和注意事项。 一、URL参数传递 最基础的...

    上海计算机二级VB试题.doc

    C选项错误在于Name属性不能相同,但实际上Name属性可以相同,因为每个对象的Name是相对于其父容器而言的,不同窗体的控件Name相同不会冲突。 7. 结构化编程:GoTo语句是非结构化编程语句,因为它允许无条件跳转,...

    asp.net html控件的File控件实现多文件上传实例分享

    2. **文件重命名**:为了避免文件名冲突和安全问题,通常会使用唯一ID作为文件名。 3. **错误处理**:当文件上传失败时,应提供清晰的错误提示。 4. **文件大小限制**:根据服务器性能设定合理的文件大小限制。 5. *...

    操作系统课程设计报告-模拟文件管理系统(附源程序).doc

    4. 窗体结构:整个系统由三个窗体组成,Form1作为主界面,Form2用于显示和编辑文件内容,Form3展示文件属性。窗体之间通过包含头文件来传递数据。 5. 功能实现:包括文件的创建、删除、复制、重命名,以及文件内容的...

    EXTJS FORM HIDDEN TEXTFIELD 赋值 使用value不好用的问题

    总的来说,EXTJS Form Hidden Textfield的赋值问题可能是由于环境、时机或者与其他脚本冲突引起的。在确保问题定位准确后,可以采用更优雅的编程模式来避免类似问题。同时,持续保持EXTJS框架和依赖库的更新,也是...

    ShareDemo.zip

    在多窗口应用中,如果每个窗口都独立创建和管理一个SerialPort实例,可能会导致资源冲突或浪费。因此,"ShareDemo.zip"这个Demo就是为了解决这个问题,它展示了如何在多个窗体之间有效地共享同一个SerialPort实例。 ...

    VB练习题及参考答案.docx

    在本题中,定义了一个名为 Student 的记录类型,包含三个字段:number、name 和 age。要正确引用该记录类型变量,需要使用 Dim 语句声明变量,然后对变量进行赋值。 题号 7:在程序中将变量 Inta、B1、St、D 分别...

    vb课程设计 课堂教案!

    2. **控件数组的使用**:控件数组是由一组具有相同类型的控件组成,它们共享相同的属性和事件处理过程。通过索引区分不同的控件,简化代码编写。比如,可以创建一个按钮数组`Buttons()`,并通过索引操作各个按钮。 ...

    asp.net2.0文个件上传

    这种策略可以有效避免同一时间内的文件重名,但要注意,如果在同一秒内有多次上传,仅用日期时间戳可能会导致冲突,因此引入了GUID来进一步增加唯一性。 文件上传还需要考虑安全性问题,如验证文件类型和大小。例如...

    VS2005(c#)项目调试问题解决方案集锦

    ### VS2005(C#)项目调试问题解决方案集锦 #### 1. Request.Form值问题 在处理用户提交的数据时,可能会遇到无法获取`Request.Form`中的值的问题。这通常有以下两种原因: 1. **Web.config配置问题**:默认情况下,...

    Struts批量上传文件实例word

    由于Struts框架需要处理文件上传,因此我们需要确保表单的`enctype`属性设置为`multipart/form-data`,以便支持文件数据的传输。以下是一个简单的JSP示例: ```jsp &lt;html:form action="upload.do?method=upload" ...

    VB线程枚举窗体,当前打开的所有窗体

    这段代码将遍历`OpenForms`集合,并对每个窗体调用`Name`属性,输出窗体的名称。这可以帮助开发者了解当前有哪些窗体正在运行,或者根据窗体的名称执行特定操作。 在VB中,线程安全地枚举这些窗体是非常重要的。...

Global site tag (gtag.js) - Google Analytics