```
### 鼠标事件
- 鼠标位置
- 可视区位置:`clientX`、`clientY`
- 例子:跟随鼠标的 `Div`
- 消除滚动条的影响:**可视区**与**页面顶部**的距离
- 代码:
```js
// 封装鼠标当前坐标函数
function getPos(ev) {
var scrollTop = document.documentElement.scrollTop||document.body.scrollTop;
var scrollLeft = document.documentElement.scollLeft||document.body.scrollLeft;
return {x: ev.clientX+scrollLeft, y: ev.clientY+scrollTop};
}
```
- 滚轮事件:`onmousewheel` 滚轮数据:`event.wheelDelta`
- 代码:鼠标滚轮控制 `div` 移动
```HTML
事件绑定与鼠标滚轮
```
- 获取鼠标在页面的绝对位置
- 封装函数
- 例子:一串跟随鼠标的 `Div`
- 代码:
```HTML
跟随鼠标的一串div
```
### 键盘事件
- `keyCode`
- 获取用户按下键盘的哪个键:`onkeydown` / `onkeyup`
- 例子:键盘控制 `Div` 移动
- 其它属性
- `ctrlKey`、`shiftKey`、`altKey`
- 例子:提交留言
- 回车提交
- CTRL + 回车 提交
- 代码:
```HTML
键盘控制元素移动和回车提交
```
## JS 事件中级
### 默认事件
- 默认事件
- 什么是默认事件
- 阻止默认事件
- 普通写法:`return false;`
- 例子1:屏蔽右键菜单
- ` document.oncontextmenu = function (ev) { return false; }`
- 弹出自定义右键菜单
- 例子2:只能输入数字的输入框
- ` oTxt.onkeydown = function (ev) { return false; }`
- `keydown`、`keyup` 事件区别
- 代码:
```HTML
默认事件
123
456
789
123
456
789
123
456
789
```
### 拖拽
- 简单拖拽
- 拖拽原理
- 鼠标按下位置到 div 距离不变
- 三个事件:` onmousedown` `onmousemove` `onmouseup`
- 靠谱拖拽
- 原有拖拽的问题:移动太快鼠标会移出 div
- 直接给 `document` 加事件
- FireFox 下,空 Div 拖拽 Bug
- 阻止默认事件:`onmousedown {return false}`
- 防止拖出页面
- 修正位置:在可视区内
- 代码:
```HTML
拖拽
```
## JS 事件高级应用
### 事件绑定
- IE 方式:
- `attachEvent(事件名称, 函数)`,绑定事件处理函数
- `detachEvent(事件名称, 函数)`,接触绑定
- DOM 方式:不兼容 IE7
- `addEventListener(事件名称, 函数, 捕获)`
- `removeEventListener(事件名称, 函数, 捕获)`
- 何时使用绑定
- 绑定事件和 `this`
- 绑定匿名函数,会无法删除
- 代码:
```HTML
事件绑定
```
### 高级拖拽
- 复习拖拽原理
- 距离不变
- 三个事件
- 限制范围
- 对位置进行判断
- 例子1:不能拖出窗口的 Div
- 例子2:不能拖出指定窗口的 Div
- 磁性吸附
- 图片拖拽
- 阻止默认事件
- **文字选中**
- 阻止默认事件 `return false` 可以解决 `chrome` 、`FireFox` 、`IE9`的文字选中问题
- IE 下拖动有问题:
- 事件捕获:`.setCapture()` 只兼容IE
- 取消捕获:`.releaseCapture()`
- 与 DOM 配合
- 带框的拖拽
- 保留原有位置的拖拽
- 代码:
```HTML
高级拖拽
asdfasdfas/sad'234
asdfasdfas/sad
asdfasdfas/sad'234
```
### 自定义滚动条
- 拖拽
- 只有横向拖拽
- 限制范围:范围的大小
- 计算比例:当前值/最大值
- 控制其他对象
- 例子1:控制物体的大小
- 例子2:控制物体的透明度
- 例子3:控制文字滚动
- 代码:
```HTML
自定义滚动条
值 描述
normal 默认。空白会被浏览器忽略。
pre 空白会被浏览器保留。其行为方式类似 HTML 中的 标签。inherit 规定应该从父元素继承 white-space 属性的值。
nowrap 文本不会换行,文本会在在同一行上继续,直到遇到 标签为止。
pre-wrap 保留空白符序列,但是正常地进行换行。
pre-line 合并空白符序列,但是保留换行符。
inherit 规定应该从父元素继承 white-space 属性的值。
- 拖拽
- 只有横向拖拽
- 限制范围:范围的大小
- 计算比例:当前值/最大值
- 控制其他对象
- 例子1:控制物体的大小
- 例子2:控制物体的透明度
- 例子3:控制文字滚动
- 代码:- 拖拽
- 只有横向拖拽
- 限制范围:范围的大小
- 计算比例:当前值/最大值
- 控制其他对象
- 例子1:控制物体的大小
- 例子2:控制物体的透明度
- 例子3:控制文字滚动
- 代码:- 代码:- 拖拽
- 只有横向拖拽
- 限制范围:范围的大小
- 计算比例:当前值/最大值
- 控制其他对象
```
## Ajax 基础
### Ajax 是什么
- 什么是服务器
- 网页浏览过程分析
- 如何配置自己的服务器程序
- 什么是 **Ajax = Asynchronous JavaScript and XML**(异步的 JavaScript 和 XML)
- 无刷新数据读取
- 用户注册、在线聊天室
- 异步、同步
### 使用 Ajax
- 基础:请求并显示静态 `txt `文件
- 字符集编码:必须统一编码
- 缓存、阻止缓存:
- 根据 `URL` 缓存:让 `URL` 一直在变化,在 URL 后加时间戳
- 动态数据:请求 JS(或 json )文件,获取过来是字符串,需要解析
- `eval` 的使用:解析成 JS 元素
- DOM 创建元素
- 局部刷新:请求并显示部分网页文件
### Ajax 原理
- HTTP 请求方法
- `GET` ---- 用于获取数据(如:浏览帖子)
- `POST`---- 用于上传数据(如:用户注册)
- GET/POST 的区别
- `GET` 是在 `url` 里传数据:安全性差、容量小、有缓存
- `POST` 不通过 `url` :安全性较高,容量大(2G)、无缓存
## Ajax 中级
### 编写 Ajax
- 创建 Ajax 对象
- `ActiveXObject("Microsoft.XMLHTTP)`
- `XMLHttpRequest()`
- 笔记:变量是 `Window` 的属性
- 使用未定义的变量 —— 报错
- 使用未定义的属性 —— `undefined`
- 用 `window.XMLHttpRequest` 返回真则是 chrome FF IE7,
- 用 `window.ActiveXObject("Microsoft.XMLHTTP")` 返回真则是 IE6
- 连接服务器
- `open(方法,文件名,异步传输)`
- *method*:请求的类型;`GET` 或 `POST` ,**必须大写**
- *url*:文件在服务器上的位置,GET 请求要避免缓存,请向 URL 添加一个唯一的 ID
- *async*:true(异步)或 false(同步)
- 发送请求
- `send()`
- *string*:仅用于 POST 请求
- 接收返回值
- 请求状态监控
- `onreadystatechange` 事件
- `readyState` 属性:请求状态
- `0: 未初始化 ` 还没有调用 `open()` 方法
- `1: 开始载入 ` 已调用 `send()` 方法,正在发送请求
- `2: 载入完成 ` `send()` 发送完成,已收到全部响应内容
- `3: 解析 ` 正在解析响应内容
- `4: 完成` 响应内容解析完成,可以在客户端调用了
- `status` 属性( http 状态码):请求结果,`200: 成功`
- `responseText` 获得字符串形式的响应数据
```js
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
```
> ## POST 请求
>
> 一个简单 POST 请求:
>
> 实例
>
> ```js
> xmlhttp.open("POST","/try/ajax/demo_post.php",true); xmlhttp.send();
> ```
>
> 如果需要像 HTML 表单那样 POST 数据,请使用 setRequestHeader() 来添加 HTTP 头。然后在 send() 方法中规定您希望发送的数据:
>
> 实例
>
> ```js
> xmlhttp.open("POST","/try/ajax/demo_post2.php",true); xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xmlhttp.send("fname=Henry&lname=Ford");
> ```
>
> | 方法 | 描述 |
> | :------------------------------- | :----------------------------------------------------------- |
> | setRequestHeader(*header,value*) | 向请求添加 HTTP 头。 *header*: 规定头的名称 *value*: 规定头的值 |
- 代码:
```HTML
```
### Ajax 数据
- 数据类型
- 什么叫数据类型——英语/中文
- `XML` / `JSON`
- 字符集( 文件编码 )
- 所有文件字符集相同
## JS 面对对象基础
### 面对对象是什么
- 什么是对象
- 什么是收音机,许多成分构成的整体,提供一些功能
- 对象是一个整体,对外界提供一些操作
- 什么是面对对象
- 使用对象时,只关注对象提供的功能,不关注其内部细节
- 比如 JQuery
- 面向对象是一种通用思想,并非只有编程中能用,任何事情都可以面对对象
### JS 中的面对对象
- 面对对象编程(OOP)的特点
- 抽象:抓住核心问题,把主要特征、相关特征抽出来
- 封装:不考虑内部实现,只考虑功能使用
- 继承:基于已有对象,继承出新的对象
- 多态继承:同时具有几个父对象的特性
- 多态:JAVA 等强类型语言常用,JS 不常用
- 对象的组成
- 方法——函数:过程、动态的
- 函数:不属于对象
- 方法:属于对象的函数
- 属性——变量:状态、静态的
- 变量:不属于对象
- 属性:属于对象的变量
### 第一个面对对象的程序
- 为对象添加方法和属性
- `this` 详解,事件处理中 `this` 的本质
- `window`
- `this` —— 函数属于谁
- 不能在系统对象中随意附加方法、属性,否则会覆盖已有方法、属性
- `Object` 对象:系统空白对象
### 工厂方式
- 工厂方式
- 用构造函数创建一个类
- 什么是类、对象(实例):模具和零件
- 笔记:构造函数/工厂函数
- 构建对象的函数
- `constructor` 属性 返回所有 `JavaScript` 变量的构造器函数。
- 工厂方式的问题
- 没有 new
- 函数重复定义:函数内容一样却不相等,浪费大量系统资源
- 问题解决:**构造函数加上** `new` , **然后用原型**`Prototype` 为对象添加**方法**
- `new` 做了两件事
- **替你创建了一个空白对象**:`var this = new Object()`
- **替你返回了这个空白对象**:`return this `
- `new` 和 `this`
### 原型:Prototype
- 原型是什么
- 原型是 `class`,修改它可以影响一类元素
- 在已有对象中加入自己的属性、方法
- 为所有 `Array` 添加 `Sum` 方法:`Array.prototype.sum = function () {} `
- 给对象添加方法,类似于行间样式
- **给原型添加方法,类似于 `class`**
- 原型的小缺陷
- 无法限制覆盖
- 类和对象的区别
- 类:生产对象的模板 `Array`
- `var arr = new Array()`
- 对象:产品 `arr`
- 总结:**用构造函数加属性,用原型加方法,叫做混合方式构造对象**
- 代码:
```HTML
面对对象基础
```
### 面对对象编程方式
- 用混合方式构造对象
- 混合的构造函数 / 原型方式
- `Mixed Constructor Function` / `Prototype Method`
- 原则
- 构造函数:加属性
- 原型:加方法
- 对象命名规范
- 类名首字母大写
## JS 面对对象实例
### 面对对象的选项卡
- 把面向过程的程序,改写成面向对象的形式
- 原则:不能有函数套函数,但可以有全局变量
- 过程:
- `onload`:构造函数
- 全局变量:属性
- 函数:方法
- 改错:
- `this`、事件、闭包、传参
- 对象与闭包
- 通过闭包传递 `this`
- 代码:
```HTML
面对对象的选项卡
```
## JS 面对对象高级
### Json 方式的面向对象
- 把方法包在一个 `Json` 里:简单 单体 不适合多个对象
- 有人管它叫:**命名空间**
- 把同一类方法,放在一起
- 代码:
```js
var json = {
name: 'zhangsan',
QQ: 34543643,
age: 23,
showName: function () {
console.log(this.name);
},
showQQ: function () {
console.log(this.QQ);
}
}
json.showName();
json.showQQ();
```
### 拖拽和继承
- 面向对象的拖拽
- 改写原有拖拽,代码同下
- 对象的继承
- 什么是继承
- 在原有类的基础上略作修改,得到一个新类
- 不影响原有类的功能
- `instanceof` 运算符:返回 `true`,如果对象是对象类型的实例。
- **查看对象是否是某个类的实例**
### 使用继承
- 限制范围的拖拽类
- 构造函数的伪装
- 属性的继承
- 原理
- `call` 的使用
```js
function A() {
this.abc = 12;
}
A.rototype.show = {
alert(this.abc);
}
function B() {
A.call(this); // 用 call 继承属性,把B传入A函数内
}
// B.prototype = A.prototype; // 浅复制方法是引用,指向同一个内存空间
for (var i in A.prototype) {
B.prototype[i] = A.ptoyotype[i]; // 深度复制就不会引用,直接复制内容
}
var obj = new B();
alert(obj.abc);
obj.show.call(); // call 一般省略
```
- 原型链
- 方法的继承
- 原理:**复制方法是引用,指向同一个内存空间**
- 覆盖原型的方法复制
- `for in` 深度复制就不会引用,直接复制内容
- 代码:拖拽改写为面对对象并继承一个新的对象
```HTML
面对对象的拖拽
普通拖拽
限制范围的拖拽
```
```JS
function Drag(id) {
this.disX = '';
this.disY = '';
this.oDiv = document.getElementById(id);
var _this = this;
this.oDiv.onmousedown = function (ev) {
_this.fnDown(ev);
return false;
};
}
Drag.prototype.fnDown = function (ev) {
var ev = event||ev;
var _this = this;
// 鼠标可视区位置 - div左边距 = 鼠标在div内的位置
this.disX = ev.clientX - this.oDiv.offsetLeft;
this.disY = ev.clientY - this.oDiv.offsetTop;
console.log(this.disX,'可视区鼠标X:', ev.clientX, '鼠标Y:',ev.clientY);
document.onmousemove = function (ev) {
_this.mouseMove(ev);
}
document.onmouseup = function (ev) {
_this.mouseUp(ev);
}
}
Drag.prototype.mouseMove = function(ev) {
// 不断获取Event 对象,坐标才会不断更新
var ev = event||ev;
// console.log('可视区鼠标X:', ev.clientX, '鼠标Y:',ev.clientY);
// div位置 = 鼠标可视区新的位置 - 鼠标与div的距离
this.oDiv.style.left = ev.clientX - this.disX + 'px';
this.oDiv.style.top = ev.clientY - this.disY + 'px';
}
Drag.prototype.mouseUp = function () {
document.onmousemove = '';
document.onmouseup = '';
}
```
```JS
// 继承属性
function LimitDrag(id) {
Drag.call(this, id);
}
// 继承原型
for (var i in Drag.prototype) {
LimitDrag.prototype[i] = Drag.prototype[i];
}
LimitDrag.prototype.mouseMove = function(ev) {
// 不断获取Event 对象,坐标才会不断更新
var ev = event||ev;
// console.log('可视区鼠标X:', ev.clientX, '鼠标Y:',ev.clientY);
// div位置 = 鼠标可视区新的位置 - 鼠标与div的距离
var l = ev.clientX - this.disX;
var t = ev.clientY - this.disY;
if (l < 0) {
l = 0;
} else if (l > document.documentElement.clientWidth - this.oDiv.offsetWidth) {
l = document.documentElement.clientWidth - this.oDiv.offsetWidth;
}
if ( t < 0) {
t = 0;
} else if (t > document.documentElement.clientHeight - this.oDiv.offsetHeight) {
t = document.documentElement.clientHeight - this.oDiv.offsetHeight;
}
this.oDiv.style.top = t + 'px';
this.oDiv.style.left = l + 'px';
}
```
### 系统对象
- 本地对象
- 什么是本地对象
- 常用对象:可以实例化( `new` )
- `Object` / `Function` / `Array` / `String` / `Boolean` / `Number` / `Date` / `RegExp` / `Error`
- 内置对象(静态对象):不能实例化
- 什么是本地对象
- `Global(无法使用)` / `Math`
- 宿主对象(由浏览器提供的对象)
- `DOM` / `BOM`
## BOM 应用
### BOM 基础
- 打开、关闭窗口
- `open(url, 打开方式)`:`open('ablout.blank', '_blank')`
- 例子:页面内运行代码功能
- `close(url, 打开方式)`:`window.close()` 关闭当前窗口
- 例子:关闭时提示问题
- 只能关闭自己 `open` 的窗口
- 常用属性
- `window.navigator.userAgent`
- `navigator`:包含大量信息
- `userAgent`:浏览器信息
- `window.location`
- `href`:当前网页地址
- `hostname`:主机域名
- `pathname`:页面路径和文件名
- `port`:端口
- `protocol`:http协议
- `assign`:加载新文档,url
- `window.history`
- `back()`:后退
- `forward()`:前进
- `go()`:历史中某个页面,-1 用于登陆后回跳
### 尺寸及坐标
- 窗口尺寸、工作区尺寸
- 可视区尺寸
- `document.documentElement.clientWidth`
- `document.documentElement.clientHeight`
- 滚动距离
- `document.body.scrollTop`:旧版本 chrome 和没有 DOCTYPE 声明的 IE
- `document.documentElement.scrollTop`:IE FF
- 完美的获取 `scrollTop` 赋值短语 :
`var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;`
### 常用方法和事件
- 系统对话框
- 警告框:`alert("内容")`,没有返回值
- 选择框:`confirm("提问的内容")`,返回 `boolean`
- 输入框:`prompt()`,返回字符串或 `null`
- `window` 对象常用事件
- `onload`:页面加载完发生
- `onscroll`:页面滚动时发生
- `onresize`:事件会在窗口或框架被调整大小时发生
- 例子:回到顶部按钮、侧边栏广告
- 闪烁问题
- `userAgent > IE6` 用 `position:fixed;`
- `userAgent < IE6` 用运动;
- 代码:
```HTML
Bom应用
```
## COOKIE 基础与应用
### 什么是 cookie
- 页面用来保存信息
- 比如:自动登录、记住用户名
- `cookie 的特征
- 同一网站中所有页面共享一套 `cookie
- 数量、大小有限
- 过期时间
- JS 中使用 `cookie`
- `document.cookie
### 使用 cookie
- 设置 `cookie`
- 格式:`名字 = 值`
- 赋值时不会覆盖
- 过期时间:`expires = 时间`
- 设置前一个 cookie 数据的过期时间,expires 放在数据后面:
- `document.cookie = 'password=123;expires='+ oDate;`
- 日期对象的使用
- 封装函数
```js
// 封装 setCookie 函数
function setCookie(name, value, iTime) {
var oDate = new Date();
oDate.setTime(oDate.getTime() + iTime); // 毫秒
document.cookie = name + '=' + value + ';expires=' + oDate;
}
setCookie('username', '张三', 1000*60*60);
```
- 读取 `cookie`
- 字符串分割
```js
// 封装 getCookie 函数
getCookie(name) {
var arr = document.cookie.split('; ');
for (var i in arr) {
var arr2 = arr[i].split('=');
if (arr2[0] === name){
return arr2[1];
}
}
return '';
}
console.log(getCookie('username'));
```
- 删除 `cookie`
- 已经过期
```js
// 封装 removeCookie 函数
function removeCookie(name) {
setCookie(name, '', -1)
}
removeCookie('username');
```
- 例子:使用 `cookie` 记录上次登陆的用户名
- 提交时:记录用户名
- `window.onload`:读取用户名
- 代码:
```HTML
28.1.登陆后cookie读取用户名
```
## JS 中的正则表达式
### 正则表达式基础
- 复习字符串操作:`var str = 'asdf1234';`
- `search`:**查找位置** `str.search('3')`
- `substring`:获取子字符串,
- **截取某段**字符串, **不包含结束位**: `str.substring(2,5)`
- 获取起点以后的字符串:`str.substring(2)`
- `charAt`:**获取某个**字符串 `str.charAt(2)`
- `split`:**分割**某个字符串 ` str.split('-')`
- 找出字符串中所有的数字
- 用传统字符串操作完成
- 用正则表达式完成
- 什么是正则表达式
- 什么叫正则?
- 规则、模式
- 强大的**字符串匹配工具**
- 是一种人类很难读懂的文字
- `RegExp` 对象
- `JS` 风格:`new RegExp( "a" , "i" )`
- `perl` 风格:`/a/i`
### 字符串与正则配合
- `search`:字符串搜索,返回位置或 -1
- 返回出现的位置
- 忽略大小写:`i`:ignore
- 判断浏览器类型
- `match`:获取匹配的项目,返回元素或
- 量词:`+` (若干个)
- 量词变化:`\d`(单个数字一组) `\d\d`(两个数字一组) 和 `\d+`(若干连续数字)
- 全局匹配:`g`:global
- 例子:找出所有数字
- `replace(reg/str,replacement)`:替换所有匹配
- 返回替换后的字符串
- 例子:敏感词过滤
### 字符串
- 任意字符:`[]`方括号(元字符)
- `[abc]`
- 例子:`a[usb]t`:`obt` `ost` `out`
- 范围
- `[a-z]` `[0-9]`
- 例子:`id[0-9]`:`id0` `id5`
- 排除
- `[^a]`
- 例子:`o[^0-9]`:`oat ` `o?t` `ot`
- 组合
- `[a-z0-9A-Z]`
- 实例:偷小说
- 过滤 HTML 标签,
- 正则贪婪特性,从最长的内容开始过滤
- 自定义 `innerText` 方法
- 代码:同下
- 转义字符
- `.`(点) :任意字符
- `\d` (数字):`[0-9] `
- `\w` (数字、英文、下划线) :`[a-z0-9_]`
- `\s` (空白字符):`[ ]`
- `\D` (除了数字):`[^0-9]`
- `\W` (除了数字英文下划线) :`[^a-z0-9_]`
- `\S` (除了空白字符):`[^ ]`
- 行首、行尾
- `^` :行首
- `$`:行尾
- 逻辑
- `|` : 将两个匹配条件进行逻辑“或”(or)运算
### 量词
- 什么是量词
- `{n}`:刚好出现 n 次
- `{n,m}` 至少出现 n 次,最多 m 次
- 例子:查找 QQ 号
- 常用量词
- `{n,}` 至少 n 次,无上限
- `*` 任意次 `{0,}` 可以为0次,不建议使用
- `?` 零次或一次 `{0,1}`
```
固定电话:010-23456789-1234 或 23456789
(0\d{2,3}-)?[1-9]\d{7}(-\d{1,5})?
```
- `+` 一次或任意次`{1,}`
- `{n}` 正好 n 次
### 常用正则例子
- 表单校验实例
- 检验邮箱
- 行首行尾
- ```HTML
正则表达式应用
```
## JS Template 模板引擎
> https://www.jb51.net/article/100095.htm
### 1、特性
(1)、性能卓越,执行速度通常是 Mustache 与 tmpl 的 20 多倍(性能测试)
(2)、支持运行时调试,可精确定位异常模板所在语句(演示)
(3)、对 NodeJS Express 友好支持
(4)、安全,默认对输出进行转义、在沙箱中运行编译后的代码(Node版本可以安全执行用户上传的模板)
(5)、支持include语句
(6)、可在浏览器端实现按路径加载模板(详情)
(7)、支持预编译,可将模板转换成为非常精简的 js 文件
(8)、模板语句简洁,无需前缀引用数据,有简洁版本与原生语法版本可选
(9)、支持所有流行的浏览器
### 2、语法
(1)、使用
引用简洁语法的引擎版本,例如:` `
(2)、表达式
{{ 与 }} 符号包裹起来的语句则为模板的逻辑表达式。
`template('test', data)` : 渲染
(3)、输出表达式
对内容编码(转义)输出:` {{content}} `
不编码(转义)输出:` {{#content}} `
编码可以防止数据中含有 HTML 字符串,避免引起 XSS 攻击。
(4)、条件表达式
```html
{{if admin}}
admin
{{else if code > 0}}
master
{{else}}
error!
{{/if}}
```
(5)、遍历表达式
无论数组或者对象都可以用 each 进行遍历。
```html
{{each list as value index}}
{{index}} - {{value.user}}
{{/each}}
// 亦可以被简写:$ 特指当前函数中的变量
{{each list}}
{{$index}} - {{$value.user}}
{{/each}}
```
(6)、模板包含表达式
用于嵌入子模板。
`{{include 'template_name'}} `
子模板默认共享当前数据,亦可以指定数据:`{{include 'template_name' news_list}} `
(7)、辅助方法
使用 `template.defaults.imports.dateFormat = function(arg1,arg2){} `注册公用辅助方法:
```js
template.defaults.imports.dateFormat = function(arg1,arg2) {
// ..
return value;
});
```
模板中使用的方式:` {{time | dateFormat:'yyyy-MM-dd hh:mm:ss'}} `
支持传入参数与嵌套使用: `{{time | say:'cd' | ubb | link}} `
### 3、实例
```html
Document
```

```html
no escape-demo
不转义HTML
```

```html
include-demo
```

```html
```

# 表达式和运算符分类
左侧工具栏是按字母表排序的列表。
### 主要表达式
JavaScript中基本关键字和常用表达式。
- [`this`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/this)
`this` 关键字指向函数的执行上下文。
- [`function`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/function)
`function` 关键字定义了函数表达式。
- [`class`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/class)
`class` 关键字定义了类表达式。
- [`function*`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/function*)
`function*` 关键字定义了一个 generator 函数表达式。
- [`yield`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/yield)
暂停和恢复 generator 函数。
- [`yield*`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/yield*)
委派给另外一个generator函数或可迭代的对象。
- `async function`
`async function` 定义一个异步函数表达式。
- [`await`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/await)
暂停或恢复执行异步函数,并等待promise的resolve/reject回调。
- [`[\]`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array)
数组初始化/字面量语法。
- [`{}`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Object_initializer)
对象初始化/字面量语法。
- [`/ab+c/i`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp)
正则表达式字面量语法。
- [`( )`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Grouping)
分组操作符。
### 左表达式
左边的值是赋值的目标。
- [属性访问符](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Property_accessors)
成员运算符提供了对对象的属性或方法的访问 (`object.property` 和 `object["property"]`).
- [`new`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new)
`new` 运算符创建了构造函数实例。
- [`new.target`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new.target)
在构造器中,`new.target` 指向[`new`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new)调用的构造器。
- [`super`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/super)
`super` 关键字调用父类的构造器.
- [`...obj`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Spread_operator)
展开运算符可以将一个可迭代的对象在函数调用的位置展开成为多个参数,或者在数组字面量中展开成多个数组元素。
### 自增和自减
前置/后置自增运算符和前置/后置自减运算符.
- [`A++`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Increment)
后置自增运算符.
- [`A--`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Decrement)
后置自减运算符.
- [`++A`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Increment)
前置自增运算符.
- [`--A`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Decrement)
前置自减运算符.
### 一元运算符
一元运算符只有一个操作数.
- [`delete`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/delete)
`delete` 运算符用来删除对象的属性.
- [`void`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/void)
`void` 运算符表示表达式放弃返回值.
- [`typeof`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/typeof)
`typeof` 运算符用来判断给定对象的类型.
- [`+`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Unary_plus)
一元加运算符将操作转换为Number类型.
- [`-`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Unary_negation)
一元减运算符将操作转换为Number类型并取反.
- [`~`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_NOT)
按位非运算符.
- [`!`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Logical_Operators#Logical_NOT)
逻辑非运算符.
### 算术运算符
算术运算符以二个数值(字面量或变量)作为操作数,并返回单个数值。
- [`+`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Addition)
加法运算符.
- [`-`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Subtraction)
减法运算符.
- [`/`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Division)
除法运算符.
- [`*`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Multiplication)
乘法运算符.
- [`%`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Remainder)
取模运算符.
### 关系运算符
比较运算符比较二个操作数并返回基于比较结果的`Boolean`值。
- [`in`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/in)
`in运算符用来判断对象是否拥有给定属性`.
- [`instanceof`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/instanceof)
`instanceof` 运算符判断一个对象是否是另一个对象的实例.
- [`<`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Less_than_operator)
小于运算符
- [`>`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Greater_than_operator)
大于运算符.
- [`<=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Less_than_or_equal_operator)
小于等于运算符.
- [`>=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Greater_than_or_equal_operator)
大于等于运算符。
**注意: =>** 不是运算符,而是[`箭头函数`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Arrow_functions)的表示符。
### 相等运算符
如果相等,操作符返回的是Boolean(布尔)类型的true,否则是false。
- [`==`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Equality)
相等 运算符.
- [`!=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Inequality)
不等 运算符.
- [`===`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Identity)
全等 运算符.
- [`!==`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Nonidentity)
非全等 运算符.
### 位移运算符
在二进制的基础上对数字进行移动操作
- [`<<`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Left_shift)
按位左移运算符。
- [`>>`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Right_shift)
按位右移运算符。
- [`>>>`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Unsigned_right_shift)
按位无符号右移运算符。
### 二进制位运算符
二进制运算符将它们的操作数作为32个二进制位(0或1)的集合,并返回标准的JavaScript数值。
- [`&`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_AND)
二进制位与(AND)。
- [`|`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_OR)
二进制位或(OR)。
- [`^`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_XOR)
二进制位异或(XOR)。
### 二元逻辑运算符
逻辑运算符典型的用法是用于boolean(逻辑)值运算, 它们返回boolean值。
- [`&&`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Logical_Operators#Logical_AND)
逻辑与.
- [`||`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Logical_Operators#Logical_OR)
逻辑或.
### 条件(三元)运算符
- [`(condition ? ifTrue : ifFalse)`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Conditional_Operator)
条件元素运算符把两个结果中其中一个符合运算逻辑的值返回。
### 赋值运算符
赋值元素符会将右边的操作数的值分配给左边的操作数,并将其值修改为右边操作数相等的值。
- [`=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Assignment)
赋值运算符。
- [`*=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Multiplication_assignment)
赋值乘积。
- [`/=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Division_assignment)
赋值商。
- [`%=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Remainder_assignment)
赋值求余。
- [`+=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Addition_assignment)
赋值求和。
- [`-=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Subtraction_assignment)
赋值求差。
- [`<<=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Left_shift_assignment)
左位移。
- [`>>=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Right_shift_assignment)
右位移。
- [`>>>=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Unsigned_right_shift_assignment)
无符号右位移。
- [`&=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Bitwise_AND_assignment)
赋值与。
- [`^=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Bitwise_XOR_assignment)
赋值按位异或。
- [`|=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Bitwise_OR_assignment)
赋值或。
- [`[a, b\] = [1, 2]`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment) [`{a, b} = {a:1, b:2}`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment)
解构赋值允许你分配数组或者对象变量的属性通过使用规定的语法,其看起来和数组和对象字面量很相似。
- 逗号操作符
- [`,`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comma_Operator)
逗号操作符允许在一个判断状态中有多个表达式去进行运算并且最后返回最后一个表达式的值。