`
deng131
  • 浏览: 662319 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

区分浏览器页面元素属性与特性

阅读更多
转自:http://www.cnblogs.com/rubylouvre/archive/2010/03/07/1680403.html

由于早期外行人的翻译问题,property与attribute都笼统地译作“属性”,这留下了不少隐患。那什么是属性呢?什么是特性呢?特性其实是一种内建的属性,因此它们大多数拥有默认值。举个特例,微软的IE6,IE7就是对于属性与特性的概念非常含糊,可能getAttribute那套东西是人家的,破坏了其原来的COM体系*,因此造成许多问题。群里就讨论过了,在 IE6与IE7中如果不reset CSS,页面渲染速度远远不如reset CSS的快,或者说很慢很慢。因为它内部还要能过非常复杂的机制判定那些东西是用户自定义还要CSS本来就有的属性(令我想起IE全局变量的DID问题*及window与window.window的不等问题*,微软是把问题搞复杂的高手!!!)。另一个著名的例子是class与tabindex与 for,在IE8之前,要取得其值或设值,都需要用el.className或el.htmlFor,tabindex的情况更为严重些,详见我这一篇博文《tabIndex 属性》。但这些都是题外话,那具体如何识别它们呢?看下面实验:

假如现在我们有如下一个段落:
<p ><strong id="aaa">司徒正美</strong></p>

我们把它里面的strong取出来,需要其id属性,不是,是id属性,看,改不了口吧。用javascript修改一下,然后用其 outerHTML查看一下,忘了,火狐死活不支持这个特性。我们改用其父元素的innerHTML吧。
<p ><strong id="aaa">司徒正美</strong></p>
var a = document.getElementById("aaa");
a.title ="title"
a.setAttribute("title2", "title2")
alert(a.parentNode.innerHTML)
<!doctype html> <html lang="en"> <head> <meta charset="utf-8" /> <meta content="IE=8" http-equiv="X-UA-Compatible"/> <title>如何区分属性与特性 by 司徒正美</title> <script type="text/javascript"> var test = function(){ var a = document.getElementById("aaa"); a.title ="title" a.setAttribute("title2", "title2") alert(a.parentNode.innerHTML) } </script> </head> <body> <p><strong id="aaa">司徒正美</strong></p> <p><button type="button" onclick="test()">点我,进行测试</button></p> </body> </html>

运行代码
var a = document.getElementById("aaa");
a.title ="title"
a.title2 = "title2"
alert(a.parentNode.innerHTML)
<!doctype html> <html lang="en"> <head> <meta charset="utf-8" /> <meta content="IE=8" http-equiv="X-UA-Compatible"/> <title>如何区分属性与特性 by 司徒正美</title> <script type="text/javascript"> var test = function(){ var a = document.getElementById("aaa"); a.title ="title" a.title2 = "title2" alert(a.parentNode.innerHTML) } </script> </head> <body> <p><strong id="aaa">司徒正美</strong></p> <p><button type="button" onclick="test()">点我,进行测试</button></p> </body> </html>

运行代码

能过观察,IE下内建的特性,如title,id是不带引号的,自定义的属性是带引号的,并且属性与特性是不可转换的,内部已经规定了哪些属性是特性,不能再通过其他方式添加。在标准浏览器下,只要用setAttribute设置的属性皆可以成为特性,只有特性才出现innerHTML的返回字段内。当然本身是内建的那些属性无论用何种方式设置都会出现在innerHTML中。

好了,我们看一下著名的className问题。这个请在IE下测试。
var a = document.getElementById("aaa");
a.className ="test"
alert(a.parentNode.innerHTML)
<!doctype html> <html lang="en"> <head> <meta charset="utf-8" /> <meta content="IE=7" http-equiv="X-UA-Compatible"/> <title>如何区分属性与特性 by 司徒正美</title> <script type="text/javascript"> var test = function(){ var a = document.getElementById("aaa"); a.className ="test" alert(a.parentNode.innerHTML) } </script> </head> <body> <p><strong id="aaa">司徒正美</strong></p> <p><button type="button" onclick="test()">点我,进行测试</button></p> </body> </html>

运行代码

弹出的class的值是不带引号的,说明其是一个内建的特性。
var a = document.getElementById("aaa");
a.setAttribute("className","test")
alert(a.parentNode.innerHTML)
<!doctype html> <html lang="en"> <head> <meta charset="utf-8" /> <meta content="IE=7" http-equiv="X-UA-Compatible"/> <title>如何区分属性与特性 by 司徒正美</title> <script type="text/javascript"> var test = function(){ var a = document.getElementById("aaa"); a.setAttribute("className","test") alert(a.parentNode.innerHTML) } </script> </head> <body> <p><strong id="aaa">司徒正美</strong></p> <p><button type="button" onclick="test()">点我,进行测试</button></p> </body> </html>

运行代码

注意,上面运行框的页面我已强制运行于IE7模式下。弹出的情况如下图所示:



说明其还十分智能的,能自动影映这两个属性。不过,其实问题在标准浏览器过早地暴露出来了。我建议还不是不要看,已经知道的就算了。

我们在IE8并且是运行于IE8模式下进行如下设置:
var a = document.getElementById("aaa");
a.setAttribute("className","test")
a.setAttribute("class","test2")
a.className = "test3"
alert(a.parentNode.innerHTML)
<!doctype html> <html lang="en"> <head> <meta charset="utf-8" /> <meta content="IE=7" http-equiv="X-UA-Compatible"/> <title>如何区分属性与特性 by 司徒正美</title> <script type="text/javascript"> var test = function(){ var a = document.getElementById("aaa"); a.setAttribute("className","test") a.setAttribute("class","test2") a.className = "test3" alert(a.parentNode.innerHTML) } </script> </head> <body> <p><strong id="aaa">司徒正美</strong></p> <p><button type="button" onclick="test()">点我,进行测试</button></p> </body> </html>

运行代码

IE8威武,这时不向前兼容了,你可以对比一下IE6与IE8的效果,在IE6中还能出现两个class。类似的情况还有for,在IE8要使用 setAttribute("for","idXXX")。有关getAttribute("style")的问题也修复了,以前会错误地返回一个 CSSStyleDeclaration 对象,相当于调用了el.style。值得一提的是,HTML5建议把所有特性都小写,像tabIndex这样的特性,于是有三种取法了,el.tabIndex,el.getAttribute("tabindex")与el.getAttribute("tabIndex")。

2010年3月8日补充,a.href与a.getAttribute("href")的问题,按标准浏览器的做法,a.href肯定会被绝对路径化,a.getAttribute("href")会原样输出,如果本来是相对路径,就输出相对路径,如果本来是绝对路径,就输出绝对路径。但IE则会自动补全路径,一律绝对路径化,要想原样输出需要动用getAttribute第二个参数。受影响的路径特性有 a[href],input[src],img[src]与area[href]。此bug在IE8被修复。
分享到:
评论

相关推荐

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    1.3.3页面自适应机制,即设备自适应与浏览器自适应机制 8 1.3.4 “认我测”质检服务平台的设计和实现 8 1.4 本文的结构安排 8 第二章 多窗口类浏览器设计 11 2.1 多窗口类浏览器需求分析 11 2.1.1 Activity简介 11 ...

    XMl实用大全(资料全易学习)

    5.4.7 元素内容与select属性 125 5.4.8 CSS还是XSL 129 5.5 本章小结 130 第6章 结构完整的XML文档 131 6.1 XML文档的组成 131 6.2 置标和字符数据 132 6.2.1 注释 132 6.2.2 实体引用 134 6.2.3 CDATA 135 6.2.4 ...

    xml实用大全和轻松学习手册和无废话xml

    5.4.7 元素内容与select属性 125 5.4.8 CSS还是XSL 129 5.5 本章小结 130 第6章 结构完整的XML文档 131 6.1 XML文档的组成 131 6.2 置标和字符数据 132 6.2.1 注释 132 6.2.2 实体引用 134 6.2.3 CDATA 135 6.2.4 ...

    XML编程综合资料库

    5.4.7 元素内容与select属性... 125 5.4.8 CSS还是XSL. 129 5.5 本章小结... 130 第6章 结构完整的XML文档... 131 6.1 XML文档的组成... 131 6.2 置标和字符数据... 132 6.2.1 注释... 132 6.2.2 实体引用......

    XML实用大全(web开发必备手册)

    5.4.7 元素内容与select属性... 125 5.4.8 CSS还是XSL. 129 5.5 本章小结... 130 第6章 结构完整的XML文档... 131 6.1 XML文档的组成... 131 6.2 置标和字符数据... 132 6.2.1 注释... 132 6.2.2 实体引用......

    XML实用大全----xml详细参考书

    5.4.7 元素内容与select属性... 125 5.4.8 CSS还是XSL. 129 5.5 本章小结... 130 第6章 结构完整的XML文档... 131 6.1 XML文档的组成... 131 6.2 置标和字符数据... 132 6.2.1 注释... 132 6.2.2 实体引用......

    javascript学习笔记.docx

    对其赋值使浏览器装载新的URL(用Back按钮能回退到原页面)。其实,它是Location类的一个实例,它还有一个reload()方法可以装载信的URL(用Back按钮不能回退到原页面)。 12) history属性可看成是代表历史URL的一个...

    Tcl_TK编程权威指南pdf

    Tcl解释器可以很容易地添加到你的应用程序中,这种能力将它与其他的shell语言区分开来。Tcl扮演了一种扩展语言的角色,用来配置和定制应用程序。你没有必要再去为自己的新应用程序发明一种命令语言,或是费力为自己...

    XML实用大全

    117 5.4.7 元素内容与select属性... 125 5.4.8 CSS还是XSL. 129 5.5 本章小结... 130 第6章 结构完整的XML文档... 131 6.1 XML文档的组成... 131 6.2 置标和字符数据... 132 6.2.1 注释... ...

    jQuery权威指南-源代码

    3.2.1 元素属性操作/45 3.2.2 元素内容操作/49 3.2.3 获取或设置元素值/51 3.2.4 元素样式操作/53 3.3 创建节点元素/58 3.4 插入节点/60 3.4.1 内部插入节点方法/60 3.4.2 外部插入节点方法/64 3.5 复制...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例037 区分单引号和双引号 68 实例038 动态输出JavaScript代码 69 实例039 当数字遇到了字符串 70 实例040 PHP程序员的基础——变量的应用 72 实例041 打印系统环境变量信息print_r($_ENV) 73 实例042 使用可变...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例037 区分单引号和双引号 68 实例038 动态输出JavaScript代码 69 实例039 当数字遇到了字符串 70 实例040 PHP程序员的基础——变量的应用 72 实例041 打印系统环境变量信息print_r($_ENV) 73 实例042 使用可变...

    Access+2000中文版高级编程

    11.3.2 "列”页面的属性 318 11.3.3 报表之后的工作 320 11.4 用动态列创建交叉表查询的报表 320 11.4.1 报表使用的按窗体查询 321 11.4.2 报表使用的交叉表查询 323 11.4.3 DynamicColumnsExample报表 ...

    Access 2000中文版高级编程(part1)

    11.3.2 "列”页面的属性 318 11.3.3 报表之后的工作 320 11.4 用动态列创建交叉表查询的报表 320 11.4.1 报表使用的按窗体查询 321 11.4.2 报表使用的交叉表查询 323 11.4.3 DynamicColumnsExample报表 325 ...

    超级有影响力霸气的Java面试题大全文档

     final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的...

    java面试宝典

    65、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别 17 66、HashMap和Hashtable的区别 17 67、说出ArrayList,Vector, LinkedList的存储性能和特性 17 68、java中有几...

    java 面试题 总结

     final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的...

    WAP 无线应用协议

    1.5 一致性与互通性 9 1.6 未来的工作内容 10 1.7 术语定义 10 1.8 缩略语 11 1.9 参考标准 12 1.10 参考资料 13 第二部分 应用层 第2章 无线应用环境概述 15 2.1 范围 15 2.2 WAE 文档 15 2.2.1 WAE 文档集 15 ...

    java基础题 很全面

    30. Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 10 31. 构造器Constructor是否可被override? 10 32. 是否可以继承String类? 11 33. swtich是否能作用在byte上,...

    jquery插件使用方法大全

    第二行代码得到class 为container的div元素,第三行代码得到标签下面id为msg的div元素(不过最好别这样写,因为jQuery需要遍历所有的div元素,对于带id的元素,直接用$("#id"))。第四行代码得到context为上下文的table...

Global site tag (gtag.js) - Google Analytics