$11 DOM扩展

1. 选择符API

根据CSS选择符选择与某个模式匹配的DOM元素。
Selectors API的核心方法:querySelector()和querySelectorAll(),可以通过document和element类型的实例调用它们。

1.1 querySelector()方法:

接收CSS选择符,返回匹配的第一个元素,如果没有找到,返回null。

var myDiv=document.querySelector("#myDiv");

1.2 querySelectAll()方法

返回所有匹配的元素,返回结果为NodeList实例。

    <div id="1"></div>
    <div id="2"></div>
    <div id="3"></div>
var divs=document.querySelectorAll("div");
console.log(divs);
Paste_Image.png
console.log(divs.item(0)==divs[0])//true

2. 元素遍历

对于元素之间的空格,IE不会返回文本节点,但是非IE会返回文本节点,这样在使用firstChild等属性时导致不一致。
为了解决该问题,定义了新的属性:

childElementCount: 返回子元素(不包括文本节点和注释)个数
firstElementChild: 指向第一个子元素   ;firstChild的元素版。
lastElementChild: 指向最后一个子元素;lastChild的元素版。
previousElementSibling: 指向前一个同辈元素;previousChild的元素版。
nextElementSibling:指向后一个同辈元素;nextChild的元素版。

遍历某元素的子元素个数:

    var i=1,len;
    var child=document.body.firstElementChild;
    while(child!=document.body.lastElementChild){
        if(child.nodeType==1){
            i+=1;
        }
        child=child.nextElementSibling;
    }

3. HTML5

HTML5规范围绕如何使用新增标记定义了大量JS API。其中一些与DOM重叠,定义了浏览器需要支持的DOM扩展。

3.1 与类相关的扩充:

A. getElementByClassName()方法
B. classList属性:便于对类名进行操作。
<div class="bd user disabled"></div>
var div=document.getElementsByTagName("div")[0];
var classlist=div.classList;
console.log(classlist)
Paste_Image.png

方法:

add(value):添加属性
contain(value):检查是否存在某属性,返回布尔值
remove(value):删除属性
toggle(value):如果存在,删除,不存在,添加。
var div=document.getElementsByTagName("div")[0];
var classlist=div.classList;
classlist.add("new");
classlist.remove("bd");
classlist.toggle("disabled");
console.log(classlist)
Paste_Image.png

3.2 焦点管理:

A. document.activeElement属性

引用DOM中当前获取焦点的元素。元素获得焦点的方法:页面加载、用户输入、代码中调用focus()方法。

    var button=document.getElementsByTagName("button")[0];
    button.focus();
    console.log(document.activeElement==button);//true
B. document.hasFocus属性

检查文档是否获得了焦点,返回值为布尔值,该值可以确定用户是否在与页面交互。

    var button=document.getElementsByTagName("button")[0];
    button.focus();
    alert(document.hasFocus());//true

3.3 HTMLDocument的变化

A. readyState属性

检查文档是否加载完毕,值:loading(正在加载),complete(加载完毕)

        if(document.readyState=="complete"){            
        }
B. 兼容模式:compatMode属性

检查浏览器渲染页面的模式是标准模式还是混杂模式。
值为CSS1Compat为标准模式,值为BackCompat为混杂模式。

    if(document.compatMode=="CSS1Compat"){
        alert("标准模式")
    }
    else {
        alert("混杂模式")
    }
C. head属性
console.log(document.head==document.getElementsByTagName("head")[0]);//true

3.4 字符集属性

A. document.charset返回当前文档的字符集。
B. document.defaultCharset返回默认的字符集。

3.5 自定义数据属性

添加非标准属性,需要加前缀data-,这些属性可以通过dataset属性进行访问。
<div id="myDiv" data-dd="my" data-aa="your"></div>`
       ` var div=document.getElementById("myDiv");
        console.log(div.dataset)
Paste_Image.png

3.6 插入标记

A. innerHTML属性

返回调用元素的所有子节点对应的HTML标记。在写模式下,会替换原有的子节点。

<div id="myDiv">
  <p>哈哈</p>
</div>
var div=document.getElementById("myDiv");
console.log(div.innerHTML)// <p>哈哈</p>
div.innerHTML="<p>嘻嘻</p>"
console.log(div.innerHTML)//<p>嘻嘻</p>
B. outerHTML属性

读模式:返回该元素以及其子元素

        var div=document.getElementById("myDiv");
        console.log(div.outerHTML)
Paste_Image.png

写模式:替换该元素

       var div=document.getElementById("myDiv");
       div.outerHTML="<p>hh</p>"//div元素将不存在
C. insertAdjacentHTML()方法

与前两种方式相比,加入了位置插入,可以作为同辈元素或者子元素插入。
第一个参数的值:

beforebegin:前一个同辈元素
afterbegin:第一个子元素
beforeend:最后一个子元素
afterend:后一个同辈元素
var div=document.getElementById("myDiv");
div.insertAdjacentHTML("beforeend","<p>im</p>")
Paste_Image.png
D. 内存与性能问题

如果使用上述替换子节点的方法,如果元素被删除,但是该元素存在事件处理程序,该元素与事件的绑定关系会存在于内存中。因此最好手工删除事件。并且需要控制innerHTML和outerHTML的次数,因为它们会创建HTML解析器,创建和销毁HTML解析器会导致性能损失。

4. 专有扩展

4.1 children属性:

只包含元素中为元素的子节点

4.2 contains()方法

用处:检查某个节点是否是另一个节点的后代

        var div=document.getElementById("myDiv");
        console.log(document.documentElement.contains(div));//div是html元素的后代

4.3 插入文本

A. innerText属性

读:返回所有文本内容

    <div id="myDiv">
        <p>哈哈</p>
        <p>hh</p>
    </div>
var div=document.getElementById("myDiv");
console.log(div.innerText);//哈哈  hh

写:将其子节点进行替换

        var div=document.getElementById("myDiv");
        div.innerText="替换";
        console.log(div);
Paste_Image.png

4.4 outerText属性

作用范围扩大到调用节点,当读时与innerText相同,写时,会替换整个元素。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,717评论 2 17
  • 本章内容 理解 Selectors API 使用 HTML5 DOM 扩展 了解专有的 DOM 扩展 对 DOM ...
    闷油瓶小张阅读 570评论 0 0
  • Chapter 11 DOM 扩展 选择符 API (Selectors API) 目的:让浏览器原生支持 CSS...
    云之外阅读 193评论 0 0
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,054评论 1 10
  • 一. 基础属性 tableView style 只能在初始化中设置 @property(nonatomic, r...
    erbai阅读 1,404评论 1 3