`
shuaigg.babysky
  • 浏览: 568329 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

IE中form混淆id与name的bug

阅读更多
IE的document.getElementById混淆name和id属性的BUG

 

BUG演示

页面演示在这里,代码在下面

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
  2. < html xmlns = "http://www.w3.org/1999/xhtml" >
  3. < head >
  4. < meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" />
  5. < title > IE document.getElementById BUG DEMO </ title >
  6. </ head >
  7. < body >
  8. < script language = "javascript" >
  9. /*
  10.      IE document.getElementById BUG 演示DEMO
  11.      作者:朦朧中的罪惡
  12.      博客:http://be-evil.org
  13. */
  14. function changeValue()
  15. {
  16.      var username = document .getElementById('username');
  17.      username.value = 'Whahaha' ;
  18. }
  19. </ script >
  20. < form action = "IE_BUG2.html" method = "get" >
  21. < p > name: < input type = "text" name = "username" /> </ p >
  22. < p > name2: < input type = "text" id = "username" name = "name" /> </ p >
  23. < p > < input type = "button" value = "改变" onclick = "changeValue();" /> </ p >
  24. </ form >
  25. </ body >
  26. </ html >

很简单的一段代码,看上去似乎没有任何错误,但是在IE下点击改变按钮后,被改变值的对象居然是第一个name属性为username的input对象.而不是第二个id属性为username的对象.

如何避免这个问题?

方法一:尽量避免在页面中出现name与id属性相同的对象

方法二:利用JavaScript的特点,重写document.getElementById

下面j解决问题的方法和思路是根据国外某位兄弟的经验翻译过来,原文在这里 ,这里非常感谢他的文章给我作参考!

1.首先初步的尝试复写document.getElementById的方法

  1. if (/msie/i.test (navigator.userAgent)) //根据userAgent确定用户使用IE浏览器
  2. {
  3.      document.nativeGetElementById = document.getElementById;
  4.      document.getElementById = function (id)
  5.      {
  6.          var elem = document.nativeGetElementById(id);
  7.          if (elem)
  8.          {
  9.              //确定id相同
  10.              if (elem.id == id)
  11.              {
  12.                  return elem;
  13.              }
  14.              else
  15.              {
  16.                  //如果没有ID相同的,那么就遍历所有元素的集合找到id相同的元素
  17.                  for ( var i=1;i<document.all[id].length;i++)
  18.                  {
  19.                      if (document.all[id][i].id == id)
  20.                      {
  21.                          return document.all[id][i];
  22.                      }
  23.                  }
  24.              }
  25.          }
  26.          return null ;
  27.      };
  28. }

看起来似乎没有任何问题,但是在IE7下的某些情况中又会引出一个getAttribute() 方法的问题.

看代码:

  1. < html >
  2.      < head >
  3.          < title > Demonstrate IE7 getAttribute() bug </ title >
  4.      </ head >
  5.      < body >
  6.          < form id = "myForm1" >
  7.              < input id = "user_id" name = "user_id" value = "text" />
  8.          </ form >
  9.          < form id = "myForm2" >
  10.              < input id = "id" name = "id" value = "text" />
  11.          </ form >
  12.          < script type = "text/javascript" >
  13.              var formElement1 = document .getElementById('myForm1');
  14.              var formElement2 = document .getElementById('myForm2');
  15.              alert(formElement1.getAttribute('id')+ "\n" + formElement2.getAttribute('id'));
  16.          </ script >
  17.      </ body >
  18. </ html >

这个情况出现在表单中,如果有一个表单元素name的值为id的时候

在火狐下我们得到的结果是

myForm1
myForm2

但是在IE7下面,却变成了

myForm1
[object]

不知怎么的,ie错误的访问了它内部name位id的input元素而不是表单元素本身的id属性.使用formElement2.id的方法替代getAttribute()我们仍然可以得到相同的效果.(参见我先前遇到的一个IE的BUG )

幸运的是我们仍然可以通过以下的方式得到正确的元素:

formElement2.attributes['id'].value
formElement2.getAttributeNode('id').value

既然还有以上的隐性BUG,那我们还要再次修改一下我们覆写的document.getElementById方法

  1. if (/msie/i.test (navigator.userAgent)) //根据userAgent确定用户使用IE浏览器
  2. {
  3.      document.nativeGetElementById = document.getElementById;
  4.      document.getElementById = function (id)
  5.      {
  6.          var elem = document.nativeGetElementById(id);
  7.          if (elem)
  8.          {
  9.              //修改后的确认能得到id属性方法
  10.              if (elem.attributes[ 'id' ].value == id)
  11.              {
  12.                  return elem;
  13.              }
  14.              else
  15.              {
  16.                  //如果没有ID相同的,那么就遍历所有元素的集合找到id相同的元素
  17.                  for ( var i=1;i<document.all[id].length;i++)
  18.                  {
  19.                      if (document.all[id][i].attributes[ 'id' ].value == id)
  20.                      {
  21.                          return document.all[id][i];
  22.                      }
  23.                  }
  24.              }
  25.          }
  26.          return null ;
  27.      };
  28. }

OK,这个问题总算解决了,希望我们的微软公司能早日修复这些JavaScript DOM BUG

分享到:
评论

相关推荐

    form中相同name的checkbox提交问题

    如果一个复选框未被选中,那么在服务器端接收到的数据中,对应的`name`属性值将是`null`或不存在。 **二、相同name的checkbox问题** 1. **单一值问题**:如果多个复选框具有相同的`name`属性,服务器端只能接收到...

    js获取form表单中name属性的值

    接下来,文章中提到了使用`prop`方法,这个方法在获取属性值时与`attr`方法在行为上可能有所不同,但在这个特定场景下,由于同样是基于表单元素而非其子元素进行选择,所以可能无法直接获取到期望的name属性值。...

    ie特有bug文档

    ### IE特有Bug知识点解析 #### 一、概述 Internet Explorer(简称IE)作为曾经市场上最主流的浏览器之一,在其发展过程中积累了一系列特有的兼容性问题。这些问题是由于IE浏览器自身的技术限制以及对某些Web标准的...

    在html中 id和name的区别

    在这个例子中,`id`被用来标识`&lt;form&gt;`和`&lt;input&gt;`元素,而`name`属性则用于提交表单数据时作为字段名。通过`&lt;label&gt;`标签的`for`属性,我们还可以方便地将标签与相应的输入框关联起来,提高用户体验。 #### 总结 ...

    Javascript的IE和Firefox兼容性参考

    - 在IE中,可以使用`eval(idName)`获取id为`idName`的对象,Firefox不支持。推荐使用`document.getElementById(idName)`。 6. **变量名与HTML对象id相同的问题** - Firefox中,HTML对象的id不会自动成为全局变量...

    JavaScript在IE和FF中的区别

    1. 访问表单元素:在IE中,可以通过`document.formName.item(itemName)`或`document.formName.elements[elementName]`来访问表单元素,而Firefox仅支持`document.formName.elements[elementName]`。为确保兼容性,应...

    浅谈html中id和name的区别.pdf

    对于需要通过脚本访问的表单元素,即使在IE中,也建议使用id属性,因为直接通过id引用元素(如`MyInput.value`)比通过form引用name(如`document.forms[0].elements['MyInput']`)更为直接和高效。 关于id和name的...

    Javascript在IE和Mozilla中的兼容性问题.doc

    - 在MF中,即使变量名与HTML对象id相同,也不会产生冲突,但IE会混淆。 - 为了避免歧义,始终在声明变量时加上`var`关键字,同时避免使用与HTML对象id相同的变量名。 7. **event.x与event.y问题** - IE的事件...

    兼容IE和Firefox获得keyBoardEvent对象

    在IE中,可以使用document.formName.item("itemName")或document.formName.elements["elementName"]来获取表单元素,而在Firefox中,只能使用document.formName.elements["elementName"]。解决方法是统一使用...

    formValidate ajax bug修改

    然而,像任何其他软件一样,`formValidate` 也可能存在一些bug,尤其是在与`ajax`进行交互时。在这个场景中,我们需要关注的是"formValidate ajax bug修改"这一主题。 `ajax`(Asynchronous JavaScript and XML)是...

    IE 与FireFox 区别概要总结

    - 用`eval("idName")`在IE中获取ID为"idName"的对象,但Firefox不支持。推荐使用`document.getElementById("idName")`。 8. 变量名与HTML对象ID相同: - 在Firefox中,变量名不会覆盖HTML对象ID,但在IE中可能会...

    js在IE与firefox的差异集锦

    为了避免混淆,推荐使用document.getElementById("idName")来获取元素,而不是直接使用document.idName。 总之,在进行跨浏览器的JavaScript开发时,了解并正确处理不同浏览器之间的差异是非常重要的。通过使用条件...

    IE与FF脚本兼容性问题

    现有代码中使用集合类对象时,如 `document.forms("formName")` 或 `document.getElementsByName("inputName")(1)` 这种方式在IE中可以工作,但在FF中会报错。 **解决方法:** 将括号 `()` 替换为方括号 `[]` 作为...

    bug反馈系统-php源码

    &lt;form name="reg" action="bug.php?pro_id=&lt;?=$pro_id?&gt;" method="post" onsubmit="return checkuser(this);"&gt; 发布人: &lt;td&gt;&lt;?php if($bug_id) {echo $bug['name'];} else { echo $_SESSION['supe_username'...

    Mozzila Firefox与IE的兼容问题

    解决方法是在 frame 的使用方面,Firefox 和 IE 的最主要的区别是:如果在 frame 标签中书写了以下属性:&lt;frame src="/xx.htm" id="frameId" name="frameName" /&gt;那么IE可以通过 id 或者 name 访问这个 frame 对应的...

    动态设置form表单的action属性的值的简单方法

    form name="myform" id="myform" action="ssss" method="post" onsubmit="getUrl();"&gt; javascript方法: [removed] function getUrl(){ $('form').attr('action','new_url'); } [removed] 或者用单纯的...

    IE&FireFox;的JS区别

    - Firefox允许在同一作用域内声明与HTML对象ID相同的变量名,而IE中会导致混淆。为了避免歧义,应在声明变量时加上`var`关键字,如`var idName`,同时建议不要使用与HTML对象ID相同的变量名。 7. **事件坐标属性**...

    前端设计IE6IE7IE8IE9FF问题汇总IE和FirFox兼容问题[参照].pdf

    1. **document.form.item 问题**:在IE浏览器中,可以使用`document.formName.item("itemName")`来获取表单元素,但在Firefox中,应使用`document.formName.elements["elementName"]`。 2. **集合类对象问题**:IE...

Global site tag (gtag.js) - Google Analytics