IE中的getElementById和getelementsbyname

本文详细探讨了在Internet Explorer浏览器中,input和span元素在使用getElementById和getElementsByName方法时遇到的奇怪行为及解决策略。

ie中的这两个方法很奇怪,可能是bug,跟其他版本的浏览器中完全不同,而且不同的标签也有可能不同,现在做几个实验:

 

1.对于input标签

input标签中name和id完全是一样的,也就是说getelementById("elementId")查询时,找到的第一个input的id或name为elementId就返回。

<form>
<input name="username" value="111" />
<input id="username" name="name" value="222" />
</form>

<script type="text/javascript">
 alert(document.getElementById("username").value); 
  var gg = getElementById("username");
  alert(gg.value);   
  alert(document.getElementsByName('username').length);
</script>

上面这段程序运行的结果为111  和2

 

所以需要对getelementById进行改造:

<form>
<input name="username" value="111" />
<input id="username" name="name" value="222" />
</form>

<script type="text/javascript">
  var getElementById = function(el){
    var id = el;
    el = document.getElementById(el);
    if(el.id === id)
      return el;
    else{
      var nodes = document.all[id];
      for(var i = 0,len = nodes.length;i < len;i ++)
        if(nodes[i].id == id)
          return nodes[i];
    }
  }
  var gg = getElementById("username");
  alert(gg.value);
</script>

上面这段程序运行的结果为:222

对getElementsByName进行改造,下面的程序可以说明问题

<form>
<input name="username" value="111" />
<input id="username" name="name" value="222" />
</form>

<script type="text/javascript">
   var getElementsByName=function(elementName)
  {
   var n=elementName;
   var results=[];
   var i;
   var j=0;
   var nodes=document.getElementsByName(n);
   alert(nodes.length);  
   for(i=0;i<nodes.length;i++)
   {
    if(nodes[i].name==n)
    results[j]=nodes[i];
    j++;
   }
   alert(results.length);
   return results;   
  }
  alert('length:'+getElementsByName('username').length);
</script>

上面的程序运行的结果为:length:1

 

2.对于span标签

getelementById是正常的,getElementsByName是根据id来查询的,也就是说name在这两个方法中完全不起作用

<form>
<span id="mySpan">span1</span>
<span name="mySpan" id="spanId2">span2</span>
<span name="mySpan" id="spanId3">span3</span>
</form>

<script type="text/javascript">
 alert(document.getElementById("mySpan").innerText);
 alert(document.getElementsByName('mySpan').length);
 </script>

上面的程序运行的结果是 span1  和 1

所以需要对getElementsByName进行改造:

form name="form1">
<span id="mySpan">span1</span>
<span name="mySpan" id="spanId2">span2</span>
<span name="mySpan" id="spanId3">span3</span>
</form>

<script type="text/javascript">

  var getElementsByName=function(tag,elementName)
  {
   var n=elementName;
   var results=[];
   var i;
   var j=0;
   var nodes=document.getElementsByTagName(tag);
   alert(nodes.length);  
   for(i=0;i<nodes.length;i++)
   {
    if(nodes[i].name==n)
    {
    results[j]=nodes[i];
    j++;
   }
   }
   alert(results.length);
   return results;   
  }
  alert('length:'+getElementsByName('span','mySpan').length);
</script>

上面这段程序运行的结果为3 ,2,  2

 

 

<think>好的,我现在需要回答用户关于IE浏览器getElementsByName方法的支持情况的问题。首先,我得确认用户的具体需求。他们想知道这个方法在IE浏览器中的兼容性如何,可能是在开发网页时需要兼容旧版IE,比如IE8或更早的版本。 接下来,我需要查阅相关的资料。根据用户提供的引用内容,特别是引用[1]提到“getElementsByName()方法在所有主流浏览器中都支持”,但这里需要验证IE的具体情况。因为IE在旧版本中可能会有一些兼容性问题,比如方法是否存在或者行为是否与其他浏览器一致。 我记得IE在较早的版本中确实支持getElementsByName,但可能在IE5.0或更早的版本中存在差异。比如,可能返回的元素范围不同,或者对某些元素类型的支持不一致。例如,在IE8及更早版本中,getElementsByName可能只支持某些特定的元素,如表单元素,而其他元素如<div>可能不会被正确获取。 然后,我需要考虑用户可能遇到的常见问题,比如返回空集合或者方法不存在。这时候可能需要提供代码示例来检测方法是否存在,或者建议使用polyfill来兼容旧版浏览器。 另外,用户提供的引用[3]中提到了getElementByIdgetElementsByTagName,这可能有帮助。比如,可以建议如果getElementsByName不可用,是否可以结合其他方法如getElementsByTagName来达到类似效果,但需要注意这可能会影响性能或准确性。 最后,需要总结IE各版本的支持情况,明确指出哪些版本完全支持,哪些可能有部分支持或问题。同时,给出兼容性建议,比如使用特性检测,或者推荐使用现代浏览器以获得更好的支持。</think>关于IE浏览器对`getElementsByName`方法的支持情况,以下是详细分析: ### 1. **IE浏览器的支持范围** - **IE6+**:`document.getElementsByName()`方法在IE6及以上版本中可用,但存在**行为差异**。例如: - IE8及更早版本仅支持通过`name`属性获取`<form>`、`<img>`、`<iframe>`等特定元素[^1] - 其他元素(如`<div>`)即使设置了`name`属性,也可能无法被该方法获取 - **IE9+**:行为与其他现代浏览器(如Chrome、Firefox)基本一致,支持所有HTML元素的`name`属性检索 ### 2. **兼容性验证代码** ```javascript // 特性检测示例 if (document.getElementsByName) { // IE6+可执行此代码块 var elements = document.getElementsByName('testName'); } else { console.log('当前浏览器不支持getElementsByName'); } // 针对IE8的特殊处理(如获取表单元素) var formElements = document.forms[0].elements['inputName']; ``` ### 3. **与其他DOM方法的对比** | 方法 | IE6支持 | IE8支持 | IE11/Edge支持 | |-----------------------|---------|---------|---------------| | getElementById | ✔️ | ✔️ | ✔️ | [^3] | getElementsByTagName | ✔️ | ✔️ | ✔️ | [^3] | getElementsByName | 部分✔️ | 部分✔️ | ✔️ | [^1] ### 4. **开发建议** 1. 对非表单元素使用`name`属性时,建议改用`class`或`data-*`属性配合`querySelectorAll` ```javascript // 更可靠的替代方案 document.querySelectorAll('[name="elementName"]'); ``` 2. 需要兼容IE8时,建议优先使用`getElementById``getElementsByTagName`[^3] 3. 使用特性检测确保兼容性: ```javascript function safeGetByName(name) { if (typeof document.getElementsByName === 'function') { return document.getElementsByName(name); } return document.querySelectorAll('[name="'+name+'"]'); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ryb123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值