DOM2

选择符API

querySelector()

  • 方法接收一个css选择符,如果传入不被支持的选择符,会抛错,没有找到匹配的元素,返回null
var body = document.querySelector("body");
var myDiv = document.querySelector("#myDiv");

// 类为selected的第一个元素
var selected = document.querySelector(".selected");

// 类为button的第一个img元素
var img = document.querySelector("img.button");  

querySelectorAll()

  • 与selector()方法相同,但是这个方法返回的是NodeList的实例
var strongs = document.querySelectorAll("p strong");
var i ,len,strong;
for (var i = 0; len = strongs.lenght ; i < len; i ++){
    strong = strongs[i];
    strong.className = 'important';
}

matchesSelector()

  • 有兼容问题
function matchesSelector(ele,selector){
    if(ele.matchesSelector){
        return ele.matchesSelector(selector);
    }else if (ele.msMatchesSelector){
        return ele.msMathcesSelector(selector);
    }else if (ele.mozMatchesSelector){
        return ele.mozMatchesSelector(selector);
    }else if (ele.webkitMatchesSelector){
        return ele.webkitMatchesSelector(selector);
    }else{
        throw new Error('not supported')
    }
}

if (matchesSelector(document.body,'.box')){
    //
}

元素遍历

  • childElementCount : 返回子元素(不包括文本节点和注释)的个数
  • firstElementChild,firstChild : 指向第一个子元素
  • lastElementChild,lastChild : 指向最后一个元素
  • previousElementSibling,previousSibling : 指向同级的前一个元素
  • nextElementSibling,nextSibling : 指向同级的后一个元素

HTML5

与类相关的扩充

getElementsByClassName()
// 获取类名为red,box的元素,顺序无所谓
var aRedBox = document.getElementsByClassName("red box");

var aRed = document.getElementsByClassName("red");

classList属性
var classNames = div.className.split(/\s+/);
var pos = -1,
    i,
    len;
for ( i = 0; len = classNames.lenght; i < len; i ++){
    if (classNames[i] == "user"){
        pos = i;
        break;
    }
}
classNames.splice(i,1);
div.className = classNames.join(' ');
  • 新增属性
div.classList.remove('red');   // 删除red的类
div.classList.add('red');     //新增类
div.classList.toggle('red')    // 类的切换
div.classList.contains('red');     // 存在返回true,不存在返回false

焦点管理

  • document.activeElement DOM中当前获得焦点的元素
    • 文档加载期间,document.activeElement的值为null,加载完成,保存的是document.body
var button = document.getElementById('button');
button.focus();     // 获得焦点
console.log(document.activeElement == button);   // true
  • document.hasFocus() 确定文档是否获得了焦点
var button = document.getElementById('myButton');
button.focus();
console.log(document.hasFocus());   // true

HTMLDocument 变化

readyState 属性
  • 两种状态 loading 和 complete
  • 通过它实现一个指示文档已经加载完成的指示器,必须要借助一个onload事件处理程序设置一个标签
window.onload = function(){
     if (document.readyState == 'complete'){
            alert('afklsdf')
        }
    }
head属性
var head = document.head || document.getElementsByTagName('head')[0];

自定义数据属性

<div data-appId='123'>ksdk</div>

//js中的读取,设置
var oDiv = document.getElementsByTagName('div')[0];

//得到值
var AppID = oDiv.dataset.appId;

//设置值
oDiv.dataset.appId = '456';

if ( oDiv.dataset.myName){
    ....
}


//可以创建一个赋值
document.onclick = function(){
    oBox.dataset.name = 'dan';
}

插入标记

innerHTML 属性
  • 在读模式下,返回与调用的所有子节点(包括元素,注释,和文本节点)对应的html标签,但是不同的浏览器文本格式会不同
  • 在写模式下,innerHTML会根据指定的值创建新的DOM树
outerHTML 属性
<div id='box'>
    11111
</div>

var oBox = document.getElementById('box');
oBox.outerHTML = '<p>6666</p>'

//上面的代码与下面一样
var p = document.createElement('p');
p.appendChild(document.createTextNode('666'));
div.parentNode.replaceChild(p,div);
insertAdjacentHTML() 方法
oP.insertAdjacentHTML("beforebegin","<p>hello world</p>")  // 作为前一个同辈元素插入

oP.insertAdjacentHTML("afterbegin","<p>作为第一个子元素插入</p>")  // 作为第一个子元素插入

oP.insertAdjacentHTML("beforeend","<p>作为最后一个元素插入</p>")   // 作为最后一个子元素插入

oP.insertAdjacentHTML("afterend","<p>作为后一个同辈元素插入</p>")  // 作为后一个同辈元素插入
内存与性能问题
  • 使用innerHTML和outerHTML效率更高

  • 多次的频繁操作innerHTML效率很低,可以单独构建字符串,然后通过字符串的计算,最后统一给innerHTML。

contains方法

console.log(a.contains(b));  // true  , false
  • 判断b元素是不是a元素的后代,支持的浏览器:IE,ff,safari,opera,chrome

compareDocumentPosition()

  • 通过掩码表示两个节点间的关系
掩码 节点关系
1 无关
2 居前(指定节点在参考节点之前)
4 居后(指定节点在参考节点之后)
8 包含(给定节点是参考节点的祖先)
16 被包含(给定节点是参考节点的后代)
  • 多种浏览器兼容
function contains(refNode, otherNode){  
    if (typeof refNode.contains == "function" &&  
    (!client.engine.webkit || client.engine.webkit >= 522)){  // 检测当前浏览器所用的webkit的版本号
    return refNode.contains(otherNode);  
    } else if (typeof refNode.compareDocumentPosition == "function"){  
    return !!(refNode.compareDocumentPosition(otherNode) & 16);  
    } else {  
    var node = otherNode.parentNode;  
    do {  
    if (node === refNode){  
    return true;  
    } else {  
    node = node.parentNode;  
    }  
    } while (node !== null);  
    return false;  
    }  
}  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,941评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,397评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,345评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,851评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,868评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,688评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,414评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,319评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,775评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,945评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,096评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,789评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,437评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,993评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,107评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,308评论 3 372
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,037评论 2 355

推荐阅读更多精彩内容