Javascript WebAPI
由浏览器提供的一系列 API
DOM 树对象
Document -> Node -> EventTarget
1 | document; // 是本网页,属于 Document 实例 |
编辑 DOM 树
获取
1 | Document.getElementById(); // 通过ID获取 |
getElement 返回一个(多个)HTMLElement, HTMLElement -> Element -> Node -> EventTarget
getElements 返回 HTMLCollection , 内有多个 Element
更新
1 | Element.innerHTML = 'ABC <span style="color:red">RED</span> XYZ'; // 无编码,有XSS注入风险 |
添加
1 | Element.appendChild(newElement); // 添加到最后 |
referenceElement 可以通过遍历 children 获得
删除
1 | Element.removeChild(); // 删除子节点,一般会调用父节点删除自己 |
操作表单
1 | Element.value; // 用于 text、password、hidden 以及 select 以获得值 |
上传文件使用 <input type="file">
表单的enctype
必须指定为multipart/form-data
,method
必须指定为post
URL 对象
1 | Document.location.href; // URL |
关于 DOM
节点
-
元素节点
Node.ELEMENT_NODE(1)
对应标签元素 -
属性节点
Node.ATTRIBUTE_NODE(2)
对应标签的属性 -
文本节点
Node.TEXT_NODE(3)
对应标签内容 -
CDATA 节点
Node.CDATA_SECTION_NODE(4)
XML 节点 -
实体引用名称节点
Node.ENTRY_REFERENCE_NODE(5)
-
实体名称节点
Node.ENTITY_NODE(6)
-
处理指令节点
Node.PROCESSING_INSTRUCTION_NODE(7)
-
注释节点
Node.COMMENT_NODE(8)
对应注释 -
文档节点
Node.DOCUMENT_NODE(9)
对应 document 对象即根节点 -
文档类型节点
Node.DOCUMENT_TYPE_NODE(10)
对应<!DOCTYPE XXX>
-
文档片段节点
Node.DOCUMENT_FRAGMENT_NODE(11)
对应 DocumentFragment 节点 -
DTD 声明节点
Node.NOTATION_NODE(12)
声明 DTD
Event 事件对象
Event -> EventTarget
-
注册事件监听器
可以存在多个回调
1
2
3
4
5
6
7
8
9
10
11
12
13
14EventTarget.addEventListener(
"Event",
// 这里的 Litsener 必须是一个实现了 EventListener 接口的对象
{
handleEvent: function (event) {
// 表达式函数
// event 参数为基于 Event 的对象
event.stopPropagation(); // 阻止冒泡
event.preventDefault(); // 阻止默认事件
return false; // 阻止默认事件,并阻止冒泡
},
},
false, // useCapture 是否捕获事件
); -
从事件队列删除
1
2
3EventTarget.removeEventListener("Event", function (event) {
listener;
}); -
使用事件处理器(onEvent)注册,回调唯一
1
2
3EventTarget.onEvent = function (event) {
handler;
}; -
创建事件
1
2
3
4
5
6
7
8
9var event = new Event("build"); // 创建 CustomEvent -> Event 亦可
EventTarget.dispatchEvent(event); // 分发绑定
EventTarget.addEventListener(
"build",
function listener(event) {
listener;
},
false,
); -
事件委托
Event.target
引用分发事件的元素Event.currentTarget
则引用绑定事件的元素,常用于复用监听器
1
2
3
4
5
6
7
8
9function hide(e) {
if (e.target.nodeName.toLocaleLowerCase === "li") {
// e.target 引用子元素
console.log("the content is: ", target.innerHTML);
}
}
// 添加监听事件到列表,当每个子元素被点击的时候都会触发。
ul.addEventListener("click", hide, false);
window 窗口对象
1 | window.navigator; // navigator 浏览器对象 |
历史对象
1 | window.history; // 历史对象 |
title 为标题,一般使用空字符串
url 可选
会改变 URL 但是页面不会跳转(onpopstate 不被触发)
这两个方法通常与 window.onpopstate 事件合用
每当处于激活状态的历史记录条目发生变化时(后退、前进、跳转),popstate 事件就会在对应 window 对象上触发
可以取代 #Hash 实现单页面应用
XHR 网络请求对象
XMLHttpRequest -> XMLHttpRequestEventTarget -> EventTarget
1 | XMLHttpRequest(); // 构造函数 |
属性
1 | XMLHttpRequest.readyState; // 返回请求的状态码 |
0 UNSENT 代理被创建,但尚未调用 open() 方法
1 OPENED open() 方法已经被调用
2 HEADERS_RECEIVED send() 方法已经被调用,并且头部和状态已经可获得
3 LOADING 下载中,此时 responseText 属性已经包含部分数据
4 DONE 下载操作已完成
1 | XMLHttpRequest.UNSENT === 0; // true |
1 | XMLHttpRequest.response; // 返回整个响应体(response body)。 |
方法
1 | XMLHttpRequest.open(method, url, async, user, password); // 初始化请求,重复调用等同 abort() |
事件
1 | abort; // 停止 XMLHttpRequest.abort() |
跨域访问
可以设置后端代理
使用 JSONP ,只响应 GET,返回 JS 代码
使用 CORS,需要对方设置 Access-Control-* 参数