日期:2014-05-16  浏览次数:20376 次

JavaScript 中一个比较无奈的问题,大家注意了!

正常获取表单的ID值的语法为:<表单对象>.id,这个大家都知道。不过下面的代码,看看会返回什么:

  1. <form?id="create_data">??? ??
  2. ??<input?type="hidden"?name="id"?value="hello"/>??? ??
  3. </form>??? ??
  4. <script?type="text/javascript">??? ??
  5. ??alert(document.getElementById('create_data').id);???? ??
  6. </script>???

弹出对话框在IE下显示的内容为“[object]”,这个对象是那个名字为id的INPUT元素,FF还没有测试,估计也是出错。:(

大家在开发程序的时候一定要注意哟!!!

1 楼 simon1118 2007-10-29  
呵呵,楼主真是细心啊~!
2 楼 weishuwei 2007-10-29  
晕死,这个当然要返回一个对象啊,你又不是求值的.alert(document.getElementById('create_data').id.value);你试一下
3 楼 weiqingfei 2007-10-29  
能把元素名取为“id”的人也是蛮有创意的人。
4 楼 ajaxgo 2007-10-29  
二楼不要不知根源的在那里乱说
实际情况是这样的,lz最后的考虑也有错,在FF下是不会错的。
因为在ie下,可以通过"表单对象.字段name"来直接访问表单里的字段对象,即form.fieldName,所以上例中,当获得了表单对象后,其中的id属性其实已经变成了那个input控件,于是访问后得到[object]那是正常的。而如果根据二楼所说,要加.value那是什么情况呢?当然是取得那个input控件的value属性值。
由于这个是ie下的特有方式,所以在ff下,不会产生上述的情况,object.id返回的,还是正常的元素id号。
5 楼 afcn0 2007-10-29  
ls不是那样的,不管getELementById或者getElementsByTagName不论ie ff都会把下属元素的id name扩展为自己的属性,所以alert(document.getElementById('create_data').id);在ff下一定会得到input元素,这是毫无疑问的,看下面代码
<input id="length" value="22" type="text" />
<input id="aaa" name="bbb" type="reset" />
<script>
alert(document.getElementsByTagName("input").length)
</script>

这个才是bug,ie还是扩展length导致无法遍历元素,而ff却保护了length属性,没有覆盖,id被覆盖很正常,你可以getAttribute吗
6 楼 fyting 2007-10-30  
把名字取成id的少见,但把按钮id取成submit的不少...
7 楼 lianwu 2007-10-30  
名字取成ID的确实牛NR
8 楼 afcn0 2007-10-30  
其实没什么大不了,lz说的".id"根本不是标准方法,那是在没有DOM之前的DOM 0级API,正确方法是getAttribute,当然就是今天ie也不支持setAttribute的事件绑定,这些老API设计时多少都有点bug
9 楼 无聊神灯 2007-10-30  
alert(docum