网盘地址 提取码:vh81

笔记

第二章

2.1script标签

  • <script>元素属性:async、charset、defer、language、src、type
    async和defer只对外部脚本有效,language已废弃,type默认为“text/javascript”
  • defer属性可以让脚本在文档完全呈现之后再执行,且按照指定的顺序执行
  • 设置了async的脚本文件不一定按照书写顺序执行,所以文件间应该互不依赖;异步脚本会在页面的load事件前执行,但可能会在DOMContentLoaded事件触发前或后执行。支持异步脚本的浏览器有Firefox3.6,Safari5和Chrome。
  • 内嵌时,代码中任何地方不能出现"</script">字符串,否则会认为是结束,可以将字符串分隔两部分解决,如:alert<\/script>

2.3文档模式

  • 混杂模式和标准模式:两种模式主要影响CSS内容的呈现,某些情况也会影响到JavaScript的解释执行

2.4noscript标签

  • 浏览器不支持脚本或禁用脚本

第三章

3.1语法

  • 标识符:字母,下划线或美元开头,其他可以字母,下划线,美元或数字;字母也可以包含拓展的ASCII或Unicode字母字符,但不推荐
  • 严格模式:”use strict“

3.4数据类型

  • typeof:undefined、boolean、string、number、object、function
    safari5及之前版本和chrome7及之前版本对正则表达式用typeof会返回function,其他返回object
  • typeof对未初始化和未声明变量都返回undefined
  • undefined的值派生自null
  • Boolean()
  • 浮点值的内存空间是整数的两倍,所以ECMAscript会在不失时机地把浮点数转化为整数
  • Number.MAX_VALUE ,Number.MIN_VALUE ,Number.NEGATIVE_INFINITY ,Number.POSITIVE_INFINITY ,Infinity ,isFinite()
  • NaN:任何操作返回NaN,与任何值不等,包括自身
  • isNaN():适用对象,首先调用valueOf(),测试返回值是否可以转化为数值,如果不行,就基于返回值调用toString()方法,再测试返回值
  • Number()任何数据类型,parseInt(),parseFloat()适用字符串;一元加操作符与Number()函数相同,可区分十六进制数转化为十进制,空字符串为0,parseInt()空字符串为NaN,可传入第二个参数表示几进制;parseFloat()只解析十进制,如果是整数的数,会返回整数,可识别”3.125e7“
  • 字符串:
    1、特点:不可变,每次改变都会销毁原来返回新的
    2、toString(),字符串也有这个方法,但是null和undefined没有,可以穿参数,参数为基数,默认为10
    3、String(),如果有toString方法,调用它,没有,如果是null,返回”null“,是undefined,返回”undefined"
  • object
    1、属性和方法:Constructor;hasOwnProperty检查属性是否在当前对象中,参数要以字符串形式传入;isPrototypeOf检查传入对象是否是另一个对象的原型;propertyIsEnumerable,检查给定属性能否用for-in语句枚举,参数必须以字符串形式传入
    ;toLocaleString(),返回对象的字符串表述,该字符串与执行环境的地区对应;toString()返回对象的字符串表示;valueOf()返回对象的字符串、数值或布尔表示,通常与toString()返回值相同
  • ++,–除了可以作用在数字上,也可以作用在其他数据类型上,P57,需要先设定变量赋值为其他数据类型,然后再++或–,字符串时,字符串需要就是数值字符串
  • 一元加减操作符作用在非数值类型字符串
  • 位操作符,NaN和Infinity进行操作时都会被当成0,作用于非数值类型,会先Number()转换
    1、按位非~:操作数负值减一,比普通表达式快,因为是最底层操作
    2、按位与& 3、按位或| 4、按位异或^ 5、左移<<,不会影响符号位 6、有符号右移>>,符号位填充空缺 7、无符号右移>>>
  • 逻辑
    1、逻辑非 2、逻辑与,在操作数不是布尔值的情况下返回值就不一定是布尔值
  • 乘法,除法,求模
  • 加操作符:“sad”+10+5 -> sad105
  • 关系操作符P69
  • 逗号操作符
  • for-in循环对象如果为null或undefined就不会执行循坏体
  • lable标签
  • with语句,严格模式下不允许使用,大量使用会导致性能下降
  • switch语句如果缺少break,就会继续执行下一条case,default不用break,case的值不一定要常量,可以是变量或表达式,switch在进行比较时使用的是全等操作
  • return可以不带返回值,返回的是undefined
  • arguments与命名参数值保持同步

第四章

  • 不能给基本类型的值添加属性,如:var name="tom" ;tom.age=12 //undefined
  • 任何在内部应用call方法的对象在用typeof时返回function,不同浏览器对正则返回有所差别,确定值是哪种引用类型用instanceof
  • 延长作用域:try-catch,with
  • 垃圾收集:标记清除,引用计数(循环引用),性能问题(垃圾回收时间间隔)

第五章

数组

  • 通过对象字面量定义对象时,实际上不会调用object的构造函数
  • new Array()传入负数报错,也可不加new,在使用字面量表示法时不会调用Array构造函数,var arr = [1,2,]在不同浏览器中会有不同的项
  • 数组的length属性可以改变数组长度
  • 检测数组:
    instanceof问题:如果网页包含多个框架就存在多个全局执行环境,导致错误。
    isArray检测:IE9+,firefox4+,Safari5+,opera10.5+和chrome
  • 转换数组:toString()返回字符串,valueOf()返回数组
  • join()不传入值或undefined,用逗号分隔,IE7及更早会用"undefined“分隔,如果数组某项为null或undefined,使用join,toString,valueOf,toLocaleString会以空字符表示
  • 栈方法:push()返回长度,pop()返回弹出项
  • 队列方法:shift()返回第一项,unshift()返回长度,IE8及以下对unshift返回值有所不同
  • 重排序方法:
    1、sort()方法:每项toString()再进行比较,就算本来是数字;接受一个比较函数做参数,如果第一个参数应在第二个参数前就返回负数,相等0,之后正数;返回排序后数组,比较函数的参数为数组的两个值P132
    2、reverse(),返回排序后数组
  • 操作方法:
    1、concat():先创建副本再操作,不影响原数组
    2、slice():不影响原数组,不包含结束位置的项,结束位置小于初始位置返回空数组,参数为负数加上长度slice(-2,-1)等于slice(3,4)
    3、splice()返回从原数组中删除的项
  • 位置方法:indexOf(),lastIndexOf(),使用全等查找,没找到返回-1,找到返回位置;支持浏览器IE9+,Firefox2+,Safari3+,Opera9.5+和Chrome
  • 迭代方法:(val,index,arr)=>{}
    1、every(),函数对每一项都返回true,那就返回true
    2、filter(),返回该函数返回true的项组成的数组
    3、forEach(),对数组每项运行函数,没有返回值
    4、map(),对函数每项运行函数,返回结果数组
    5、some(),任意一项返回true,返回true
    以上方法都不会修改数组中的包含的值,支持浏览器IE9+,Firefox2+,Safari3+,Opera9.5+和Chrome
  • 缩小方法:迭代所有项,返回一个值
    1、reduce(),第一个值,当前值,当前下标,数组
    2、reduceRight()最后一项开始迭代
    支持浏览器IE9+,Firefox3+,Safari4+,Opera10.5+和Chrome

Date类型

1、Date.parse,Date.UTC;将表示日期的字符串传给构造函数也会调用Date.parse;UTC接受年月日…,其中月份基于0开始,只有年和月是必须的,构造函数传入第一个参数是数值时,会调用Date.UTC,但是日期和时间是基于本地时区创建的

2、Date.now(),支持浏览器IE9+,Firefox3+,Safari3+,Opera10.5+和Chrome,不支持的浏览器用+new Date()也可达到同样的目的

3、继承的方法,toLocaleString(),toString(),不同浏览器显示格式不同,valueOf()返回毫秒数,可以用比较操作符(大于或小于)来比较日期

4、日期格式化方法:toDateString,toTimeString,toLocaleDateString,toLocaleTimeString,toUTCString

5、日期方法

javascript 高级程序设计 英文 javascript高级程序设计下载_css


javascript 高级程序设计 英文 javascript高级程序设计下载_html_02


javascript 高级程序设计 英文 javascript高级程序设计下载_javascript_03

RegExp类型:

1、var exp = / pattern / flags 2、flags:g全局,i不区分大小写,m多行模式

3、元字符需要转义,传入RegExp构造函数的两个值需要为字符串

4、实例属性:global,ignoreCase,lastIndex,multiline,source

5、实例方法

exec(),接受要应用的字符串,返回数组,包含额外两个属性,index和input,数组第一项是匹配字符串,其他为捕获的字符串,全局模式的设置与否会改变多次测试的结果P126

test(),

toString和toLocaleString方法都会返回正则表达式的字面量,valueOf返回正则表达式本身

6、构造函数属性,Opera不支持短属性名,短属性名需要用方括号访问,九个用于存储捕获组的属性RegExp.$1等

javascript 高级程序设计 英文 javascript高级程序设计下载_html_04

Function类型

1、函数是对象,函数名是指针
var sum = new Function("num1","num2","return num1+num2; );//不推荐,会导致两次解析

2、没有重载
3、alert(sum(10,10));function sum(n1,n2){return n1+n2};可以正常显示20
4、函数内部属性:arguments,this,caller,arguments.callee。当全局环境中调用,caller的值为null,严格模式下callee和caller会有错误
5、函数属性和方法:length函数希望接受的命名参数的个数
6、严格模式下this值在未指定环境下调用,不会转为window,是undefined
7、call(),apply(),bind(),bind支持的浏览器IE9+,Firefox4+,Safari5.1+,Opera12+和Chrome
8、toLocaleString,toString,valueOf返回函数代码,格式不一定

基本包装类型

  • Boolean,Number,String
  • 读取模式访问字符串:创建String类型的实例,调用方法,销毁实例
  • 对基本包装类型调用typeof返回object
  • Object’构造函数会根据传入的值的类型返回相应基本包装类型的实例
var obj = new Object("new one");
alert("obj instanceOf String")      //true
  • Boolean重写了valueOf()方法,返回基本类型true或false,重写toString()方法,返回”true“或”false“
  • Number重写了valueOf,toString和toLocaleString方法,valueOf返回数值,其他两个返回字符串,toString可传入表示基数的参数
  • toFixed,按照指定的小数位返回数值的字符串表示,会四舍五入,IE8在传入0时会有问题
  • toExponential,返回指数表示法,传入小数位参数
  • toPrecision,返回合适的表达,可传入参数表示所有数字的位数(不包括指数部分),会根据数值选择调用 toFixed或toExponential
  • charAt,charCodeAt;IE8及其他浏览器支持[]方法索引字符
  • 字符操作方法:concat,slice,substr,substring,对原字符串都无影响。
  • slice和substring第二个参数指向最后一个字符后的一个位置,substr指定返回的字符个数;传入负数,slice加上字符串长度,substr会把第一个加长度,第二个变零,subtring会把第二个变0,IE9前substr传入负值存在问题
  • substring(3,0)会被自动转化为substring(0,3)
  • indexOf,lastIndexOf,两者都接受第二个值,表示从哪里开始
  • trim,IE9+,firefox3.5+,safari5+,opera10.5+,chrome;trimLeft和trimRight,firefox3.5+,safari5+,chrome8+
  • toLowerCase,toLocaleLowerCase,toUpperCase,toLocaleUpperCase
  • 模式匹配:match,本质与正则的exce相同,接受一个正则对象或正则表达式
    search,参数同上,找到返回下标,不然返回-1
    replace,第一个参数是正则或字符串,如果字符串,只替换一个,替换所有需要正则且g,如果第二个参数是字符串,可以为特殊字符,$&等;第二个参数也可以为函数
  • split返回数组,第一个参数可以是字符串或正则,第二个表示数组大小;不同浏览器在正则有捕获组或未匹配项是会有不同
  • localeCompare,formCharCode
  • HTML方法

Global对象

1、URL编码方法,encodeURI,encodeURIComponent,decodeURI,decodeURIComponent
2、eval方法,参数为要执行语句的字符串,eval中创建的变量和函数都不会提升;严格模式下会有一些限制
3、可用如下获取Globle对象

var gl = function(){return this;}()

Math对象

1、selectFrom,接受两个值,应该返回的最大最小值

第六章

属性类型

  • 数据类型:Configurable,Enumberable,Writable,Value
    1、修改属性特征,需要object.defineProperty()
var person={};Object.defineProperty(person,"name",{
writable:false,
value:"tom"
});

2、一旦configurable设置为false,不可变回去,修改writable之外的属性都会导致错误
3、如果使用object.defineProperty方法不指定值,前三者默认都为false;不要在IE8上用

  • 访问器属性:getter和setter
    1、四个特性:Configurable,Enumerable,Get,Set
    2、访问器属性不能直接定义,也要用Object.defineProperty
    3、只指定getter不能写,只有setter返回undefined,严格模式报错
    4、IE9+,firefox4+,safari5+,opera12+和chrome
  • 修改多个属性:Object.defineProperties,IE9+,firefox4+,safari5+,opera12+和chrome
  • Object.getOwnPropertyDescriptor,IE9+,firefox4+,safari5+,opera12+和chrome

创建对象

  • 工厂模式
  • 构造函数
  • 原型模型

    1、isPrototypeOf,Object.getPrototypeOf(IE9+,firefox3.5+,safari5+,opera12+和chrome)
Person.prototype.isPrototypeOf(person1)         //true
Object.getPrototypeOf(person1) == Person.prototype         //true

2、hasOwnProperty检测属性是否存在于实例中,getOwnPropertyDescriptor
3、in:无论属性实在实例中还是原型中都返回true
4、hasPrototypeProperty()
5、for-in循环能够访问原型和实例中的属性,所有开发人员定义的属性都是可枚举的-只有在IE8及更早的版本前例外,IE早期版本进行for-in循环存在bug
6、Object.keys()接受一个对象返回包含所有可枚举属性的字符串数组
7、Object.getOwnPropertyNames()返回所有实例属性,不论是否可枚举,支持67的浏览器IE9+,firefox4+,safari5+opera12+和chrome
8、

function Person(){}  Person.prototype={...} var tom = new Person();
alert(tom instanceOf Person) //true
* Person.prototype={constructor:Person,...}

通过星号代码重设constructor会导致他的Enumberable被设置为true,默认原生应该不可枚举,所以可以用Object.defineProperty()

  • 组合使用构造函数模式和原型模式
  • 动态原型模型
  • 寄生构造函数模式
  • 稳妥构造函数模式

继承

  • 确定原型和实例的关系
    instanceof,isPrototypeOf:只要是原型链中出现过的都为true
  • 借用构造函数
  • 组合继承(最常用)
  • Object.creat():IE9+,firefox4+,safari5+,opera12+和chrome
  • 寄生式继承
  • 寄生组合式继承

第七章

  • name属性,访问函数指定的名字,firefox,safari,chrome,opera才有
  • 函数声明提升 P195

递归

  • 严格非严格模式下:arguments.callee,命名函数f()

闭包

  • P201访问作用域中的this和arguments
  • P202this?
  • 内存泄漏
  • 模仿块级作用域:立即执行函数
  • 私有变量,静态私有变量
  • 模块模式,增强的模块模式

第八章

window对象

  • window对象是JavaScript访问浏览器窗口的一个接口,优势EMCAScript规定的Global对象
  • 全局变量不能用delete删除,直接在window对象上定义的属性可以,IE<9时两者都会报错;用var添加window属性会把Configurable设置为false,所以不能用delete删。 Window Mobile平台的IE浏览器不允许window.property = value
var new = old              //报错,old未定义
var new = window.old            //new未undefined
  • 除非最高层窗口是用window.open()打开的,不然window的name值不会包含任何值
  • 窗口关系及框架:top,self,window,frames,parent
    使用框架:浏览器存在多个Global对象每个框架有自己的构造函数,跨框架instanceOf会被影响P216
  • 窗口位置
    跨浏览器获得窗口的左边和上边的位置,但不同浏览器返回值不同
var left = (typeof window.screenLeft = "number")?window.screenLeft : window.screenX;
var top = (typeof window.screenTop = "number")?window.screenTop : window.screenY;

moveTo,moveBy可以精确移动,但是可能被禁用,Opera和IE7(及更高版本)默认禁用,且不适宜框架,只能对最外层window用

  • 窗口大小:innerWidth,innerHeight,outerWidth,outerHeight;IE9+和其他浏览器
    1、Chrome中inner和outer返回值相同,都是视口大小而非浏览器大小
    2、IE9+,safari,firefox中,out返回浏览器本身尺寸(无论是最外层window还是框架内访问)
    3、Opera中out表示页面视图容器大小,inner表示页面视图区大小(减去边框宽度)
    4、所有浏览器,document.documentElement.clientWidth和height保存页面视口信息,IE6混杂模式不同
    5、document.compatMode确定页面是否处于标准模式
    6、移动设备又不同,IE也特殊
    7、resizeTo和resizeBy可改变窗口宽高,但可能被禁用,Opera和IE7+默认禁用
  • 导航和打开窗口
    1、window.open接收四个参数
    2、如果第二个参数不是一个已经存在的框架或窗口,根据第三个参数创建新窗口或标签页,默认全部设置。不打开窗口的情况下,会忽略第三个参数。第三个参数是逗号分隔的字符串,不允许出现空格

    3、window.open()返回一个新窗口引用,可以通过它操作窗口:resizeTo,移动,关闭,弹出窗口最外层window对象有opener属性存储原始窗口
    4、标签页之间的联系,opener=null
  • 弹出窗口安全限制
  • 大多数浏览器内置弹出窗口屏蔽程序,window.open()返回null,工具屏蔽会报错,可以将window.open封装在try-catch中
  • 间歇调用和超时调用
    1、超时调用都是在全局作用域下执行的,this指向window,严格模式下为undefined
    2、setTimeout,setInterval
  • alert,confirm,prompt;window.find(),window.print()查找和打印对话框,异步显示,不会计入对话框计数器;chrome、IE9和Firefox4如果莫脚本执行过程会打开多个对话框,第二个开始会有复选框供用户阻止后续对话框

location对象

1、window.location和document.location引用的是同一个对象

javascript 高级程序设计 英文 javascript高级程序设计下载_css_05


2、location.assign(URL字符串),打开新URL并在有历史记录;window.locatinotallow="URL"和location.href="URL"也会调用assign方法

3、location.hash、search、hostname、pathname、port也可改变URL;IE8,firefox1,safari2+,opera9+和chrome会生成新历史记录,IE早期版本不同

4、replace不会生成新纪录,用户不能回到前个界面

5、reload,传入一个参数true会强制从服务器加载而非缓存,reload调用之后的代码可能不会执行,最好把它放在代码最后一行

navigator 对象

javascript 高级程序设计 英文 javascript高级程序设计下载_css_06


javascript 高级程序设计 英文 javascript高级程序设计下载_html5_07


javascript 高级程序设计 英文 javascript高级程序设计下载_html_08

  • 上表中属性一般用来检测浏览器类型
  • 检查插件:非IE浏览器,可以用plugins数组达到目的,数组每项属性有:name,description,filename,length
    1、每个插件本身也是个MineType对象的数组,每个MineType对象又有四个属性
    2、IE需要使用ActiveXObject,需要知道插件的COM标识符
    3、每个插件分别创建检测函数,plugins集合有refresh方法,是否应该重载页面
  • 处理注册程序,firefox

screen对象

history对象

  • history.go,传入数值跳转页数,传入字符串,跳转到包含该字符串的最近的历史记录URL,如果没有,什么也不做;history.back,history.forword
  • history.length,历史记录长度,等于0表示当前页面是打开的第一个页面

第九章

能力检测

  • typeof检测
  • 能力检测不是浏览器检测
  • 怪癖检测
  • 用户代理检测,电子欺骗
  • 识别呈现引擎,识别浏览器,识别平台,识别移动设备,识别游戏系统P261

第十章

层次节点

  • nodeType于Node.ELEMENT_NODE在IE中无效,与数字比较适用于所有浏览器,共有12种类型
  • 对于元素结点,nadeName有,nodeValue为null,使用这两个值前应该先检查一下节点的类型
  • 每个节点都有childNodes属性,它保存着一个NodeList对象,是个类数组,DOM结构的变化能够自动反映在NodeList中
    1、可用方括号或item()方法访问
    2、Array.prototype.slice()可以将arguments和NodeList转化为数组
var arr = Array.prototype.slice.call(node.childNodes,0)     //IE8及之前版本无效

对于IE需要手动枚举所有成员
3、hasChildNodes方法
4、ownerDocument表示指向整个文档的文档节点

  • 操作节点
    1、appenChild()返回新增节点,如果传入节点已经存在,那么就转移他的位置
    2、insertBefore如果参照null,那就跟appenChild执行相同操作,返回插入的节点
    3、replaceChild(new,old)
    4、removeChild()返回被移除的节点
    5、cloneNode(),传入参数表示是否深拷贝
    deep.childNodes.length在IE9前不一样,cloneNode不会负值JavaScript属性,但是IE会
    6、normallize(),处理文本节点
  • Document类型
    1、document对象是HTMLDocument的一个实例,表示整个HTML页面,是window对象的一个属性
    2、document.documentElement是html节点,也可document.childNodes[0]或firstChild获取
    3、document.body,document.doctype


    4、文档节点是只读的,而且只能有一个元素子节点(该子节点通常早已存在)
  • 文档信息:URL,domain和referrer,只能给domain设置一定的值,设置跨域,松散到紧绷出错
  • 查找元素
    1、IE8及低版本不区分id大小写
    2、IE7及低版本利用id查找时,如果有表单元素name属性和id一样且先出现,回取到表单元素
    3、HTMLCollection对象:可以用方括号或item()和length,还有nameItem索引元素;方括号传入数值会调用item(),传入字符串会调用nameItem
    4、IE会将注释实现为节点
    5、getElementByTagName可以不区分大小写
    6、getElementByName,只有HTMLDocument类型才有
  • 特殊集合
    1、document.anchors,带有name的a
    2、document.forms,document.images
    3、document.links,带有href的a
  • DOM一致性检测:hasFeature()
  • 文档写入
  • Element类型
    1、nodeName和tagName返回值相同,输出的是大写
    2、HTML元素:id,title,lang,dir,className
    3、取得特性:getAttribute(),setAttribute(),removeAttribute(),类用class不是className
    4、IE会为自定义特性创建属性
    5、style通过属性获得的是对象,通过getAttribute()获得的是字符串;事件处理函数通过属性获得的是JavaScript函数,通过getAttribute()获得的是字符串
    6、IE7及之前通过getAttribute()获得的和属性获得的一样,setAttribute()设置class和style和事件处理没有效果
    7、div.color = "red”; alert(div.getAttribute("color)) //null,IE除外 8、IE6及以前版本不支持removeAttribute()
  • attribute属性:遍历元素特性
  • 创建元素
    1、IE7及更早版本创建元素存在问题P288
    2、creatElement两种参数
    3、元素也支持getElementByTagName
  • Text类型
    1、appendData(text),deleteData(offset,count),insertData(offset,text),replaceData(offset,count,text),splitText(offset),substringData(offset,count)
    2、length属性,且nodeValue.length和data.length保存有同样的值
    3、修改文本节点时字符串会经过HTML编码
    4、创建文本节点,document.creatTextNode
    5、规范文本节点:相邻文本节点合并,父文本节点调用normalize()方法
    6、分割文本节点:splitText()传入开始位置,返回新节点
  • comment类型
    1、与文本节点类似,除splitText的方法
    2、document.creatComment
    3、如果要访问注释节点,确保他们是html后代
  • CDATASection类型,只针对XML文档
  • DocumentType类型,只有firefox,opera,safari,chrome4支持
    不能动态创建,只能通过解析文档代码创建
  • DocumentFragment类型:文档片段
  • Attr类型

DOM操作技术

  • 动态脚本
    1、IE不允许访问scipt子节点,如appendChild,可以用script.text指定JavaScript代码
  • 动态样式
    获取headvar head = document.getElementByTagName("head")[0],IE不允许访问style子节点,style.styleSheet.cssText=“CSS样式”,慎用这个属性
  • 操作表格

    < tr >元素添加的属性和方法:cells,deleteCell(),inserCell()
  • NodeList,和NamedNodeMap,HTMLCollection都是动态的

DOM的拓展

选择符API

  • querySelector()和querySelectorAll(),接收参数为CSS选择符,可以通过Document或Element类型实例调用,支持浏览器IE8+,firefox3.0,safari3.1,opera10+和chrome
  • querySelectorAll()返回一个NodeList实例,带有所有属性和方法的NodeList,底层实现类似于一组元素的快照,而非不断对文档进行搜索的动态查询,可以用方括号和item()取得每个元素
  • matchesSelector(),元素调用它,传入CSS选择符,如果元素与选择符匹配就返回true,不同浏览器支持不同,最好编写个包装函数

元素遍历

  • 元素间空格,IE9及之前版本不会返回文本节点,其他浏览器都会
  • childElementCount,firstElementChild,lastElementChild,previousElementSibling,nextElementSibling
  • IE9+,Firefox3.5.safari4,opera10+和chrome

HTML5

  • getElementByClassName:返回的是NodeList,所以也有性能问题,IE9+,Firefox3+,safari3.1,opera9.5+和chrome
  • classList
    1、DOMTokenList实例,length,【】,item()方法
    2、add(),contains(),remove(),toggle()
    3、firefox3.6+和chrome
  • 焦点管理
    1、document.activeElement指向获得焦点的元素
    2、文档加载时为null,刚加载完为body
    3、document.hasFocus(),文档是否获得了焦点
    4、IE4+,Firefox3+,safari4+,opera8+和chrome
  • HTMLDocument的变化
    1、readyState:loading,complete
    2、IE4+,Firefox3.6,safari,chrome和opera9+
  • 兼容模式
    1、document.compatMode:CSS1Compat,BACKCompat
    2、Firefox,safari3.1+,IE,chrome,opera
  • head属性
    实现document.head的有safari5+和chrome
var head = document.head || doument.getElementByTagName("head")[0]
  • 字符集属性
    1、document.charset,所有浏览器
    2、document.defaultCharset,IE,safari,chrome
  • 自定义数据属性
    1、data-开头
    2、元素的dataset属性里访问,DOMStringMap实例,属性名没有data-
    3、Firefox6+,chrome
  • 插入标记
    1、innerHTML,插入script元素不会执行脚本,IE8-在一定情况下会执行,不同浏览器返回文本格式不同
    2、大多数浏览器支持直观方式通过innerHTML插入style元素,IE8-需要一定条件
    3、不支持innerHTML元素:
<col> <colgroup> <frameset> <hea> <html> <style> <table> <tbody>
 <thead> <tfoot>  <tr>

4、IE8-,title也没innerHTML
5、Firefox在XHTML文档中设置innerHTML有严格要求
6、window.toStaticHTML()方法
7、outerHTML,不同浏览器返回格式不同,IE4+,safari4+,opera8+和chrome。Firefox7及之前版本都不支持
8、insert’AdjacentHTML(),第一个参数:“beforebegin”,“afterbegin”,”beforeend“,”afterend“,第二个参数为html字符串,Firefox8+及其他浏览器
9、内存与性能:删除某个元素带有事件处理程序或引用了一个JavaScript对象作为属性,使用上述三个方法前最好手动删除被替换元素事件处理程序和JavaScript对象属性;innerHTML,outerHTML会创建HTML解析器,所以快,但是过多会影响性能

  • scrollIntoView(),可传入true或false,为元素设置焦点也会导致浏览器滚动并显示出元素,IE,Firefox,safari,opera

专有拓展

  • 文档模式:页面的文档模式决定了可以使用什么功能(IE)
    要强制以某种模式渲染页面,可以使用HTTP头部信息X-UA-Compatible或等价meta标签
<meta http-equiv="X-UA-Compatible" content-"IE=IEVersion">

document.documentMode返回页面的文档模式

  • children
    1、Firefox3.5,safari3,opera8,chrome,IE9
  • contains(),IE,firefox9+,safari,opera,chrome;compareDocumentPosition(),返回掩码,IE9+,Firefox,safari,opera9.5+,chrome
  • innerText,IE4 +,safari3+,opera8+,chrome;outerText,(忽略行内样式和脚本),IE4 +,safari3+,opera8+,chrome;textContent(返回行内样式和脚本)IE9+,Firefox,safari3+,opera10+,chrome
  • 滚动
    1、scrollIntoView,scrollIntoViewIfNeeded(bool),作用对象为元素容器,safari和chrome
    2、scrollByLines(),scrollByPages(),影响元素自身,safari和chrome

第十二章

  • XML命名空间

样式

  • HTML元素在JavaScript中有一个style属性,一般浏览器cssFloat,IE浏览器styleFloat
  • CSSValue包含cssText和cssValueType,cssText与getPropertyValue返回值相同,cssValueType为值类型
  • 计算样式:getComputedStyle(),返回值的表示格式因浏览器而异,所有计算的样式都是只读
    1、IE不支持,但是有currentStyle
    2、不同浏览器CSS默认属性可能不同
  • 操作样式表
    1、CSSStyleSheet

    insertRule(rule,index),指定位置插入rule字符串,IE不支持,但支持类似的addRule()方法
    2、不同浏览器document.styleSheets返回的样式表也不同
    3、也可通过< link > 或< style >元素获取CSSStyleSheet对象
function getStyleSheet(element){
 return element.sheet || element.styleSheet;       //IE支持stylesheet
 }
 var link = document.getElementByTagName("link")[0];
 var sheet = getStyleSheet(link);
  • CSS规则,CSSRule是基类型,CSSStyleRule类型最常见
  • cssText包含选择符文本花括号等,只读;style.cssText只包含样式信息,可以被重写
  • 创建规则:insertRule(),两个参数:规则文本和插入位置,样式表调用;IE8-用addRule(),三个参数
  • 删除规则:deleteRule(),参数为删除规则的位置,IE用removeRule()
  • 元素大小:
    1、偏移量:offsetHeight,offsetWidth,offsetLeft,offsetTop;offsetParent不一定和parentNode相等,td的offsetParent是table,因为table是DOM中距td最近的一个具有大小的元素,所有这些变量为只读,每次访问需要重新计算,要避免,可以存在局部变量中。表格和内嵌框架布局的页面得到的值可能有偏差,因为不同浏览器实现这些元素的方式不同。
    2、客户区大小,client-----。滚动条占用空间不算。与偏移量一样,只读,每次计算。
    3、滚动大小:scroll-----。
    4、不同浏览器scroll和client可能不一致
    5、确定元素大小:IE,Firefox3+,safafri4+,opera9.5+,chrome。getBoundingClientRect(),返回一个矩形对象,包含元素在页面中相对于视口的位置。IE8-会把(2,2)作为起点坐标

遍历

  • NodeIterator类型:document.creatNodeIterator()
    1、四个参数:root搜索起点;whatToShow访问哪些节点的数字代码;filter,NodeList对象,表示应该接受还是拒绝某种特定的节点的函数;entityReferenceExpansion,HTML中无用。
    2、whatToShow:掩码,通过一个或多个过滤器确定访问哪些节点
    3、NodeFilter对象,accept-Node方法
    4、NodeIterator类型两个主要方法:nextNode(),previousNode()
  • TreeWalker
    1、方法:nextNode(),previousNode(),parentNode(),firstChild(),lastChild(),nextSibling(),previousSibling()
    2、创建:document.creatTreeWalker
    3、参数:和NodeIterator相同
    4、currentNode,表示上一次遍历返回的节点
    5、IE没有对应的类型和方法

范围

  • DOM中的范围
    1、document.creatRange()
    2、属性和方法:startContainer,startOffset,endContainer,endOffset,commonAncestorContainer
    3、selectNode(),selectNodeContents(),两者都接受一个DOM节点,用该节点信息填充范围
    4、精细控制范围:setStartBefore,setStartAfter,setEndBefore,setEndAfter
    5、复杂选择:setStart(),setEnd()
  • 操作范围中的内容
    1、创建范围时,内部为范围创建文档片段
    2、删除:deleteContents(),extractContents(),后者会返回删除的内容
    3、克隆:cloneContents()
    4、插入:insertNode()向范围内插入节点,surroundContens()
    5、折叠DOM范围:collapse(),传入一个布尔值,可以判断两节点是否紧密相连
  • 比较范围
    1、compareBoundaryPoints(比较方式,比较范围)
  • 复制范围:cloneRange()
  • 清理DOM范围
range.detach();range=null;
  • IE8-的范围

事件

事件流

  • 事件冒泡,事件捕获;IE8-不支持DOM事件流

事件处理程序

  • HTML事件处理程序
    1、“DOM2级事件”,addEventListener(),removeEventListener();参数:接收事件,处理函数,布尔值,IE9+和其他浏览器,运行在所属元素作用域,按添加顺序触发
    2、addEventListener()添加的匿名函数无法用removeEventListener()删除
    以下方式可以删除
var handle = function(){};
element.addEventListener("click",handle,false);
element.removeEventListener("click",handle,false)
  • IE事件处理函数:attachEvent(),detachEvent(),只支持冒泡,要加on,程序在全局作用域中执行,this指向window,按添加的反序触发
  • 跨浏览器的事件处理程序

事件对象

  • 对象属性和方法


    1、this始终指向currentTarget的值
    2、cancelable属性设置为true才可以用preventDefault()来取消其默认行为
    3、IE中的事件对象:event=window.event,如果是用attachEvent添加,会有event传入函数,this不一定,用event.srcElement比较保险
    4、跨浏览器的事件对象

事件类型

  • UI事件
    1、load:资源加载完后,event.target会被设置为document,IE不会为他设置srcElement
    ;Image对象,无法将其添加到DOM树;script;link
    2、unload:切换界面发生,利用此事件最多是清楚引用,避免内存泄露;event对象只包含target属性,IE8-提供srcElement
    3、resize:target=document,IE8-无;Firefox会在停止调整才触发,其他浏览器一直触发,频繁指向会影响性能
    4、scroll
  • 焦点事件
    1、与document.hasFocus()和document.activeElement配合使用
    2、属性:blur、focus、focusin(只冒泡)、focusout
  • 鼠标与滚轮事件
    1、click、dbclick、mousedown、mouseenter(不冒泡)、mouseleave(不冒泡)、mousemove、mouseout、mouseover,mouseup
    2、IE8-在双击事件会有bug
    3、clientX,clientY,pageX,pageY;IE8-不支持page,可用滚动区算出来;screenX,screenY
    4、修改键:属性:shift,ctrl,alt,meta,都是布尔值;IE8-不支持meta
    5、相关元素:relatedTarget;IE8-提供不一样的属性
    6、鼠标按钮:button属性
    7、如果按下或释放的不是主鼠标按钮,Opera不会触发mousedown或mouseup事件
    8、更多信息事件:detail
    9、鼠标滚轮事件:mousewheel(除firefox),可设置任何元素,冒泡到document(IE8-),window(其他);属性:wheelDelta,前滚正数,后滚负数,opera早期版本相反;Firefox是DOMMouseScroll,可设置任何元素,冒泡window,信息在detail属性中,反向
    10、触摸设备:实现特别
    11、无障碍性问题
  • 键盘与文本事件
    1、keydown,keypress,keyup,前两者按住不放会重复触发
    2、非字符键没有keypress
    3、一样有修改键
    4、键码:keyCode属性;分号键各浏览器返回值不一定相同
    5、charCode,只有keypress有,ASCII码,不同浏览器实现不同
    6、String.fromCharCode(),返回字符
    7、DOM3级变化:key,char,keyIdentifier,location;不推荐
    8、textInput事件:属性(IE9+,safari和chrome):data,inputMethod(IE)
    9、设备中的键盘按键
  • 复合事件
  • 变动事件
    1、删除节点:DOMNodeRemove,DOMNodeRemoveFromDocument,DOMSubtreeModified
    2、插入节点:DOMNodeInserted,DOMNodeInsertedIntoDocument,DOMSubtreeModified
  • HTML5事件
    1、contextmenu:鼠标事件,事件对象含有光标位置信息,通常用来显示自定义菜单,click来隐藏菜单
    2、beforeunload:询问是否离开,P409
    3、DOMContentLoaded:形成完整DOM树后就触发,IE9+,Firefox,safari3.1,chrome,opera9+;
    4、readystatechange:IE,Firefox4+,opera
    5、pageshow和pagehide:Firefox和opera的“往返缓存”特性;pageshow事件的目标为document,但是必须挂载到window上;event包含persisted布尔属性,页面是否保存在bfcache中;pagehide和pageshow差不多;onunload页面自动不会bfcache;Firefox,safari5+,chrome,opera;IE9-不支持
    6、hashchange:添加给window,属性:oldURL,newURL;浏览器支持不同,最好还是用location
  • 设备事件
    1、orientationchange事件;Mozorientation;deviceorientation事件,devicemotion
  • 触摸与手势事件
    1、触摸事件:touchstart,touchmove,touchend,touchcancel,touches,targetTouches,changeTouches;Touch对象
    2、手势事件

内存和性能

  • 事件委托:click,mousedown,mouseup,keydown,keyup和keypress。虽然mouseover和mouseout事件也冒泡,但是不好处理
  • 移除事件处理程序:事件处理程序中删除元素也可以阻止冒泡,元素存在文档中是冒泡的前提;情况一:纯粹DOM操作删除带有事件处理程序的元素,情况二:innerHTML替换页面,情况三:卸载页面

模拟事件

  • creatEvent()创建event对象,传入类型字符串
  • dispatchEvent(),传入event对象
  • 创建对象;初始化对象;触发事件
  • 自定义DOM事件:createEvent(“CustomEvent”);返回对象有initCustomEvent方法接收四个参数
  • IE中的事件模拟:document.createEventObject

第十四章

表单的基础知识

  • HTMLFormElement类型,独有的属性和方法
    1、acceptCharset,action,elements,enctype,length,method,name,reset(),submit(),target
    2、document.forms可以获取所有表单,再通过索引或name取得特定表单
    3、图像按钮:<input type="image" src="...." >,submit的input或button,三者都会提交表单;除了textarea,表单控件有焦点时,按回车会提交表单,如果没有提交按钮按回车不会提交表单;提交表单前触发submit事件,可以阻止默认行为取消表单提交
    4、表单submit()方法提交不会触发submit事件
  • 重置表单:触发reset事件,可以reset()方法触发,且会触发reset事件
  • 表单字段
    1、elements属性,可以按照name和位置访问
    2、name访问多个单选按钮会返回NodeList
    3、除了fielset元素,所有表单元素都有同一组属性:disable,form,name,readOnly,tabIndex,type,value,除了form属性都可以动态修改,select的type属性是只读的
  • 公有的方法
    1、blur(),focus(),如果字段被隐藏,focus()会报错
    2、autofocus属性
  • 表单字段事件
    1、blur,change,focus ;blur(),focus()会触发事件

文本框脚本

  • text和textarea
  • 处理文本框的值最好不要用DOM方法。对value属性做的修改,不一定会反应在 DOM中
  • textarea不能设置对大字符数
  • 选择:select(),获取焦点并选中所有文本,触发select事件;取得选中文本,表单元素属性,selectionStart和selectionEnd;IE有自己的document.selection对象
    1、选择部分文本:setSelectionRange,接收第一个和最后一个字符索引,调用后要立即给文本框设置焦点才能看到选择的文字,IE8有自己的方法
  • 过滤输入
    1、屏蔽字符:keypress事件
    2、操作剪切板:copy,cut,paste,beforecopy,beforecut,beforepaste
  • 自动切换焦点,keyup时检测value长度
  • HTML5约束验证API
    1、必填字段,对于空着的字段,不同浏览器有不同的处理
    2、其他输入类型,email或url
    3、数值范围,max,min,step
    4、输入模式,pattern
    5、检测有效性:表单字段和表单都有checkValidity()方法,判断依据为前面的约束;validity对象,每个属性返回布尔

    6、禁用验证:nocalidate;表单按钮不验证表单:formnovalidate

选择框脚本

  • selection,option元素
  • 属性和方法:
    1、add(new,old),old前加新option
    2、multiple:布尔值,是否多项选择,等价于HTML中的multiple特性
    3、options:所有option的HTMLCollection
    4、remove(index):移除给定位置选项
    5、size:选择框中可见行数,等价于HTML的size
    6、selectedIndex
  • 不推荐用DOM技术修改option元素的文本或值;将表单元素作为DOM节点,实际交互方式根据浏览器会有不同,select的change事件触发条件不用失去焦点,其他表单字段要
var value = select.options[0].getAttribute("value");       //不推荐
var value = select.option[0].value                       //推荐
  • 选择选项,selectedIndex,只有一项,selected属性,可以多项
  • 添加选项:DOM方法,Option构造函数(文本,值),都appendChild到元素中,IE8-会出现问题;add()方法,新选项和新选项后的选项
  • 移除选项:DOM方法,removeChild;选择框方法,remove(index),会重置每一项的index;设置为null
  • 移动和重排选项:appendChild,重置每项index;重排也用DOM方法

表单序列化

富文本编辑

  • 本质:iframe,设置designMode属性(页面加载完才能设置)
  • contenteditable属性,不需要iframe
  • 操作富文本:document.execCommand(),三个参数;queryCommandEnable();queryCommandState
  • 富文本选区:getSelection,返回Selection对象
  • 表单与富文本

第十五章

基本用法

  • 设置宽高和后备信息;获取元素——>getContext(“2d”),检查存不存在这个方法
  • toDataURL()可以导出canvas元素上绘制的图像,接收图像的MIME类型格式,如果图像源来自不同域,会报错

2D上下文

  • 填充和描边:fillStyle,strokeStyle
  • 绘制矩形:fillRect()、strokeRect()、clearRect(),都接收xy坐标,宽高,单位都是px
  • stroke:lineWidth线条宽,llineCap线条末端形状,lineJoin相交方式
  • 绘制路径
    1、beginPath()
    2、arc(),arcTo(),bezierCurveTo(),lineTo(),moveTo(),quadraticCurveTo(),rect()
    3、closePath(),fill(),stroke(),clip()
    4、isPointInPath(),判断xy坐标点是否在路径上
  • 绘制文本
    1、fillText,strokeText,参数:文本字符串,xy坐标,最大像素宽度
    2、属性:font,textAlign,textBaseline;textAlign和textBaseline会影响xy坐标点
    3、辅助确定文本大小:measureText(),传入文字字符串,返回TextMtrics对象,有width属性
  • 变换
    1、rotate,scale,translate,transform,setTransform
    2、save()保存绘图上下文设置和变换,restore()
  • 绘制图像
    1、drawImage(),HTMLimg元素,xy开始坐标,目标宽高;九个参数类型;也可以传入canvas作为第一个参数
    2、canvas对象可以用toDataURL()
  • 阴影
    1、属性:shadowColor,shadowOffsetX,shadowOffsetY,shadowBlur
    2、浏览器支持不同
  • 渐变
    1、CanvasGradient实例
    2、creatLinearGradient(),参数:开始坐标,结束坐标,返回CanvasGradient实例
    3、addColorStop()指定色标,参数:色标位置,CSS颜色值。色标位置是0到1
    4、fillStyle,strokeStyle可以设置为CanvasGradient实例
    5、径向渐变:creatRadialGradient(),接收六个值
  • 模式
    1、creatPattern(),HTMLimg元素和一个如何重复的字符串,第一个参数也可以是video或canvas
  • 图像数据
    1、getImageData(),接收坐标和宽高,返回ImageData对象,有三个属性:width,height,data
    2、putImageData
  • 合成
    1、属性:globalAlpha,globalCompositionOperation
    2、不同浏览器有差异

WebGL

1、3D上下文

  • 类型化数组
    1、ArrayBuffer类型:new创建,分配字节,属性:byteLength包含的字节数
    2、视图:ArrayBuffer创建数组缓冲器视图,最常见视图DataView对象:参数:ArrayBuffer实例,偏移量,字节数;属性:byteOffset,byteLength;读取写入DataView:选择相应的getter和setter
    3、类型化视图,也成为类型化数组,参数和DataView一样
  • WebGL上下文
    1、先检查支不支持
    2、getContext传入第二个参数可以设置上下文选项
    3、常量,命名方法,准备绘图,视口与坐标,缓冲区,错误,着色器,编写着色器,编写着色器程序,为着色器传入值,调试着色器和程序,绘图,纹理,读取像素
  • 支持:Firefox4+,chrome;safari5.1,但是默认禁用。
    1、浏览器支持,计算机升级显示驱动程序

第十六章

跨文档消息传递(XDM)

  • 核心:postMessage()方法,参数:消息,消息接收方的域
var frame = document.getElementById("myFrame").contentWindow;        
//所有支持XDM的浏览器也支持contentWindow
frame.postMessage("secret","http://www.wrox.com");

1、收到消息触发message事件(异步),event中传来三个参数:data,origin,source
2、IE8+,Firefox3.5+,safari4+,opera,chrome和IOS版safari,Android版webkit

原生拖放

  • 拖放事件:dragstart,drag,dragend;drag会持续触发
    1、某个元素拖动到有效的放置目标时,dragenter,dragover,dragleave或drop;dragover持续触发
  • 自定义放置目标
    1、重写dropenter和dropover的默认行为将元素变为可放置目标
    2、Firefox的drop事件触发默认行为,也需要关闭
  • dataTransfer对象
    1、getData(),setData();getData()参数:表示保存数据类型的字符串,“text”或“URL",setData第一个参数也是这个
    2、dataTransfer对象中的数据只能在drop事件处理函数中被读取
    3、Firefox5-映射存在问题,需要兼容
    4、IE10-不支持MIME类型名,会抛出错误
  • dropEffect和effectAllowed
    1、dataTransfer对象的两个属性
    2、dropEffect:none,move,copy,link;被拖动元素能够执行哪种行为;必须在dragenter事件处理程序中进行设置;只有和effectAllowed搭配才有用
    3、effectAllowed,允许拖动元素的哪种dropEffect;uninitialized,none,copy,link,move,copyLink,copyMove,linkMove,all;必须在dragstart事件处理程序中设置
    4、Firefox5-会有bug
  • 可拖动
    1、draggable
    2、IE10+,Firefox4+,safari5+和chrome。opera11.5-不支持,Firefox需要另加事件,IE9,safari4-需要特别设置
  • 其他成员
    1、addElement(),clearData(),setDragImage(),types

媒体元素

  • video,audio
    1、src,poster,controls,source,type,codecs
  • 属性
  • 事件
  • 自定义媒体播放器
    1、play(),pause()
  • 检测编辑器的支持情况
    1、canPlayType(),接收格式/编解码器字符串,返回”maybe“,”probably“,”“。
  • Audio类型
    1、具有原生构造函数,和Image类似,但是不必加入到文档中,创建实例,传入音频源文件即可

历史状态管理

  • history.pushState(),参数:状态对象,新状态的标题,可选的相对URL
    1、执行后会将新的状态信息加入历史状态栈,浏览器地址栏也会变成新的相对URL,但是浏览器不会真的向浏览器发送请求,虽然location.href也会返回地址栏中的地址。
    2、第一个参数应该尽可能提供初始化页面状态所需的信息
    3、pushState()会触发window的popstate事件,事件对象state是当前状态
    4、更新当前状态:replaceState,参数和pushState()前两个参数相同,不会创造历史,只是重写当前状态
    5、支持状态管理浏览器:Firefox4+,safari5+,opera11.5+和chrome。safari和chrome中两者不能包含DOM元素,Firefox支持

第十七章

浏览器报告的错误

  • IE,firebug,safari,opera,chrome

错误处理

  • try-catch语句
    不同浏览器中error存储着不同的信息,message是共有的
try{
   somefunction();
   }catch(error){
   	alert(error.message)
   	}
  • finally子句
    1、无论如何会执行,try-catch中有return语句也会
  • 错误类型
    1、Error:基类型
    2、EvalError:没有把eval当函数调用
    3、RangeError:数值超出范围错误
    4、ReferenceError:找不到对象
    5、SyntaxError:错误的语法传入eval()
    6、TypeError:变量类型不符合要求,访问不存在方法
    7、URIError:URI格式不正确
    8、要想确定类型,可以在catch中用instanceof判断
  • 抛出错误:throw
    1、抛出错误后会立即停止执行代码,可以throw任何类型的值
throw 123;
throw new Error("error happen")    //两者都可

2、可以通过原型链继承自定义错误类型

  • 错误事件error
    1、opera和safari不支持
    2、不会创建event,但是有message,url,line
    3、事件处理程序中return false阻止浏览器默认报错
    4、图像也支持error事件,且有event
  • 错误处理的策略
  • 常见的错误类型
    1、类型转换错误,数据类型错误,通信错误
    2、类型转化错误:比较操作符,控制流语句
    3、数据类型的错误
    4、通信错误:将数据发送给服务器前没有encodeURIComponent()编码查询字符串
  • 区分致命错误和非致命错误
  • 把错误记录到服务器

调试技术

  • 将消息记录到控制台
  • 将消息记录到当前页面
  • 抛出错误
  • assert()函数

IE常见错误

  • 操作终止、无效字符、未找到成员:event
  • 未知运行错误:innerHTML,outerHTML,块元素插入行内元素,访问表格任意部分的任意属性
  • 语法错误,系统无法找到指定资源

第二十章

语法

  • 简单值:与JavaScript相同,不支持undefined;对象,数组;不支持变量,函数和对象实例
  • 简单值:必须双引号

解析与序列化

  • JSON对象
    1、方法:stringify(),parse()
  • 序列化选项
    1、除了要序列化的JavaScript对象外还可以有两个参数。
    2、第一个是过滤器,数组或函数,返回undefined则忽略属性
    3、第二个是选项,表示是否保留缩进
    4、JSON.stringify顺序:如果存在toJSON()方法且取得值有效,就调用,否则默认顺序执行;如果有过滤器,对上一步结果过滤;对上一步序列化;如果有第三个参数,进行格式化
  • 解析选项
    1、也可以传入个还原函数,和过滤器差不多,返回undefined表示删除属性
    2、日期字符转化为Data时常用还原函数
  • IE8+,firefox3.5,safari.4+,opera10.5,chrome

第二十一章

XMLHttpRequest对象

  • XHR用法
    1、xhr.open(“get”,”url",false),url可以是相对也可以是绝对,只能向同一个域中相同端口和协议的URL发送请求
    2、xhr.send(),接收一个参数,作为请求主题发送的数据,没有就传null
    3、收到响应后,响应数据会自动填充XHR对象属性:responseText,responseXML,status,statusText
    4、readyState改变触发readyStateChange事件,且事件处理函数中尽量不用this用xhr实例,因为作用域问题导致某些浏览器失败
    5、接收到响应前还可以用abort()方法取消请求
    6、终止引用后应该对XHR解引用,因为内存关系,不推荐重用XHR对象
  • HTTP头部信息
    1、发送xhr请求还会发送头部信息:Accept,Accept-Charset,Accept-Encoding,Accept-Language,Connection,Cookie,Host,Referer,User-Agent
    2、在open后send前设置头部信息,setRequestHeader()方法
    3、getResponseHeader(),传入字段取得值,getAllResponseHeaders()取得所有头部信息的字符串
  • GET请求
    1、open()方法URL末尾查询字符串必须经过encodeURIComponent
  • POST请求
    1、模仿表单提交,Content-Type头部信息设置为application/x-www-form-urlencoded,serialize()序列化表单元素,通过send发送出去

XMLHTTPRequest2级

  • FormData
    1、append()方法传入键值对或new FormData()内传入表单元素
    2、不必设置请求头直接send(FormData)
  • 超时设定
    1、XHR对象timeout属性,超时后触发timeout事件
  • overrideMimeType()方法,send之前,重写响应的MIME类型
  • 进度事件
    1、loadstart
    2、progress,接收响应期间不断出发;属性:lengthComputable,position,totalSize。lengthComputable表示进度信息是否可用布尔值,position已经接收字节数,totalSize根据Content-Length响应头部确定预期字节数
    3、error
    4、abort,因为abort()方法而停止
    5、load,接收到完整响应数据
    6、loadend,通信完成或触发error,abort或load事件

跨资源共享

  • 请求添加Origin头部,包含请求页面的源信息,如果服务器认可,就在Access-Control-Allow-Origin头部返回相同的源信息,公共资源返回“*”
  • IE对CORS的实现,XDR
  • 其他浏览器对CORS的实现
    1、不能setRequestHeader()设置自定义头部
    2、不能接受发送cookie
    3、getAllResponseHeaders()方法总会返回空字符串
    4、open传入绝对URL
  • Preflighted Requests
    1、透明服务器验证机制支持使用自定义头部、GET或POST之外的方法,以及不同类型的主体内容
  • 带凭据的请求
    1、默认跨域请求不提供凭据,设置withCredentials属性为true,可以指定某个请求应该发送凭据
    2、如果服务器接收,HTTP头部相应,Access-Control-Allow-Credentials:true,如果服务器响应没有包含这个头部就不会把响应交给JavaScript(responseText是空字符串,status为0,调用error事件处理程序)。
  • 跨浏览器的CORS:XMLHTTPRequest和XDomainRequest

其他跨域技术

  • 图像Ping:跟踪用户点击页面或动态广告曝光次数
  • JSONP
    1、两部分:回调函数和数据
    2、回调函数:响应到来页面应该调用的函数;数据:传入回调函数中的JSON数据
    3、通过查询字符串指定JSONP服务的回调函数,通过动态script元素来使用
  • Comet:长轮询和短轮询;HTTP流
  • 服务器发送事件:SSE围绕只读Comet交互推出的API或者模式
  • Web Sockets
    1、WebSocket对象
    2、发送和接收:只能发送纯文本数据

安全

  • CSRF(跨站点请求伪造)
    1、SSL,验证码
  • 其他安全
    1、POST而非GET
    2、检查URL是否可信
    3、基于cookie验证

第二十二章

高级函数

  • 安全的类型检测
  • 作用域安全的构造函数
  • 惰性载入函数
  • 函数绑定
  • 函数柯里化

防止篡改对象

  • 不可拓展对象:Object.preventExtensions(),Object.isExtensible
  • 密封的对象:Object.seal(),Object.isSeal()
  • 冻结的对象:Object.freeze,Object.isFrozen()

高级定时器

  • 重复的定时器:链式调用
  • Yielding Processes:数组分块
  • 函数节流

自定义事件

拖放

  • 修缮拖动功能
  • 添加自定义事件

第二十三章

离线检测

  • navigator.onLine,不同浏览器实现存在差异
  • onine,offline事件

应用缓存

  • CACHE MAINFEST
  • 要将文件与页面关联起来需要在html中manifest属性指定这个文件的路径
  • API核心:applicationCache对象,status属性,表示当前应用缓存状态
  • 事件:checking,error,noupdate,downloading,progress,updateready,cached
  • 方法:update(),swapCache()

数据存储

  • cookie
    1、限制
    2、cookie的构成:名词,值,域,路径,失效时间,安全标志
    3、JavaScript中的cookie:document.cookie,
    4、子cookie
    5、关于cookie的思考
  • IE用户数据
  • Web存储机制
    1、sessionStorage和globalStorage,window对象属性存在
    2、storage类型:只能存储字符串clear(),getItem(name),key(index),removeItem(name),setItem(name,value)
    3、sessionStorage对象,保持到浏览器关闭,Storage实例,IE8可以begin()commit()强制写入
    4、globalStorage,不是Storage对象,具体的globalStorage才是,需要指定哪些域可以访问的数据,如globalStorage[“wrox.com”].name,P660
    5、localStorage对象,是Storage实例
    6、storage事件:对Storage对象任何修改都会触发;event属性:domain,key,newValue,oldValue
    7、限制
  • IndexDB
    1、操作是完全异步进行的,所以大多数以请求方式进行,每次操作都需要注册onerror或onsuccess事件处理程序,以确保适当的处理结果
    2、浏览器提供前缀
var indexedDB = window.indexedDB || window.msIndexedDB || window.mozIndexDB ||
window.webkitIndexDB

3、数据库,indexedDB就是数据库,使用对象保存数据,而不是表
打开:indexDB.open(),返回IDBRequest对象,添加onerror和onsuccess事件处理程序
成功:event.target都指向request对象,event.target.result中有数据库实例对象
错误:event.target.errorCode保存错误码
版本:成功后的实例对象调用setVersion()方法,传入字符串指定版本,方法返回请求对象,需要指定成功失败事件处理程序
4、对象存储空间:如果传入版本和数据库版本不同,需要创建新的存储空间
add(),put()返回请求对象,保存并指定事件处理程序

var store = database.creatObjectStore("user",{key:"username"});

5、事务:读取修改数据都要用事务

var transaction = database.transaction();

参数:要访问的对象存储空间,如果有多个,可以字符串数组;第二个参数,IDBTransaction
6、取得事务索引后objectStore()传入存储空间名称,就可以访问特定空间,add(),put(),clear(),delete(),get(),他们返回新的请求,需要指定事件处理程序,事务也有事件处理程序,error和complete
7、游标查询:指向结果集的指针,openCourse(),返回请求对象添加事件处理程序;update()可以用指定对象更新当前游标的value;默认游标只会发起一次请求,想再发起,调用continue(),advance()
8、键范围,IDBKeyRange
9、设定游标方向
10、索引,creatIndex()
11、并发问题
12、限制

第二十四章

可维护性

性能

  • 注意作用域
    1、避免全局查找
    2、避免with
  • 选择正确的方法
    1、避免不必要的属性查找
    2、优化循环
    3、避免双重解释
    4、原生方法较快,switch语句快,位运算符快
  • 最小化语句数
    1、多变量声明
    2、插入迭代值
    3、使用数组和对象字面量
  • 优化DOM交互

部署

第二十五章

requestAnimama