各浏览器对使用 document.id 和 document.name 获取对象的支持存在差异
标准参考
无。
问题描述
各浏览器使用 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 获取对象的支持存在差异的更多相关文章
- name值与id值在Js获取元素时的区别
1.适用范围 除base.head.html.script.meta.title标签外,id都可以用:name只适用于select.form.frame.iframe.img.a.input等中. H ...
- 点击图片或者鼠标放上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 ...
- 用JAVA编写浏览器内核之实现javascript的document对象与内置方法
原创文章.转载请注明. 阅读本文之前,您须要对浏览器怎样载入javascript有一定了解. 当然,对java与javascript本身也须要了解. 本文首先介绍浏览器载入并执行javascript的 ...
- jquery中的$("#id")与document.getElementById("id")的区别
以前一直认为jquery中的$("#id")和document.getElementByIdx_x("id")得到的效果是一样的,今天做特效的时候才发现并不是这 ...
- 不同浏览器对document.documentElement和document.body的scrollheight ,scrollTop,clientHeight以及判断滚动条是否滚动到页面最底部 【转载】
前段时间学习怎么写一个瀑布流的时候,就接触到document.documentElement和document.body的区别,然后今天查资料的时候看到这篇博客,遂转载记录在此. 两种特殊的文档属性可 ...
- 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 ...
- document.documentElement和document.body区别以及获取浏览器的宽高
原文:http://www.jb51.net/article/41410.htm 1.区别: body是DOM对象里的body子节点,即 <body> 标签: documentElemen ...
- function $(id) { return typeof id === "string" ? document.getElementById(id) : id; }
function $(id) { return typeof id === "string" ? document.getElementById(id) : id; } 这句代 ...
- document.body、document.documentElement和window获取视窗大小的区别
来源:http://www.ido321.com/906.html 在w3school关于window对象的介绍中,介绍了获取浏览器窗口大小的三种方法(浏览器的视口,不包括工具栏和滚动条). 对于In ...
随机推荐
- 移动端line-height失效
移动端高度过小,使用rem布局时div里面的文字不能用line-height垂直居中: 解决方案,先高度,字体大小扩大n倍,然后利用transform:scale(0.n)缩小即可.
- js 正则
/判断输入内容是否为空 function IsNull(){ var str = document.getElementById('str').value.trim(); ...
- java堆内存和栈内存的处理
前段时间学习二叉树在处理删除操作的时候遇到一个头疼的问题:删除节点的时候明明已经置null了可树上该节点依旧存在,还必须执行node.father.left = null;才可以删除node节点,寻找 ...
- 使用eclipse搭建hadoop开发环境
下载一个 hadoop-eclipse-plugin-*.jar的eclipse插件,并放在plugins目录下 重启eclipse 打开视象,找“大象” 连接HDFS success 编程准 ...
- spring数据源配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-// ...
- 百度地图api简单使用方法
百度地图API的使用方法 百度地图API 开始学习百度地图API最简单的方式是看一个简单的示例.以下代码创建了一个520x340大小的地图区域并以天安门作为地图的中心: 1. <html&g ...
- 纸上谈兵:队列(queue)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 队列(queue)是一个简单而常见的数据结构.队列也是有序的元素集合.队列最大的特 ...
- web服务器长连接
web服务器都提供长连接的方式,所谓长连接就是客户端一次请求完后,不关闭连接,保持一段时间的连接,下次此客户端再次请求时,不用创建新连接,复用所保持的连接即可.从理论上,长连接可以免去大量建立和关闭连 ...
- 使用虚幻引擎中的C++导论(一-生成C++类)
使用虚幻引擎中的C++导论(一) 第一,这篇是我翻译的虚幻4官网的新手编程教程,原文传送门,有的翻译不太好,但大体意思差不多,请支持我O(∩_∩)O谢谢. 第二,某些细节操作,这篇文章省略了,如果有不 ...
- WebForm ASP开发方式、 IIS服务器以及WebForm开发基础
网页端 B/S两种:(ASP.NET --网站应用开发技术) WebForm: 微软最先出现的网站开发技术 MVC: 后来开发,为了让java.PHP转过来的开发人员更容易接受使用 客户端 C/ ...