标准参考

无。

问题描述

各浏览器使用 document.id 和 document.name 方法获取对象引用的支持存在差异。

造成的影响

某些浏览器中通过 document.id 和 document.name 可能无法获取元素,导致脚本异常,功能不可用。

受影响的浏览器

所有浏览器  

问题分析

参考 W3C 规范中 HTML5 草案:3.1.1 Documents in the DOM

参考 W3C 规范中 HTML5 草案:3.1.4 DOM tree accessors

1. DOM 树的访问

1.1. DOM 树中的 Document 对象及 HTMLDocument 接口

浏览器中每一个 XML 和 HTML 文档都用一个 Document 对象来表示。

Document 继承了 HTMLDocument 接口。

HTMLDocument 接口定义了实现它的对象所拥有的方法和属性。其中包括资源元数据管理、DOM 树的访问、动态标记插入、用户交互和事件处理属性等。

1.2. 访问 DOM 树中节点的方法

W3C 在 HTML5 草案中规定了一系列 DOM 树节点的访问方式,并不包括 document.id 或 document.name。

访问 DOM 树中某个节点的方法,W3C 中推荐的是使用 document.getElementById(id),根据一个元素的 id 属性获取它的 DOM 节点对象。

还有很多其他的方式,也可以获取页面上的元素,但这些方式不是 W3C 标准中规定的,所以对这些方法的支持因浏览器而异。这其中,就有使用 document.id 或 document.name 获取元素的方式。

2. 使用document.id 和 document.name 访问 DOM 树中的节点

使用 document.id 和 document.name 访问 DOM 树中节点的方法,可以访问 IMG 元素、IFRAME 元素和 FORM 元素。

除了 Opera IE 同时支持用 document.id 和 document.name 访问这 3 种元素的节点对象外,而其它浏览器对用其 name 和 id 的支持有所不同。

分析以下代码:

<script>
window.onload = function(){
document.getElementById("info").innerHTML = "document.id :" + !!document.iframe_id+
"<br/>document.name : " + !!document.iframe_name;
}
</script>
<iframe id="iframe_id" name="iframe_name"></iframe>
<div id="info"></div>
  • 以上测试用例中使用 document.id 和 document.name 的方法获取 DOM 树中的 IFRAME 元素引用,如果存在则返回 true,否则返回 false 。
  • 获取元素后的返回值将输出到 info 中

上面测试用例中,IE Opera 均全返回 true,Firefox 返回 false,而 Safari Chrome 中 document.id 是 false,document.name 是 true。

用其他元素替换 IFRAME 元素,可以测试其它元素的情况。 如下表:

获取方式 IE6 IE7 IE8 Firefox Chrome Safari Opera
Q S Q S Q S Q S Q S Q S Q S
document.div_id N N N N N N N N N N N N N N
document.div_name N N N N N N N N N N N N N N
document.span_id N N N N N N N N N N N N N N
document.span_name N N N N N N N N N N N N N N
document.select_id N N N N N N N N N N N N N N
document.select_name N N N N N N N N N N N N N N
document.a_id N N N N N N N N N N N N N N
document.a_name N N N N N N N N N N N N N N
document.input_id N N N N N N N N N N N N N N
document.input_name N N N N N N N N N N N N N N
document.img_id Y Y Y Y Y Y Y Y Y Y Y Y Y Y
document.img_name Y Y Y Y Y Y Y Y Y Y Y Y Y Y
document.form_id Y Y Y Y Y Y N N N N N N Y Y
document.form_name Y Y Y Y Y Y Y Y Y Y Y Y Y Y
document.iframe_id Y Y Y Y Y Y N N N N N N Y Y
document.iframe_name Y Y Y Y Y Y N N Y Y Y Y Y Y
document.object_id Y Y Y Y Y Y Y Y Y Y Y Y Y Y
document.object_name Y Y Y Y Y Y Y Y Y Y Y Y Y Y
document.embed_id Y Y Y Y Y Y Y Y N N N N Y Y
document.embed_name Y Y Y Y Y Y Y Y Y Y Y Y Y Y

说明:

  • 此汇总表中 Q 代表 Quirks Mode,S 代表 Standards Mode;
  • 以 document.element_id、document.element_name 表示获取方式,如 document.div_id 表示利用 id 属性获取 DIV 元素对象,而 document.span_name 表示使用 SPAN 元素的 name 属性来获取它的对象。

解决方案

使用 W3C 标准中的 document.getElementById(id) 方法获取对象。

各浏览器对使用 document.id 和 document.name 获取对象的支持存在差异的更多相关文章

  1. name值与id值在Js获取元素时的区别

    1.适用范围 除base.head.html.script.meta.title标签外,id都可以用:name只适用于select.form.frame.iframe.img.a.input等中. H ...

  2. 点击图片或者鼠标放上hover .图片变大. 1)可以使用css中的transition, transform 2) 预先设置一个 弹出div. 3)弹出层 alert ; 4) 浏览器的宽度document.documentElement.clientWidth || document.body.clientWidth

    变大: 方法一: 利用css属性. 鼠标放上 hover放大几倍. .kecheng_02_cell_content img { /*width: 100px; height: 133px;*/ wi ...

  3. 用JAVA编写浏览器内核之实现javascript的document对象与内置方法

    原创文章.转载请注明. 阅读本文之前,您须要对浏览器怎样载入javascript有一定了解. 当然,对java与javascript本身也须要了解. 本文首先介绍浏览器载入并执行javascript的 ...

  4. jquery中的$("#id")与document.getElementById("id")的区别

    以前一直认为jquery中的$("#id")和document.getElementByIdx_x("id")得到的效果是一样的,今天做特效的时候才发现并不是这 ...

  5. 不同浏览器对document.documentElement和document.body的scrollheight ,scrollTop,clientHeight以及判断滚动条是否滚动到页面最底部 【转载】

    前段时间学习怎么写一个瀑布流的时候,就接触到document.documentElement和document.body的区别,然后今天查资料的时候看到这篇博客,遂转载记录在此. 两种特殊的文档属性可 ...

  6. Make the “Check out” function available in the office document opened with Document ID link

    I found a solution to make the “Check out” function available in the office document opened with Doc ...

  7. document.documentElement和document.body区别以及获取浏览器的宽高

    原文:http://www.jb51.net/article/41410.htm 1.区别: body是DOM对象里的body子节点,即 <body> 标签: documentElemen ...

  8. function $(id) { return typeof id === "string" ? document.getElementById(id) : id; }

    function $(id) {   return typeof id === "string" ? document.getElementById(id) : id; } 这句代 ...

  9. document.body、document.documentElement和window获取视窗大小的区别

    来源:http://www.ido321.com/906.html 在w3school关于window对象的介绍中,介绍了获取浏览器窗口大小的三种方法(浏览器的视口,不包括工具栏和滚动条). 对于In ...

随机推荐

  1. ruby中proc和lambda的return区别

    学习ruby有一段时间了,但是我看了好几遍proc和lambda的return区别的区别讲解,始终没明白到底什么区别,今天上午又看,终于感觉是茅塞顿开有点领悟了 一下内容部分来自<<rub ...

  2. 4.Single Number && Single Number (II)

    Single Number: 1. Given an array of integers, every element appears twice except for one. Find that ...

  3. 49. Search in Rotated Sorted Array && Search in Rotated Sorted Array II

    Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you before ...

  4. sql 简单事务例子

    BEGIN TRY BEGIN TRAN ) BEGIN UPDATE table SET ... END ELSE BEGIN UPDATE table SET ... UPDATE table S ...

  5. 苹果刷机相关开源代码(如iRecovery等)收集汇总(不断更新中...)

    下面截图是在下面开源代码下使用VS2015修改部分代码后适配而成,可以在Windows平台上运行, 下载连接: http://pan.baidu.com/s/1i4zKGx3.

  6. dll 导出函数名的那些事

    dll 导出函数名的那些事 关键字: VC++  DLL  导出函数 经常使用VC6的Dependency或者是Depends工具查看DLL导出函数的名字,会发现有DLL导出函数的名字有时大不相同,导 ...

  7. Python自动化 【第二篇】:Python基础-列表、元组、字典

    本节内容 模块初识 .pyc简介 数据类型初识 数据运算 列表.元组操作 字符串操作 字典操作 集合操作 字符编码与转码 一.模块初识 Python的强大之处在于他有非常丰富和强大的标准库和第三方库, ...

  8. Windows7 IE10运行不了JavaScript的问题

    如题,我的环境是Windows7 + IE10,JavaScript怎么也运行不了.郁闷了好一段时间. 后来发现一种办法终于可以让JavaScript运行起来. 具体:  点击 [工具] => ...

  9. python 操作exls学习之路1-openpyxl库学习

    这篇要讲到的就是如何利用Python与openpyxl结合来处理xlsx表格数据.Python处理表格的库有很多,这里的openpyxl就是其中之一,但是它是处理excel2007/2010的格式,也 ...

  10. poj 2337 有向图输出欧拉路径

    Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10186   Accepted: 2650 Descrip ...