DOM操作表格及样式
学习要点:
1.操作表格2.操作样式 DOM在操作生成HTML上,还是比较简明的。不过,由于浏览器总是存在兼容和陷阱,导致最终的操作就不是那么简单方便了。本章主要了解一下DOM操作表格和样式的一些知识。一、操作表格
<table>标签是HTML中结构最为复杂的一个,我们可以通过DOM来创建生成它,或者HTML DOM来操作它。(PS:HTML DOM提供了更加方便快捷的方式来操作HTML,有手册)。//需要操作table
<table border = "1" width = "300"> <caption>人员表</caption> <thead> <tr> <td>姓名</td> <td>性别</td> <td>年龄</td> </tr> </thead> <tbody> <tr> <td>张三</td> <td>男</td> <td>20</td> </tr> <tr> <td>李四</td> <td>男</td> <td>21</td> </tr> </tbody></table> //使用DOM来创建这个表格var table = document.createElement('table');
table.border = 1;table.width = 300; var caption = document.createElement('caption');table.appendChild(caption);caption.appendChild(document.createTextNode('人员表'));var thead = document.createElement('thead');
table.appendChild(thead);var tr = document.createElement('tr');
thead.appendChild(tr);var th1 = document.createElement('th');
var th2 = document.createElement('th');var th3 = document.createElement('th');tr.appendChild(th1);th1.appendChild(document.createTextNode('姓名'));tr.appendChild(th2);th2.appendChild(document.createTextNode('年龄'));document.body.appendChild(table);
PS:使用DOM来创建表格其实已经没有什么难度,就是有点小繁琐而已。下面我们再使用HTML DOM来获取和创建这个相同表格。HTML DOM中,给这些元素标签提供一些属性和方法
属性和方法 说明
caption 保存着<caption>元素的引用tBodies 保存着<tbody>元素的HTMLCollection集合tFoot 保存着对<tFoot>元素的引用tHead 保存着对<tHead>元素的引用rows 保存着对<tr>元素的HTMLCollection集合createTHead() 创建<thead>元素,并返回引用createTFoot() 创建<tfoot>元素,并返回引用createCaption() 创建<caption>元素,并返回引用deleteTHead() 删除<thead>元素deleteTFoot() 删除<tfoot>元素deleteCaption() 删除<caption>元素deleteRow() 删除指定的行insertRow(pos) 向rows集合中的指定位置插入一行 <tbody>元素添加的属性和方法属性或方法 说明rows 保存着<tbody>元素中行的HTMLCollectiondeleteRow(pos) 删除指定位置的行insertRow(pos) 向rows集合中指定位置插入一行,并返回引用 <tr>元素添加的属性和方法属性或方法 说明cells 保存着<tr>元素中单元格的HTMLCollectiondeleteCell(pos) 删除指定位置的单元格insertCell(pos) 向cells集合的指定位置插入一个单元格,并返回引用PS:因为表格较为繁杂,层次也多,在使用之前所学习的DOM只是来获取某个元素会非常难受,所以使用HTMLDOM
会清晰很多。 //使用HTMLDOM来获取表格元素var table = document.getElementsByTagName('table')[0]; //获取table引用//按照之前的DOM节点方法获取<caption>
alert(table.children[0],innerHTML); //获取caption的内容PS:这里使用了children[0]本身就忽略了空白,如果使用firstChild或者childNodes[0]需要更多的代码。
//按HTMLDOM来获取表格的<caption>
alert(table.caption.innerHTML); //获取caption的内容//按HTMLDOM来获取表头表尾<thead>、<tfoot>
alert(table.tHead); //获取表头alert(table.tFoot); //获取表尾 //按HTMLDOM来获取表体alert(table.tBodies); //获取表体的集合 PS:在一个表格中<thead>和<tfoot>是惟一的,只能一个。而<tbody>不是惟一的可以有多个,这样导致最后返回的<thead>和<tfoot>是元素引用,而<tbody>返回的是元素集合。//按HTMLDOM来获取表格的行数
alert(table.rows.length); //获取行数的集合,数量//获取表格主体里的行数
alert(table.tBodies[0].rows.length); //获取主体的行数集合,数值//获取表格主体内容第一行的单元格数量(tr)
alert(table.tBodies[0].rows[0].cells.length); //获取第一行的单元格数量//获取表格主体内容第一行第一个单元格的内容(td)
alert(table.tBodies[0].rows[0].cells[0].innerHTML); //删除标题、表头、表尾、行、单元格table.deleteCaption(); //删除标题table.deleteTHead(); //删除<thead>table.tBodies[0].deleteRow[0]; //删除<tr>一行table.tBodies[0].rows[0].deleteCell(0);//删除<td>一个单元格//按HTMLDOM创建一个表格
var table = document.createElement('table');table.border = 1;table.width = 300;table.createCaption().innerHTML = '人员表';
//table.createTHead();
//table.tHead,insertRow(0);var thead = table.createTHead();
var tr = thead.innerRow(0);var td = tr.insertCell(0);
td.appendChild(document.createTextNode('数据'));var td2 = tr.insertCell(1);
td2.appendChild(document.createTextNode('数据'));document.body.appendChild(table);
PS:在创建表格的时候<table>、<tbody>、<th>没有特定的方法,需要使用document来创建。也可以模拟已有方法编写特定的函数即可,例如:insertTH()之类的。
二、操作样式CSS作为(X)HTML的辅助,可以增强页面的显示效果,但不是每个浏览器都能支持最新的CSS能力.CSS的能力和DOM级别密切相关,所以我们有必要检测当前浏览器支持CSS能力的级别。DOM1级实现了最基本的文档处理,DOM2和DOM3在这个基础上增加了更多的交互能力,这里我们主要探讨CSS,DOM2增加了CSS编程访问方式和改变CSS样式信息。
DOM一致型检测
功能 版本号 说明Core 1.0、2.0、3.0 基本的DOM用于表现文档节点树XML 1.0、2.0、3.0 Core的XML扩展,添加了对CDATA等支持HTML 1.0、2.0 XML的THML扩展,添加了对HTML特有元素支持Views 2.0 基于某些样式完成文档的格式化StyleSheets 2.0 将样式关联到文档CSS 2.0 对层叠样式表1级的支持CSS2 2.0 对层叠样式表2级的支持Events 2.0 常规的DOM事件UIEvents 2.0 用户界面事件MouseEvents 2.0 由鼠标引发的事件(如:click)MutationEvents 2.0 DOM树变化时引发的事件HTMLEvents 2.0 HTML4.01事件Range 2.0 用户操作DOM树中某个范围的对象和方法Traversal 2.0 遍历DOM树的方法LS 3.0 文件与DOM树之间的同步加载和保存LS-Async 3.0 文件与DOM树之间的同步加载和保存Valuidation 3.0 在确定有效的前提下修改DOM树的方法 //检测浏览器是否支持DOM1级css能力或DOM2级css能力alert('DOM1级CSS能力:'+document.implementation.hasFeature('CSS' , '2.0'));alert('DOM1级CSS能力:'+document.implementation.hasFeature('CSS2' , '2.0'));PS:这种检测方案在IE浏览器上不精确,IE6中,hasFeature()方法只为HTML和版本1.0返回true,其他所有功能
均返回false。但IE浏览器还是支持最常用的CSS2模块。1.访问元素的样式
任何HTML元素标签都会有一个通用的属性:style。它会返回CSSStyleDeclaration对象。下面我们看几个最常见的行内style样式的访问方式。PS:行内就是在标签里的style属性添加的样式,内联就是<style>标签里书写的样式,链接就是通过<link href>
标签链接到的样式CSS属性及JavaScript调用
CSS属性 JavaScript调用
color style.colorfont.size style.fontSizefloat 非IE:style.cssFloatfloat IE:style.styleFloat<div id="box" style="color:red;background:#ccc;font-size:20px;float:right">测试Div</div>
var box = document.getElementById('box'); //获取boxbox.style.cssFloat.style; //CSSStyleDeclarationbox.style.cssFloat.style.color; //redbox.style.cssFloat.style.fontSize; //20pxbox.style.cssFloat || box.style.styleFloat; //left,非IE用cssFloat,IE用styleFloatPS:以上取值方式也可以赋值,最后一种赋值可以如下:
typeof box.style.cssFloat != 'undefined'?box.style.cssFloat = 'right' : box.style.styleFloat = 'right'; DOM2级样式规范为style定义了一些属性和方法属性和方法 说明cssText 访问或设置style中的CSS代码length CSS属性的数量parentRule CSS信息的CSSRule对象getPropertyCSSValue(name) 返回包含给定属性值的CSSValue对象getPropertyPriority(name) 如果设置了!important,则返回,否则返回空字符串item(index) 返回指定位置CSS属性名称removeProperty(name) 从样式中删除指定属性setProperty(name,v,p) 给属性设置相应的值,并加上优先权box.style.cssText; //获取CSS代码//box.style.length; //3,IE不支持//box.style.removeProperty('color'); //移除某个CSS属性,IE不支持//box.style.setProperty('color' , 'blue'); //移除某个CSS属性,IE不支持 PS:Firefox、Safari、Opera9+、Chrome支持这些属性和方法。IE只支持cssText,而getPropertyCSSValue()方法只有Safari3+和Chrome支持。
PS:style属性仅仅只能获取行内的CSS样式,对于另外两种样式内嵌<style>和链接<link>方式则无法获取到。
虽然可以通过style来获取单一值的CSS样式,但对于复合值的样式信息,就需要通过计算样式来获取。DOM2
样式,window对象下提供了getComputedStyle()方法。接受两个参数,需要计算的样式元素,第二个伪类(:hover),如果没有伪类就填null。PS:IE不支持这个DOM2级的方法,但有个类似的属性可以使用currentStyle属性。
<style>#box{ color : red; border : 1px solid red; font-family : "微软雅黑"; font-size :20px;}</style>var box = document.getElementById('box');var style = window.getComputedStyle?window.getComputedStyle(box,null) : null || box.currentStyle;alert(style.color);
alert(style.border); alert(style.fontFamily); alert(style.fontSize); alert(box.style.fontFamily); //空PS:border属性就是一个综合属性,所以它在Chrome显示了,Firefox为空,IE为undefined。所谓综合性属性
,就是XHTML课程里的简写形式,所以DOM在获取CSS的时候,最好采用完整写法兼容性最好,比如:border-top-color之类的。PS:计算式的获取,不仅仅可以获取没有设置的默认样式,也可以获取行内,内联和链接
为什么可以获取内联和链接呢? 因为不管你在哪里设置CSS,最终会驻留咋i浏览器的计算样式里
2.操作样式表
使用style属性可以设置行内的CSS样式,而通过id和class调用是最常用的方法。box.id = 'pox'; //把ID改变会带来灾难性的问题box.className = 'red'; //通过className关键字来设置样式 在添加clssName的时候,我们想给一个元素添加多个class是没有办法的,后面一个必将覆盖掉前面一个,所以必须来写一个函数。//判断一个class是否存在
//如果有,返回true,没有返回false//box.className的字符串为'aaa bbb'//element.className表示'aaa bbb'//match是正则表达式里的一个方法//如果element.className ‘aaa bbb’里面有正则的字符串‘aaa’//match就是查找字符串‘aaa bbb’里面是否有/aaa/,如果有,就把这个字符返回//element.className没有ccc,那么就返回null//转换成布尔值//问题,以一个aa也能返回true//aa不是aaa,所以这个正则不精确//new RegExp('(\\s|^)'+cName+'(\\s|$)')通过这个正则,我们严格精确的找到了指定的class//检查class是否存在
function hasClass(element , cName){ return !!element.className.match(new RegExp('(\\s|^)'+cName+'(\\s|$)'));}//添加一个classfunction addClass(element,cName){ if(!hasClass(element,cName)){ element.className +=' ' + cName; }}//移除一个classfunction removeClass(element,cName){ if(hasClass(element , cName)){ element.className = element.className.replace(new RegExp('(\\s|^)'+cName+'(\\s|$)'), ''); }}
//判断是否存在这个class
function hasClass(element,className){ return element.className.match(new RegExp('(\\s|^)'+className+'(\\s|$)'));}//添加一个class,如果不存在的话function addClass(element ,className){ if(!hasClass(element,className)){ element.className += "" +className; }}//删除一个class,如果存在的话function removeClass(element ,className){ if(hasClass(element ,className)){ element.className = element.className.replace(new RegExp('(\\s|^)'+className+'(\\s|$)'),''); }} 之前我们使用style属性,仅仅只能获取和设置行内的样式,如果是通过内嵌<style>或链接<link>提供的样式规则就无可奈何了,然后我们又学习了getComputedStyle和currentStyle,这只能获取却无法设置。CSSStyleSheet类型表示通过<link>元素和<style>元素包含的样式表。document.implementation.hasFeature('StyleSheets' , '2.0'); //是否支持DOM2级样式表
document.getElementsByTagName('link')[0]; //HTMLLinkElementdocument.getElementsByTagName('style')[0]; //HTMLStyleElement 这两个元素本身返回的是HTMLLinkElement和HTMLStyleElement类型,但CSSStyleSheet类型更加通用一些得到这个类型非IE使用sheet属性,IE使用styleSheet;<link href="css/css.css" type="text/css"></link>
//css.css
#box{ }var link = document.getElementsByTagName('link')[0]; //得到link标签对象
var sheet = link.sheet || link.styleSheet; //得到CSSStyleSheet,表示链接的CSS样式表对象var sheet = document.styleSheets; //得到的是StyleSheetList集合属性或方法 说明
disabled 获取和设置样式表是否被禁用href 如果是通过<link>包含的,则样式表为URL,否则为nullmedia 样式表支持的所有媒体类型的集合ownerNode 指向拥有当前样式表节点的指针parentStyleSheet @import导入的情况下,得到父CSS对象title owerNode中title属性的值type 样式表类型字符串cssRules 样式表包含样式规则的集合,IE不支持ownerRule @import导入的情况下,指向表示导入的规则,IE不支持deleteRule(index) 删除cssRules集合中指定位置的规则,IE不支持insertRule(rule , index) 向cssRules集合中指定位置插入rule字符串,IE不支持sheet.disabled; //false,可设置为truesheet.href; //css的URLsheet.media; //MediaList,集合sheet.media[0]; //第一个media的值sheet.title; //得到title属性的值sheet.cssRules; //CSSRuleList,样式表规则集合alert(sheet.cssRules[0].cssText); //得到第一个规则的文本内容alert(sheet.cssRules[0].selectorText);//得到第一个规则的选择符,就是#boxsheet.deleteRule(0); //删除第一个样式规则sheet.insertRule("body {background-color : red}" , 0); //在第一个位置添加一个样式规则 PS:除了几个不用和IE不支持的我们忽略了,还有三个有IE对应的另一种方式:sheet.rules; //代替cssRules的IE版本sheet.removeRule(0); //代替deleteRule的IE版本sheet.addRule("body" ,"background-color : red" , 0); //代替insertRule的IE版本
//跨浏览器兼容获取rules
var rules = sheet.cssRules || sheet.rules;//跨浏览器兼容添加第一条规则
function insertRule(sheet , selectorText ,cssText , position){ if(sheet.insertRule){ sheet.insertRule('selectorText + '{' +cssText+ '}' , position); }else if(sheet.addRule){ sheet.addRule(selectorText , cssText , position); }}//跨浏览器兼容删除第一条规则
function deleteRule(sheet , position){ if(sheet.deleteRule){ sheet.deleteRule(position); }else if(sheet.removeRule){ sheet.removeRule(position); }}除了刚才的方法可以得到CSSStyleSheet类型,还有一种方法是通过document的styleSheets属性来获取。
document.styleSheet; //StyleSheetList,集合 CSSStyleRule可以使用的属性属性 说明cssText 获取当前整条规则对应的文本,IE不支持parentRule @import导入的返回测试null,IE不支持parentStyleSheet 当潜规则的样式表,IE不支持selectorText 获取当前规则的选择文本style 返回CSSStyleDeclaration对象,可以获取和设置样式type 表示规则的常量值,对于样式规则,值为1,IE不支持rule.cssText; //当前规则的样式文本
rule.selectorText; //#box,样式的选择符rule.style.color; //red,得到具体样式值PS:Chrome浏览器在本地运行时会出现问题,rules会变成null,只要把它放到服务器上允许即可正常。总结:
三种操作CSS的的方法,第一种style行内,可读可写;第二种行内、内联和链接,使用getComputedStyle或currentStyle,可读不可写,第三种cssRules或rules,内联和链接可读可写。