《javascript高级程序设计》笔记(十一)

DOM扩展

对DOM的两个主要的扩展是Selectors API(选择符API)和 HTML5。

(一)选择符API

Selectors API Level 1 的核心是两个方法:querySelector()querySelectorAll()

在兼容的浏览器中,可以通过 Document 及Element类型的实例调用它们。目前已完全支持 Selectors API Level 1的浏览器有 IE 8+、Firefox 3.5+ 、Safari 3.1+、Chrome和Opera 10+。

1.querySelector()  接收一个CSS选择符,返回与该模式匹配的第一个元素,没有则返回null。

Document类型调用时会在文档元素范围内查找,Element类型调用时只会在该元素后代元素范围内查找

            //取得body元素
            var body = document.querySelector("body");

            //取得ID为myDiv的元素
            var myDiv = document.querySelector("#myDiv");

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

            //取得类为botton的第一个图像元素
            var img = document.body.querySelector("img.button");

2.querySelectorAll() 返回的是所以匹配的元素,返回的是一个NodeList的实例。

要得到每一个返回的元素,可以使用item()方法或方括号语法。

3.matchesSelector()  接收一个CSS选择符,如果调用元素与该选择符匹配,则返回true,否则返回false。

在取得某个元素引用时,使用这个方法能方便检测它是否会被querySelector()和querySelectorAll()方法返回。

最后编一个包装函数来用这个方法。

        function matchesSelector(element, selector){
            if (element.matchesSelector){
                return element.matchesSelector(selector);
            } else if (element.msMatchesSelector){//IE9+
                return element.msMatchesSelector(selector);
            } else if (element.mozMatchesSelector){//Firefox3.6+
                return element.mozMatchesSelector(selector);
            } else if (element.webkitMatchesSelector){
                return element.webkitMatchesSelector(selector);
            } else {
                throw new Error("Not supported.");
            }
        }

(二)元素遍历

Element Traversal API

childElementCount:返回子元素节点个数

firstElementChild:指向第一个子元素

lastElementChild:指向最后一个子元素

previousElementSibling:指向前一个同辈元素

nextElementSibling:指向后一个同辈元素

IE9+ Firefox 3.5+ Sarafi 4+ Chrome 和Opera10+

(三)HTML5

1.与类相关的扩充

①getElementsByClassName() :接收一个参数,包含一个或多个类的字符串,返回带有指定类的所有元素的NodeList。

在document对象调用返回与类名相同的所有元素,在元素上调用只返回后代元素里匹配的元素,但返回的是NodeList对象,与使用getElementByTagName()和其他返回NodeList的DOM方法都有同样的问题。

IE9+ Firefox 3+ Sarafi 3.1+ Chrome 和Opera 9.5+

2.classList属性

//删除"user"类

//取得类名字符串并拆分成数组
var className = div.className.split(/\s+/);

//找到要删的类名
var pos = -1,  //没找到就返回-1,即不删除
    i,
    len;
for (i=0, len=classNames.length; i < len; i++) {
     if (classNames[i] == "user")
        pos = i;
        break;
}

//删除类名
className.splice(i,1);

//把剩下的类名拼成字符串并重新设置
div.className = className.join(" ");

classList属性是新集合类型DOMTokenList的实例。

方法:add(value) :添加

contains(value):是否存在给定值

remove(value):删除

toggle(value):如果存在给定值就删除,没有则添加

IE10+ Firefox 3.6+ Chrome

2.焦点管理

document.activeElement属性  始终引用DOM当前获得了焦点的元素。

document.hasFocus()方法 :确定文档是否获得焦点。

元素获得焦点的方法有页面加载、用户输入(通常是通过按Tab键)和在代码调用focus()方法。

文档加载完成时document.activeElement保存的是document.body元素,在加载期间为null。

IE 4+ Firefox 3+、Safari 4+、Chrome和Opera 8+。

3.HTMLDocument的变化

①readyState属性

有两个值:loading正在加载文档 complete已经加载完文档

用来实现一个指示文档已经加载完成的指示器。

②兼容模式

compatMode 属性  告诉开发人员浏览器用了哪种渲染模式  标准模式document.compatMode的值为"CSS1Compat",混杂模式下为"BackCompat"。

③head属性

var head = document.head||document.getElementByTagName("head")[0];

4.字符集属性

charset属性  文档中实际使用的字符集,默认为"UTF-16"。

defaultCharset属性 根据默认浏览器及操作系统的设置,当前文档默认的字符集应该是什么。

5.自定义数据属性

HTML5规定非标准的属性要添加前缀data-,目的是为元素提供与渲染无关的信息,或提供语义信息。

dataset属性访问自定义属性的值,每个data-name形式的属性都会有一个对象的属性,只不过属性名没有前缀。

IE11 FIrefox 6+ Chrome

6.插入标记

①innerHTML属性

在读模式下返回调用模式的所有子节点的HTML标记。

在写模式下创建新的DOM树并将它完全替换调用元素原先的所有子节点。

不同浏览器返回的文本格式不同,IE低版本、Opera所有标签大写。

在写模式下如果值包含HTML标签会根据浏览器转换为元素。

  document.getElementById("hehe").innerHTML="Hello & welcome,<b>\"reader\"!</b>";
  alert(document.getElementById("hehe").innerHTML);

大多数浏览器innerHTML插入<script>不会执行脚本,只有IE8及之前版本可以,但需要为<script>指定defer属性,并让<script>元素位于“有作用域的元素”后。

div.innerHTML = "<input type=\"hidden\"><script deffer>alert(‘hi‘);</script>";

大多数浏览器支持这样插入<style>元素到innerHTML,但IE8和之前的版本也有上面的问题。

div.innerHTML = "<style type=\"text/css\">body {background-color: red;}</script>"

不支持innerHTML的元素有<col> <colgroup> <frameset> <head> <html> <style> <table> <tbody> <thead> <tfoot> <tr>,IE8及更早版本不支持<title>。

②outerHTML属性

在读模式下返回调用它的元素及所有子节点的HTML标签。

在写模式下根据指定的HTM字符串创建新的DOM子树并用它完全替换调用元素。

Firefox 7 及之前版本都不支持outerHTML。

③insertAdjacentHTML()方法

接收两个参数:插入位置和插入的HTML文本,第一个参数必须是这些值之一:beforebegin afterbegin beforeend afterend。

IE Firefox 8+ Sarafi Opera Chrome

④内存与性能问题

//每次循环都要设置一次innerHTML,还要从innerHTML读取一次数据
for  (var i=0,len=values.length;i<len;i++){
     ul.innerHTML += "<li>" + value[i] + "</li> ";
}

//单独构建字符串,
var itemHTML = "";
for  (var i=0,len=values.length;i<len;i++){
      itemsHTML += "<li>" + value[i] + "</li> ";
}
      ul.innerHTML = itemsHTML;

7.scollIntoview()方法

通过滚动浏览器窗口或某个容器元素,调用元素就可以出现在视口中。如果传入true或不传入参数,窗口滚动之后会让调用元素的顶部与视口顶部尽可能平齐。传入false调用元素会尽可能全部出现在视口。

(四)专有扩展

1.文档模式

documentMode

2.children属性

只包含元素中同样还是元素的子节点,与childNodes没什么区别。

IE5 Firefox 3.5 Safari 3 Opera8,IE9之后只返回元素节点

3.containss()方法

调用的元素是祖先节点,接收一个参数:后代节点。如果被检测的节点是后代节点,则返回true。

IE Firefox 9+ Sarafi Opera Chrome

        //通用的containers函数
        function contains(refNode, otherNode){
            if (typeof refNode.contains == "function" &&
                    (!client.engine.webkit || client.engine.webkit >= 522)){
                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;
            }
        }

4.插入文本

①innerText属性

读取值时会安装由浅入深的顺序将子文档树的所有文本拼接。

写入值时会删除所有子节点,插入包含相应文本值的文本节点、

将innerText设置为等于InnerText可以去掉所有HTML标签。

IE4+ Sarafi3+ Opera 8+ Chrome

innerText会忽略行内的样式和脚本,textContent像返回其他文本一样返回行内的样式和脚本代码。

②outerText属性

5.滚动

scollIntoViewIfNeeded

scollByLines

ScollBypages

时间: 2024-12-29 06:48:37

《javascript高级程序设计》笔记(十一)的相关文章

javascript高级程序设计 第十一章--DOM扩展

javascript高级程序设计 第十一章--DOM扩展DOM最主要的扩展就是选择符API.HTML5和Element Traversal Selectors API:定义了两个方法 querySelector() 和 querySelectorAll(),能够基于CSS选择符从DOM中取得元素.querySelector()方法接收一个CSS选择符,返回该模式匹配的第一个元素,querySelectorAll()接收的参数一样,但是返回NodeList实例: matchesSelector()

javascript高级程序设计——笔记

javascript高级程序设计--笔记 基本概念 基本数据类型包括Undefined/Null/Boolean/Number和String 无须指定函数的返回值,实际上,未指定返回值的函数返回的是一个特殊的undefined值 变量.作用域和内存问题 基本类型值在内存中占据固定大小的空间,因此保存在栈内存中 引用类型的值是对象,保存在堆内存中 确定一个值是哪种基本类型用typeof,确定一个值是哪种引用用instanceof 所有变量都存在于一个执行环境当中,这个执行环境决定了变量的生命周期,

javascript高级程序设计笔记1

最近在看javascript高级程序设计,看之前觉得自己的js学得还不错,然后,看了没几页就觉得自己好像没有学过一样,这主要写写我以前不完全了解的一些知识. 首先是关于基本数据类型的,从Number开始,以前经常用parseInt来转换数值,看过书才知道,这个函数的本意是专门用于把字符串转换成数值,而且以前也不知道它具体是怎么一个转换规则.先来看看Number()函数的转换规则: 1.如果是Boolean 值,true 和false 将分别被转换为1 和0.2.如果是数字值,只是简单的传入和返回

javascript高级程序设计笔记(第5章 引用类型)

1.Object类型 两种方式定义:对象字面量.new 两种方式访问:括号.点 2.Array类型 2.1  定义方式:new Array.数组字面量 2.2  lenght属性:可以利用它方便的想数组末尾添加元素 2.3  检测数组 instanceof isArray()方法  2.4  toString().soLocaleString().valueOf().join()方法 2.5.栈方法   push()方法:逐个添加到数组末尾,并返回修改后的数组长度 pop()方法:返回数组的最后

【javascript高级程序设计笔记】第六章OOP

忙了一段时间,加了将近一个月的班. 书也落下没看,上次看到第七章(这部分笔记大概还是9月份的吧),偶尔看到很吃力.看的速度慢下来. 学习就是一个慢慢积累慢慢沉淀的过程.看书时没有明显觉得提升.但在看完书后近段时间工作中写代码,明显感觉效率还是有提升,基础知识牢固了. 这本书是第二次看,这次很认真的遍读和做笔记,笔记的文字均是自己边看边敲的,这样才更好的真正的吸收到一部分吧! 这些天在看web响应式设计:HTML5和CSS3实战 第6章 面向对像的程序设计 6.1.1属性类型 ECMAScript

JavaScript高级程序设计笔记之面向对象

说起面向对象,大部分程序员首先会想到 类 .通过类可以创建许多具有共同属性以及方法的实例或者说对象.但是JavaScript并没有类的概念,而且在JavaScript中几乎一切皆对象,问题来了,JavaScript中如何面向对象? JavaScript中将对象定义为:一组无序的 键值对的集合,属性以及方法的名称就是键,键的值可以是任何类型(字符串,数字,函数--) 在JavaScript中,所有对象继承自Object,所有对象继承自Object,所有对象继承自Object! 创建 1  简单创建

javascript高级程序设计笔记(第7章 函数表达式)

7.5 小结 在JavaScript 编程中,函数表达式是一种非常有用的技术.使用函数表达式可以无须对函数命名,从而实现动态编程.匿名函数,也称为拉姆达函数,是一种使用JavaScript 函数的强大方式.以下总结了函数表达式的特点.? 函数表达式不同于函数声明.函数声明要求有名字,但函数表达式不需要.没有名字的函数表达式也叫做匿名函数.? 在无法确定如何引用函数的情况下,递归函数就会变得比较复杂:? 递归函数应该始终使用arguments.callee 来递归地调用自身,不要使用函数名——函数

【javascript高级程序设计笔记】第一章与第三章

第1章 javascript简介 1.2Javascript实现 一个完整的javascript实现由下列三个不同的部分组成 核心(ECMAScript) 提供核心语言功能 文档对象模型(DOM) 提供访问和操作网页内容的方法和接口 浏览器对象模型(BOM)提供与浏览器交互的方法和接口 ECMAScript 它规定了这门语言的下列组成部分: 语法  类型  语句  关键字 保留字 操作符 对象 ECMA-262第5版,发布于2009年. 文档对象模型(DOM) Document Object M

JavaScript高级程序设计笔记

1.1 JavaScript简史 <script> async/defer可以控制js加载顺序 把js文件放在页面底部,加快页面打开速度 3 基本概念 语法 数据类型 流控制语句 理解函数 3.4 数据类型 ECMAScript中定义了六种数据类型:Underfined.Null.Boolean.Number.String.Object 使用typeof关键字来检测类型 //Boolean()转换 var bool1 = Boolean(true); var bool2 = Boolean(&

javascript高级程序设计--笔记01

概述 JavaScript的实现包含三个部分: 1  核心(ECMAScript)   提供核心语言功能 2  文档对象模型(DOM)  一套提供了访问以及操作网页内容的API 3  浏览器对象模型(BOM)  一套提供了与浏览器交互的API ECMAScript仅仅定义了这门语言的基础,如定义了:语法.类型.语句.关键字等,实际上这门语言本身不包含输入输出定义. 而现实中,ECMAScript大多借用了某些宿主环境(如web浏览器,Node,Adobe Flash)来实现丰富的功能,这些宿主环