天天看点

DOM扩展札记

selector api

html5 dom扩展

element traversal规范

众多javascript库中,最常用的一个功能就是根据css选择符选择与某个模式匹配的dom元素

selector api level1的核心是两个方法:

queryselector、queryselectorall

可以通过document及element的实例来调用他们。当使用element调用时,首先会在整个文章中查询,然后取出在element子节点中的元素返回。如果传入了不支持的选择符,会报错。

queryselectorall()方法返回的是一个nodelist的实例。能够调用这个方法的类除了document与element外,还包括documentfragment。

selector api level2规范为element类型新增了一个matchesselector()方法。这个方法接收一个参数:css选择符。如果元素与选择符匹配则返回true,否则返回false。

element.matchesselector(selector);            规范

element.msmatchesselector(selector);        ie

element.mozmatchesselector(selector);      ff

element.webkitmatchesselector(selector);   webkit

element traversal api

ie9及之前版本不会返回文本节点,而其他浏览器都会返回文本节点,导致了firstchild和childnodes的不一致。新出的traversal 规范为:

childelementcount

firstelementchild

lastelementchild

previouselementsibling

nextelementsibling

getelementsbyclassname() ,document或element类型可以使用,返回的是一个nodelist的实例。ie9+支持

calsslist属性

在操作类名时,需要通过classname属性添加删除。一般做法是为classname前后加上一个空格,对要增加或删除的类座同样处理,然后进行字符串的拼接,删除,替换工作;成功后删除classname首尾的空格。

html5中为所有元素新增的classlist属性。包含以下方法:

add、contains、remove、toggle

焦点管理

html5添加了辅助管理dom焦点的功能。document.activeelement属性,这个属性始终会引用dom中当前获得了焦点的元素。元素获取焦点的方式有页面加载、用户输入、在代码中调用了focus方法。

默认情况下,文档刚加载完时,document.activeelement中保存的是document.body元素的引用。文档加载期间,document.activeelement为null.

所有浏览器都支持该属性。

htmldocument的变化。

1、readystate属性

document.readystate属性,两个可能值:loading、complete

2、兼容模式:document.compatmode;正常模式“css1compat”混杂模式“backcompat”

3、head属性:head = document.head || document.getelementsbytagname("head")[0]   (webkit浏览器实现)

4、自定义数据属性

html5规定可以为元素添加非标准的属性,但要添加“data-”前缀。这些属性可以任意添加、随便命名,只要以data-开头即可。添加了自定义属性之后,可以通过元素的dataset属性来访问自定义属性的值。

5、标记与文本

innerhtml、outerhtml;innertext、outertext都是ie的自定义属性,后来innerhtml与outterhtml被纳入规范。

读模式下,innerhtml属性返回调用元素的所有子节点的html标记;写模式下,innerhtml会根据指定的值创建新的dom树,然后用这个dom树完全替换调用元素的所有子节点。

不要指望所有浏览器的innerhtml返回的值都相同。

使用innerhtml替换元素字节点时,要将当前元素子节点中的javascript属性和事件处理程序都删除,防止内存泄露。innerhtml中不要script和style标签,这两者不会生效。

并不是所有的浏览器都支持innerhtml,比如<html>、<head><style><title>,<table>相关标签。为这些元素设置innerhtml时,最好换一种方式:先清空元素,然后将innerhtml转化成dom节点,插入到元素中。

6、insertadjacenthtml()方法

两个参数:插入位置和要插入的html文本。插入位置:

beforebegin、afterbegin、beforeend、afterend这些值必须是小写形式

7、scrollntoview

element.scrollintoview()某元素滚动到视口。

专有扩展

文档模式:

<meta http-equiv="x-ua-compatible" content="ie=edge">使用最新版本渲染

children属性

这个属性是htmlcollection的实例,只包含元素总同样还是元素的子节点。ie8及更早之前的版本还会包含注释节点,ie9修复了这个问题。

contains()方法

判断一个元素是不是另一个元素的子节点。ie、ff、chrome都支持。

插入文本

innertext读取时,会按照由浅入深的顺序,将子文档树种的所有文本拼接起来。写入时,会删除所有子节点,插入包含相应文本值的文本节点。

ff不支持这个属性,但支持textcontent。

所以在设置innertext或者textcontent时,最好先清空子节点,然后使用document.createtextnode()创建文本节点插入。

该方法会对字符串中红的文本进行转义,比如:<p>test</p>

继续阅读