《JavaScript高级程序设计》Chapter 11 DOM 扩展

Chapter 11 DOM 扩展

选择符 API (Selectors API)

  1. 目的:让浏览器原生支持 CSS 查询。

  2. Selectors API Level 1 的核心是两个方法:querySelector() �������和 querySelectorAll() 。在兼容的浏览器中,可以使用 Document 及 Element 类型的实例调用它们。

  3. querySelector

    • 接收一个 CSS 选择符。
    • 返回与该模式匹配的第一个元素,没有则返回 null 。
    • 通过 Document 类型调用 querySelector 时,会在文档元素的范围内查找元素;通过 Element 类型调用 querySelector 时,只会在该元素后代元素的范围内查找匹配的元素。
  4. querySelectorAll

    • 接收一个 CSS 选择符。
    • 返回所有与该模式匹配的元素(一个带有属性和方法的 NodeList ),没有则返回一个空的 NodeList 。
  5. matchesSelector

    • Selectors API Level 2 规范为 Element 类型熙增了一个方法 matchesSelector() 。
    • 接收一个参数,即 CSS 选择符。
    • 返回一个 bool 值,如果调用元素与该选择符匹配,返回 true ,否则返回 false 。
    • 浏览器使用不同的方法替代实现该方法:
    function matchesSelector(element, selector) {
        if (element.matchesSelector) {
            return element.matchesSelector(selector);
        } else if (element.msMatchesSelector) {
            return element.msMatchesSelector(selector);
        } else if (element.mozMatchesSelector) {
            return element.mozMatchesSelector(selector);
        } else {
            throw new Error("Not Supported");
        }
    }
    

元素遍历

  • 对于元素间的空格,IE9 及之前的版本不会返回文本节点,而其他浏览器都会返回文本节点,因此导致了在使用 childNodes 和 fristChild 等属性时的行为不一致。为了弥补差异,Emelent Traversal 规范定义了一组新属性。
    • childElementCount: 返回子元素(不包括文本节点和注释)的个数。
    • firstElementChild: 指向第一个子元素;firstChild 的元素版。
    • lastElementChild: 指向最后一个子元素;lastChild 的元素版。
    • previousElementSibling: 指向前一个同辈元素;previousSibling 的元素版。
    • nextElementSibling: 指向后一个同辈元素;nextSibling 的元素版。

HTML 5

  1. 与类相关的扩充:HTML 5 为了简化 CSS 类的用法,新增了很多API。
    • getElementsByClassName 可以通过 document 对象及所有 HTML 元素调用该方法;返回带有指定类型的 NodeList,所以有性能问题。
  2. classList 属性
    • className 属性是一个字符串,修改 className 要设置整个字符串的值。
    • HTML 5 新增了一种操作类名的方式:为元素添加 classList 属性。这个属性是新集合类型 DOMTokenList 的实例。
    • DOMTokenList
      • length 属性:表示包含元素个数
      • item() 方法(支持方括号语法):取得元素
      • add(value) :将给定的字符串值添加到列表中。
      • contains(value):列表中是否存在给定值 (true / false)
      • remove(value):从列表中删除给定字符串
      • toggle(value):如果列表中存在给定值,删除它;不存在给定值,添加它。
  3. 焦点管理
    • document.activeElement 属性:引用 DOM 中当前获得焦点的元素。
      • 页面加载
      • 用户输入(通常是通过按 Tab)
      • 在代码中调用 focus 方法
    • document.hasFocus() 用于确定文档是否获得焦点。如果获得焦点,说明文档正在与用户交互。
  4. HTML Document 的变化
    • readyState 属性
      • loading 正在加载文档
      • complete 文档加载完毕
    • 兼容模式
      • document.compatMode 属性
        • 标准模式下:"CSS1Compat"
        • 混杂模式下:"BackCompat"
    • head 属性
      • document.head 引用文档的 head 元素
  5. 字符集属性
    • charset 属性:表示文档中实际使用的字符集,默认值 "UTF-16"
      • 可以通过 <meta> 元素、响应头部或直接设置 charset 修改。
    • defaultCharset 属性:表示根据默认浏览器及操作系统设置,当前文档默认的字符集应该是什么。如果文档没有使用默认字符集,那 charset 和 defaultCharset 属性的值可能不同。
  6. 自定义数据属性
    • HTML 5 规定可以为元素添加非标准属性,前提是要添加前缀 data-,目的是为元素提供与渲染无关的信息,或者语义信息。
    • 添加自定义属性后,可以通过元素的 dataset 属性来访问自定义元素值。
    • dataset 属性的值是 DOMStringMap 的一个实例,也就是一个名值对的映射。在这个映射中,每一个 data-name 形式的属性都会去掉 data- 前缀并对应一个值。
  7. 插入标记
    • innerHTML 属性
      • 读模式下,innerHTML 属性返回与调用元素的所有子节点(包括元素、注释和文本节点)对应的 HTML 标记。
      • 写模式下,innerHTML 会根据指定的值创建新的 DOM 树,然后用这个 DOM 树完全替换调用元素原先的所有子节点。
      • 在大多数浏览器中,使用 innerHTML 插入 <script> 元素并不会执行其中的脚本。
      • 不支持 innerHTML 属性的元素: <col> <colgroup> <frameset> <head> <html> <style> <table> <tbody> <thead> <tfoot> <tr> (在 IE8- 的版本中,<title> 也没有 innerHTML 属性。)
    • outerHTML 属性
      • 在读模式下,outerHTML 返回调用它的元素所有子节点的 HTML 标签。在写模式下,outerHTML 会根据指定的 HTML 字符串创建新的 DOM 子树,然后用这个 DOM 子树完全替换调用元素。
    • insertAdjacentHTML() 方法
      • 接收两个参数:插入位置和要插入的 HTML 文本。
      • 第一个参数:
        • "beforebegin":在当前元素之前插入一个紧邻的同辈元素
        • "afterbegin":在当前元素之下插入一个新的子元素或在第一个子元素之前再插入新的子元素
        • "beforeend":在当前元素之下插入一个新的子元素或在最后一个子元素之后再插入新的子元素
        • "afterend":在当前元素之后插入一个紧邻的同辈元素
    • 内存与性能问题
      • 在使用 innerHTML outerHTML 和 insertAdjacentHTML 时,最好手工删除要被替换的元素的所有事件处理程序和 JavaScript 对象属性。
      • 合理使用 innerHTML 和 outerHTML,减少使用次数。
  8. scrollIntoView() 方法
    • 可以在所有 HTML 元素上调用,通过滚动浏览器窗口或某个容器元素,调用元素就可以出现在视口中。如果给这个方法传入 true 参数或不传入参数,那么窗口滚动之后会让调用元素的顶部与视口顶部尽可能平齐。如果传入 false 参数,调用元素会尽可能全部出现在窗口中,不过顶部不一定平齐。

专有扩展

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

推荐阅读更多精彩内容

  • DOM 变化 如何确认浏览器是否支持 DOM 2 和 DOM 3 新增的模块:var supportsDOM2Co...
    云之外阅读 461评论 0 0
  • 节点层次 DOM 可以将任何 HTML 和 XML 文档描绘成一个由多层节点构成的结构。节点分为几种不同的类型,每...
    云之外阅读 527评论 0 1
  • 【读经】 撒下1章 【金句】 而且悲哀哭号,禁食到晚上,是因扫罗和他儿子约拿单,并耶和华的民以色列家的人,倒在刀下...
    chanor阅读 431评论 0 0
  • 一 我以为我懂她, 我以为她也懂我, 仅仅只是以为罢了。 二 点了一杯暖心恋人 插了两根吸管 终究一人喝完 三 我...
    修伊洛阅读 374评论 3 1
  • 之前提到重拾六弦吉他后,想入把小马丁。所以,在看了大半年的马丁尤克里里之后,到头来,还就真买了把马丁的旅行吉他。 ...
    ENC阅读 1,694评论 2 8