# NodeInterface
在 DOM 的 `Node` 节点上进行扩展
类型:`NodeInterface`
## 创建 `NodeInterface` 对象
使用引擎内提供的 `$` 节点选择器来实例化 `NodeInterface` 对象
```ts
import { $ } from '@aomao/engine';
//使用CSS选择器查找节点
const content = $('.content');
//创建节点
const div = $('
');
document.body.append(div[0]);
//转换
const p = $(document.querySelector('p'));
const target = $(event.target);
```
## 属性
### `length`
Node 节点集合长度
类型:`number`
### `events`
当前对象中所有 Node 节点的事件对象集合
类型:`EventInterface[]`
### `document`
当前 Node 节点所在的 Document 对象。在使用 iframe 中,不同框架中的 document 并是不一致的,还有一些其它环境中也是如此,所以我们需要跟随这个对象。
类型:`Document | null`
### `window`
当前 Node 节点所在的 Window 对象。在使用 iframe 中,不同框架中的 window 并是不一致的,还有一些其它环境中也是如此,所以我们需要跟随这个对象。
类型:`Window | null`
### `context`
上下文节点
类型:`Context | undefined`
### `name`
节点名称
类型:`string`
### `type`
节点类型,与 `Node.nodeType` 一致 [API](https://developer.mozilla.org/zh-CN/docs/Web/API/Node/nodeType)
类型:`number | undefined`
### `display`
节点显示状态
类型:`string | undefined`
### `isFragment`
当前对象中的 Node 节点集合是否是框架片段
类型:`boolean`
### `[n: number]`
Node 节点集合,可以通过下标索引访问
返回类型:Node
## 方法
### `each`
遍历当前对象内的所有 Node 节点
```ts
/**
* 遍历
* @param {Function} callback 回调函数
* @return {NodeInterface} 返回当前实例
*/
each(
callback: (node: Node, index: number) => boolean | void,
): NodeInterface;
```
### `toArray`
把当前对象内的所有 Node 节点转换为数组
```ts
toArray(): Array;
```
### `isElement`
当前节点是否为 Node.ELEMENT_NODE 节点类型
```ts
isElement(): boolean;
```
### `isText`
当前节点是否为 Node.TEXT_NODE 节点类型
```ts
isText(): boolean;
```
### `isCard`
当前节点是否为 Card 组件
```ts
isCard(): boolean;
```
### `isBlockCard`
当前节点是否为 block 类型的 Card 组件
```ts
isBlockCard(): boolean;
```
### `isInlineCard`
当前节点是否为 inline 类型的 Card 组件
```ts
isInlineCard(): boolean;
```
### `isEditableCard`
是否是可编辑的卡片
```ts
isEditableCard(): boolean;
```
### `isRoot`
是否为根节点
```ts
isRoot(): boolean;
```
### `isEditable`
是否为可编辑节点
```ts
isEditable(): boolean;
```
### `inEditor`
是否在根节点内
```ts
inEditor(): boolean;
```
### `isCursor`
是否是光标标记节点
```ts
isCursor(): boolean
```
### `get`
获取当前 Node 节点
```ts
get(): E | null;
```
### `eq`
获取当前第 index 个节点
```ts
/**
* 获取当前第 index 节点
* @param {number} index
* @return {NodeInterface|undefined} NodeInterface 类,或 undefined
*/
eq(index: number): NodeInterface | undefined;
```
### `index`
获取当前节点所在父节点中的索引,仅计算节点类型为 ELEMENT_NODE 的节点
```ts
/**
* 获取当前节点所在父节点中的索引,仅计算节点类型为ELEMENT_NODE的节点
* @return {number} 返回索引
*/
index(): number;
```
### `parent`
获取当前节点父节点
```ts
/**
* 获取当前节点父节点
* @return {NodeInterface} 父节点
*/
parent(): NodeInterface | undefined;
```
### `children`
查询当前节点的所有子节点
```ts
/**
*
* @param {Node | string} selector 查询器
* @return {NodeInterface} 符合条件的子节点
*/
children(selector?: string): NodeInterface;
```
### `first`
获取当前节点第一个子节点
```ts
/**
* 获取当前节点第一个子节点
* @return {NodeInterface} NodeInterface 子节点
*/
first(): NodeInterface | null;
```
### `last`
获取当前节点最后一个子节点
```ts
/**
* 获取当前节点最后一个子节点
* @return {NodeInterface} NodeInterface 子节点
*/
last(): NodeInterface | null;
```
### `prev`
返回节点之前的兄弟节点(包括文本节点、注释节点)
```ts
/**
* 返回节点之前的兄弟节点(包括文本节点、注释节点)
* @return {NodeInterface} NodeInterface 节点
*/
prev(): NodeInterface | null;
```
### `next`
返回节点之后的兄弟节点(包括文本节点、注释节点)
```ts
/**
* 返回节点之后的兄弟节点(包括文本节点、注释节点)
* @return {NodeInterface} NodeInterface 节点
*/
next(): NodeInterface | null;
```
### `prevElement`
返回节点之前的兄弟节点(不包括文本节点、注释节点)
```ts
/**
* 返回节点之前的兄弟节点(不包括文本节点、注释节点)
* @return {NodeInterface} NodeInterface 节点
*/
prevElement(): NodeInterface | null;
```
### `nextElement`
返回节点之后的兄弟节点(不包括文本节点、注释节点)
```ts
/**
* 返回节点之后的兄弟节点(不包括文本节点、注释节点)
* @return {NodeInterface} NodeInterface 节点
*/
nextElement(): NodeInterface | null;
```
### `getPath`
返回节点所在根节点路径,默认根节点为 document.body
```ts
/**
* 返回节点所在根节点路径,默认根节点为 document.body
* @param {Node} context 根节点,默认为 document.body
* @return {number} 路径
*/
getPath(context?: Node | NodeInterface): Array;
```
### `contains`
判断节点是否包含要查询的节点
```ts
/**
* 判断节点是否包含要查询的节点
* @param {NodeInterface | Node} node 要查询的节点
* @return {Boolean} 是否包含
*/
contains(node: NodeInterface | Node): boolean;
```
### `find`
根据查询器查询当前节点
```ts
/**
* 根据查询器查询当前节点
* @param {String} selector 查询器
* @return {NodeInterface} 返回一个 NodeInterface 实例
*/
find(selector: string): NodeInterface;
```
### closest
根据查询器查询符合条件的离当前节点最近的父节点
```ts
/**
* 根据查询器查询符合条件的离当前节点最近的父节点
* @param {string} selector 查询器
* @return {NodeInterface} 返回一个 NodeInterface 实例
*/
closest(
selector: string,
callback?: (node: Node) => Node | undefined,
): NodeInterface;
```
### `on`
为当前节点绑定事件
```ts
/**
* 为当前节点绑定事件
* @param {String} eventType 事件类型
* @param {Function} listener 事件函数
* @return {NodeInterface} 返回当前实例
*/
on(eventType: string, listener: EventListener): NodeInterface;
```
### `off`
移除当前节点事件
```ts
/**
* 移除当前节点事件
* @param {String} eventType 事件类型
* @param {Function} listener 事件函数
* @return {NodeInterface} 返回当前实例
*/
off(eventType: string, listener: EventListener): NodeInterface;
```
### `getBoundingClientRect`
获取当前节点相对于视口的位置
```ts
/**
* 获取当前节点相对于视口的位置
* @param {Object} defaultValue 默认值
* @return {Object}
* {
* top,
* bottom,
* left,
* right
* }
*/
getBoundingClientRect(defaultValue?: {
top: number;
bottom: number;
left: number;
right: number;
}):
| { top: number; bottom: number; left: number; right: number }
| undefined;
```
### `removeAllEvents`
移除当前节点所有已绑定的事件
```ts
/**
* 移除当前节点所有已绑定的事件
* @return {NodeInterface} 当前 NodeInterface 实例
*/
removeAllEvents(): NodeInterface;
```
### `offset`
获取当前节点相对父节点的偏移量
```ts
/**
* 获取当前节点相对父节点的偏移量
*/
offset(): number;
```
### `attributes`
获取或设置节点属性
```ts
/**
* 获取或设置节点属性
* @param {string|undefined} key 属性名称,key为空获取所有属性,返回Map
* @param {string|undefined} val 属性值,val为空获取当前key的属性,返回string|null
* @return {NodeInterface|{[k:string]:string}} 返回值或当前实例
*/
attributes(): { [k: string]: string };
attributes(key: { [k: string]: string }): string;
attributes(key: string, val: string | number): NodeInterface;
attributes(key: string): string;
attributes(
key?: string | { [k: string]: string },
val?: string | number,
): NodeInterface | { [k: string]: string } | string;
```
### `removeAttributes`
移除节点属性
```ts
/**
* 移除节点属性
* @param {String} key 属性名称
* @return {NodeInterface} 返当前实例
*/
removeAttributes(key: string): NodeInterface;
```
### `hasClass`
判断节点是否包含某个 class
```ts
/**
* 判断节点是否包含某个 class
* @param {String} className 样式名称
* @return {Boolean} 是否包含
*/
hasClass(className: string): boolean;
```
### `addClass`
为节点增加一个 class
```ts
/**
*
* @param {string} className
* @return {NodeInterface} 返当前实例
*/
addClass(className: string): NodeInterface;
```
### `removeClass`
移除节点 class
```ts
/**
* 移除节点 class
* @param {String} className
* @return {NodeInterface} 返当前实例
*/
removeClass(className: string): NodeInterface;
```
### `css`
获取或设置节点样式
```ts
/**
* 获取或设置节点样式
* @param {String|undefined} key 样式名称
* @param {String|undefined} val 样式值
* @return {NodeInterface|{[k:string]:string}} 返回值或当前实例
*/
css(): { [k: string]: string };
css(key: { [k: string]: string | number }): NodeInterface;
css(key: string): string;
css(key: string, val: string | number): NodeInterface;
css(
key?: string | { [k: string]: string | number },
val?: string | number,
): NodeInterface | { [k: string]: string } | string;
```
### `width`
获取节点宽度
```ts
/**
* 获取节点宽度
* @return {number} 宽度
*/
width(): number;
```
### `height`
获取节点高度
```ts
/**
* 获取节点高度
* @return {Number} 高度
*/
height(): number;
```
### `html`
获取或设置节点 html 文本
```ts
/**
* 获取或设置节点html文本
*/
html(): string;
html(html: string): NodeInterface;
html(html?: string): NodeInterface | string;
```
### `text`
```ts
/**
* 获取或设置节点文本
*/
text(): string;
text(text: string): NodeInterface;
text(text?: string): string | NodeInterface;
```
### `show`
设置节点为显示状态
```ts
/**
* 设置节点为显示状态
* @param {String} display display值
* @return {NodeInterface} 当前实例
*/
show(display?: string): NodeInterface;
```
### `hide`
设置节点为隐藏状态
```ts
/**
* 设置节点为隐藏状态
* @return {NodeInterface} 当前实例
*/
hide(): NodeInterface;
```
### `remove`
移除当前实例所有节点
```ts
/**
* 移除当前实例所有节点
* @return {NodeInterface} 当前实例
*/
remove(): NodeInterface;
```
### `empty`
清空节点下的所有子节点,包括文本
```ts
/**
* 清空节点下的所有子节点
* @return {NodeInterface} 当前实例
*/
empty(): NodeInterface;
```
### `equal`
比较两个节点是否相同,包括引用地址
```ts
/**
* 比较两个节点是否相同
* @param {NodeInterface|Node} node 比较的节点
* @return {Boolean} 是否相同
*/
equal(node: NodeInterface | Node): boolean;
```
### `clone`
复制节点
```ts
/**
* 复制节点
* @param deep 是否深度复制
*/
clone(deep?: boolean): NodeInterface;
```
### `prepend`
在节点的开头插入指定内容
```ts
/**
* 在节点的开头插入指定内容
* @param {Selector} selector 选择器或节点
* @return {NodeInterface} 当前实例
*/
prepend(selector: Selector): NodeInterface;
```
### `append`
在节点的结尾插入指定内容
```ts
/**
* 在节点的结尾插入指定内容
* @param {Selector} selector 选择器或节点
* @return {NodeInterface} 当前实例
*/
append(selector: Selector): NodeInterface;
```
### `before`
在节点前插入新的节点
```ts
/**
* 在节点前插入新的节点
* @param {Selector} selector 选择器或节点
* @return {NodeInterface} 当前实例
*/
before(selector: Selector): NodeInterface;
```
### `after`
在节点后插入内容
```ts
/**
* 在节点后插入内容
* @param {Selector} selector 选择器或节点
* @return {NodeInterface} 当前实例
*/
after(selector: Selector): NodeInterface;
```
### `replaceWith`
将节点替换为新的内容
```ts
/**
* 将节点替换为新的内容
* @param {Selector} selector 选择器或节点
* @return {NodeInterface} 当前实例
*/
replaceWith(selector: Selector): NodeInterface;
```
### `getRoot`
获取节点所在编辑区域的根节点
```ts
/**
* 获取节点所在编辑区域的根节点
*/
getRoot(): NodeInterface;
```
### `traverse`
遍历所有子节点
```ts
/**
* 遍历所有子节点
* @param callback 回调函数,false:停止遍历 ,true:停止遍历当前节点及子节点,继续遍历下一个兄弟节点
* @param order true:顺序 ,false:倒序,默认 true
*/
traverse(
callback: (node: NodeInterface) => boolean | void,
order?: boolean,
): void;
```
### `getChildByPath`
根据路径获取子节点
```ts
/**
* 根据路径获取子节点
* @param path 路径
*/
getChildByPath(path: Path, filter?: (node: Node) => boolean): Node;
```
### `getIndex`
获取当前节点所在父节点中的索引
```ts
/**
* 获取当前节点所在父节点中的索引
*/
getIndex(filter?: (node: Node) => boolean): number;
```
### `findParent`
在指定容器里获取父节点
```ts
/**
* 在指定容器里获取父节点
* @param container 容器节点,默认为编辑器根节点
*/
findParent(container?: Node | NodeInterface): NodeInterface | null;
```
### `allChildren`
获取节点下的所有子节点
```ts
/**
* 获取节点下的所有子节点
*/
allChildren(): Array;
```
### `getViewport`
返回当前节点或者传入的节点所在当前节点的顶级 window 对象的视图边界
```ts
/**
* 返回当前节点或者传入的节点所在当前节点的顶级window对象的视图边界
* @param node 节点
*/
getViewport(
node?: NodeInterface,
): { top: number; left: number; bottom: number; right: number };
```
### `inViewport`
判断 view 是否在 node 节点根据当前节点的顶级 window 对象计算的视图边界内
```ts
/**
* 判断view是否在node节点根据当前节点的顶级window对象计算的视图边界内
* @param node 节点
* @param view 是否在视图的节点
*/
inViewport(node: NodeInterface, view: NodeInterface): boolean;
```
### `scrollIntoView`
如果 view 节点不可见,将滚动到 align 位置,默认为 nearest
```ts
/**
* 如果view节点不可见,将滚动到align位置,默认为nearest
* @param node 节点
* @param view 视图节点
* @param align 位置
*/
scrollIntoView(
node: NodeInterface,
view: NodeInterface,
align?: 'start' | 'center' | 'end' | 'nearest',
): void;
```