一、JavaScript Core API
词法结构
字符集
使用Unicode字符集
注释
单行注释
//或HTML风格的<!--
多行注释
/**/
标识符
大小写
区分大小写
空格、换行、格式控制
转义序列
字面值、类型、变量、常量
字面值
类型(字面值或量的类型)
类型种类
原始类型 | 布 | ||
符 |
|
||
数 |
|
||
u |
|
||
n |
|
||
引用类型 | 数组 | ||
对象 | |||
类型转换
布 | 布-->其它 |
|
|
其它-->布 | 隐式转换(系统默认) |
|
|
显示转换(强制转换) | |||
符 | 符-->其它 | ||
其它-->符 |
变量
常量
表达式
语句
二、Web浏览器API(客户端API)
Web浏览器中JS的运行
引入(四种方式)
内联(执行一次)
script元素属性表:
属性及默认值 | 说明 | 备注 |
language="javascript" | 老式浏览器代替type,已废弃 | |
type="text/javascript" | 脚本的MIME类型 |
当包含不被浏览器识别的type属性值时,
|
src="url" | .js文件URL | |
defer | 延迟执行 |
|
async | 异步执行 |
|
XHTML中,“<”,“&”会解释成xml,可用CDATA包围:<![CDATA[ //JS code ]]>。
外部(执行一次)
使用src后,script标签的之间的内容会被忽略。
事件属性(执行多次)
- 属性值包含多条语句,以;分割,构成一个函数体。
- 单行注释不可用。
URL资源(执行多次)
- <a href="javascript:" />
- <form action="javascript:" />
- window.open()方法的参数
- 超链接里的URL(bookmarklet)
- 单行注释不可用
javascript:url执行后会将返回值覆盖当前文档,可以:
- void操作符强制函数调用或
- 给表达式赋予undefined
避免覆盖
执行(单线程模型,无并发,脚本和事件处理程序同一时间只能执行一个)
同步执行阶段(脚本执行阶段)
- 默认执行方式(内联和外部脚本默认情况下同步阻塞执行,阻塞文档解析和渲染)
- 可改变的执行方式:
- defer延迟脚本
- async异步脚本
- 动态创建script标签插入文档实现异步载入和执行。
异步执行阶段(事件处理阶段,事件驱动)
第一个事件:onload事件
执行时间线
- document.readystate="loading"阶段。web浏览器创建Document对象,解析web页面,解析HTML元素和文本内容添加Element对象和Text节点到文档中。
- 无async和defer的script元素时:
- 暂停解析(暂停解析文档,将元素添加入文档并同步执行,下载和执行时解析器会暂停解析。)
- 可以使用document.write()方法将文本插入输入流。解析器恢复时,这些文本成为文档的一部分。
- 可以访问自身的script元素及之前的文档内容。
- 含async的script元素时:
- 继续解析(继续解析文档,同时异步下载脚本文本并尽快执行)
- 禁止使用documnet.write()方法。
- 可能也不可能(取决于尽快的程度)访问自身的script元素及之前的文档内容。
- 含defer的script元素时:
- 继续解析,暂停脚本执行直到文档完成解析。
- 解析文档完成后,document.readystate="interactive"。
- 由于文档解析完成,含defer的script元素顺序执行
- 禁止使用document.write()方法
- 可以访问完整文档树
- 浏览器在Document上触发DOMContentLoaded事件。此时异步脚本可能没有执行。
- 载入图片,执行未执行的异步脚本后,document.readystate="complete",然后web浏览器会触发window的load事件。
Web浏览器中JS的兼容性、安全性、可访问性
兼容性
兼容性的原因(演化、未实现、Bug)
兼容性的解决
- 类库
- 分级支持
- 功能测试
- 浏览器测试
- 怪异模式和标准模式
- IE条件注释
- HTML中的条件注释
单独的条件前后缀 <!--[if !|lt|gt|lte|gte IE|IE 5|IE 6|IE 7|IE 8|IE 9]> IE5~IE9能识别前后缀并解释渲染内容 其他浏览器不能识别前后缀仅当做注释 <![endif]--> 注释的条件前后缀 <!--[if !|lt|gt|lte|gte IE|IE 5|IE 6|IE 7|IE 8|IE 9]>-->(或<---->) IE5~IE9能识别前后缀但同时将里面的内容当做注释并不展示 其他浏览器不能识别前后缀仅当做注释,但此时前后缀也被注释掉,所以可以识别里面的内容。 <!--(或<!---->)<![endif]-->
- JS中的条件注释(IE的js解释器支持条件注释)
/*@cc_on
@if(@_jscript)
@else
@end
@*/
安全性
同源策略
不严格同源策略
- Document对象的domain属性
- CORS跨域资源共享
- CDM跨文档消息
IE的Active控件和非IE的插件
XSS跨站脚本
拒绝服务攻击
可访问性(JS增强信息访问,WAI-ARIA)
BOM(宿主API)
Window
属性
普通属性
事件属性
方法
DOM(宿主下文档API)
Document对象
属性
方法
节点树的操作(增删改查)
元素节点的操作
查(访问) |
||||
遍历方式 | ||||
节点属性 |
|
|||
根节点 |
|
|||
子节点 |
|
|||
父节点 |
|
|||
兄弟节点 |
|
|||
快捷方式 | ||||
属性 | id | document.getElementById() | Element对象 | IE8以下,该方法入参不区分大小写,且返回匹配的name属性的元素 |
name | document.getElementsByName() | NodeList对象(包含若干Element对象的数组) |
|
|
class | document.getElementsByClassName() | |||
元素 | Tag | document.getElementsByTagName() | ||
CSS选择器 | Selector | document.querySelector() | ||
document.querySelectorAll() | ||||
document.all | ||||
增 |
||||
创建 |
元素节点 | document.createElement('element')/document.createElementNS('url','element')(在使用了XML命名空间的文档中,同时指定命名空间的url和标签名) | ||
文本节点 | document.createTextNode('text node content') | |||
注释节点 | document.createComment() | |||
文档碎片 | document.createDocumentFragment() | DocumentFragment和Document一样独立不属于文档一部分,且把一组节点当中一个节点 | ||
克隆节点 | Node.cloneNode(true|false)(true:深拷贝|false:浅拷贝) | |||
导入节点 | document.importNode(node,true|false)(true:深拷贝|false:浅拷贝) | 除IE外 | ||
插入节点 |
|
|
若插入已存在的节点,则会删除已存在重新插入 | |
删 |
||||
删除和替换节点 |
|
|||
改 |
属性节点的操作
Node节点属性 | Node.attributes[index|name] |
|
标准属性 |
|
|
非标准属性 |
|
|
数据集属性 |
|
|
文本节点的操作
Node节点文本 | Node.nodeValue | |
Node.data | ||
纯文本 | Node.textContent | 除IE外都支持 |
Element.innerText | 除FF外都支持 | |
document.getElementsByTagName('script')[0].text(script元素text属性) | ||
HTML文本 | document./element.innerHtml | 单独设置时效率高,使用+=拼接效率低,因为既要序列化又要解析 |
element.outerHtml | 除FF外都支持 | |
element.insertAdjacentHTML('beforebegin|afterbegin|beforeend|afterend','element') |
CSSOM(宿主下文档样式API)
内联样式 style |
|
|
|
|
|
计算样式 getComputedStyle() |
|
|
|
|
|
class类 |
|
|
|
|
|
样式表 |
|
|
|
|
|
|
事件
异步事件驱动模型
事件类型
事件目标
事件处理程序
注册
属性注册 | 元素属性注册 |
|
如果事件目标为window则注册在body元素的属性上 |
JavaScript对象属性注册 |
|
只能注册一个属性 | |
方法注册 |
非IE,标准API |
|
|
IE9以下 |
|
|
调用
参数 |
|
运行环境 |
|
作用域 |
|
返回值 |
对属性注册的处理程序
对通过方法注册的处理程序
|
调用顺序 |
|