扁平数组构建DOM树
interface IOrganizationNode {
id: string;
code: string;
name: string;
localName: string;
localNameLocale: string;
parentCode: string;
description: string;
children?: IOrganizationNode[];
}
interface IOrganizationTree {
organizationTree: IOrganizationNode[];
}
interface IOrganization {
id: string;
code: string;
name: string;
localName: string;
localNameLocale: string;
parentCode: string;
description: string;
}
export class OrganizationTree {
public static GenerateOrganizationsDom: string = "GenerateOrganizationsDom" + _gcEditingInput;
public static createTreeDom(array: IOrganization[]): HTMLElement {
let DOMObject: HTMLElement = document.createElement("div");
DOMObject.className = "select-user-tree-container";
let organizationTree: IOrganizationTree = OrganizationTree.CreateTreeData(array);
DOMObject.appendChild(OrganizationTree.CreateTreeDom(organizationTree.organizationTree, true));
this._bindEvent(DOMObject);
return DOMObject;
}
private static CreateTreeData(array: IOrganization[]): IOrganizationTree {
let r: IOrganizationNode[] = [];
let codeToOrganizationMap: Dictionary<IOrganization> = {};
let len = array.length;
let orgs: IOrganization[] = [];
//deep copy
for (let i = 0; i < len; i++) {
let org: any = {};
for (var attr in array[i]) {
org[attr] = array[i][attr];
}
orgs.push(org);
}
for (let i = 0; i < len; i++) {
codeToOrganizationMap[orgs[i].code] = orgs[i];
}
for (let j = 0; j < len; j++) {
let org: IOrganizationNode = orgs[j];
let parentOrg: IOrganizationNode = codeToOrganizationMap[org.parentCode];
if (parentOrg) {
if (parentOrg.children) {
parentOrg.children.push(org);
} else {
parentOrg.children = [];
parentOrg.children.push(org);
}
} else {
r.push(org);
}
}
let result: any = {};
result.organizationTree = r;
return result;
}
private static CreateTreeDom(treeNodes: IOrganizationNode[], top?: boolean): HTMLElement {
let ul = document.createElement("ul") as HTMLUListElement;
if (top) {
ul.classList.add("tree");
ul.classList.add("tree-root");
//ul.classList.add("tree", "tree-root");//chrome unsupport
} else {
ul.classList.add("tree");
}
for (let i = 0; i < treeNodes.length; i++) {
let li = document.createElement("li") as HTMLLIElement;
li.classList.add("tree-node");
let a = document.createElement("a") as HTMLAnchorElement;
a.classList.add("tree-node-label");
let spanName = document.createElement("span") as HTMLSpanElement;
spanName.classList.add("tree-node-name");
spanName.innerText = treeNodes[i].name;
spanName["GCSK_OrganizationCode"] = treeNodes[i].code;
let spanArrow = document.createElement("span") as HTMLSpanElement;
spanArrow.classList.add("tree-node-arrow");
a.appendChild(spanName);
a.appendChild(spanArrow);
li.appendChild(a);
if (treeNodes[i].children) {
li.classList.add("tree-node-haschildren");
li.appendChild(OrganizationTree.CreateTreeDom(treeNodes[i].children));
}
ul.appendChild(li);
}
return ul;
}
private static _bindEvent(DOMObject: HTMLElement) {
let self = this;
GC$(DOMObject).bind("click", (event) => {
let srcElement = <HTMLElement>(event.srcElement || event.target);
if (srcElement.classList.contains("tree-node-name")) {
let liElement = srcElement.parentElement.parentElement;
// first remove all <li> classname
Array.prototype.forEach.call(DOMObject.querySelectorAll(".tree-node"), item => { item.classList.remove("tree-node-selected"); });
//then add current <li>
if (liElement.classList.contains("tree-node-haschildren")) {
liElement.classList.add("tree-node-opened");
}
liElement.classList.add("tree-node-selected");
var evt = document.createEvent("UIEvent") as UIEvent;
evt.initEvent(OrganizationTree.GenerateOrganizationsDom, true, false);
evt["GCSK_OrganizationCode"] = srcElement["GCSK_OrganizationCode"];
liElement.dispatchEvent(evt);
} else if (srcElement.classList.contains("tree-node-arrow")) {
let liElement = srcElement.parentElement.parentElement;
if (srcElement.parentElement.parentElement.classList.contains("tree-node-opened")) {
liElement.classList.remove("tree-node-opened");
} else {
liElement.classList.add("tree-node-opened");
}
}
});
}
}
扁平数组构建DOM树的更多相关文章
- 从Chrome源码看浏览器如何构建DOM树
.aligncenter { clear: both; display: block; margin-left: auto; margin-right: auto } p { font-size: 1 ...
- HTML文档解析和DOM树的构建
浏览器解析HTML文档生成DOM树的过程,以下是一段HTML代码,以此为例来分析解析HTML文档的原理 <!DOCTYPE html> <html lang="en&quo ...
- WebKit Inside: DOM树的构建
当客户端App主进程创建WKWebView对象时,会创建另外两个子进程:渲染进程与网络进程.主进程WKWebView发起请求时,先将请求转发给渲染进程,渲染进程再转发给网络进程,网络进程请求服务器.如 ...
- 【浏览器渲染原理】渲染树构建之渲染树和DOM树的关系(转载 学习中。。。)
在DOM树构建的同时,浏览器会构建渲染树(render tree).渲染树的节点(渲染器),在Gecko中称为frame,而在webkit中称为renderer.渲染器是在文档解析和创建DOM节点后创 ...
- jquery: json树组数据输出到表格Dom树的处理方法
项目背景 项目中需要把表格重排显示 处理方法 思路主要是用历遍Json数组把json数据一个个append到5个表格里,还要给每个单元格绑定个单击弹出自定义对话框,表格分了单双行,第一行最后还要改ro ...
- 【VB6】使用VB6创建和访问Dom树【爬虫基础知识 】
使用VB6创建和访问Dom树 关键字:VB,DOM,HTML,爬虫,IHTMLDocument 我们知道,在VB中一般大家会用WebBrowser来获取和操作dom对象. 但是,有这样一种情形,却让我 ...
- dom树的介绍,及原理分析
三.解析和DOM树的构建 1.解析: 由于解析渲染引擎是一个非常重要的过程,我们将会一步步的深入,现在让我们来介绍解析. 解析一个文档,意味着把它转换为一个有意义的结构——代码可以了解和使用的东西,解 ...
- JS的Dom树小结
一[DOM树节点] DOM节点分为三大类:元素节点.文本节点.属性节点 文本节点.属性节点,为元素节点的两个子节点: 通过getElement系列方法,可以去到元素节点. 二[查看节点] ...
- DOM树节点和事件
一.前言:DOM树节点是JS的基础语句.通过节点,能够取到HTML代码中的任意标签,从而对其进行修改和添加各种视觉效果. 二.DOM树节点 DOM节点分为三大类: 元素节点,属性节点,文本节点 ...
随机推荐
- js 创建Table,每行3列的方式
table: <table style="width:100%" id="appDatas"></table> 1. var table ...
- TOML简介 (转) TOML的由来
TOML的由来 配置文件的使用由来已久,从.ini.XML.JSON.YAML再到TOML,语言的表达能力越来越强,同时书写便捷性也在不断提升. TOML是前GitHub CEO, Tom Prest ...
- java 遍历Map的4种方法
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...
- python测试开发django-56.模板渲染markdown语法+代码高亮
前言 上一篇已经实现在xadmin后台编辑markdown语法的文档,编辑完成之后发布博客,在前端html能把markdown语法显示出来. 主要思路是先从数据库把markdown的代码读出来,导入m ...
- mysql 正则表达式判断是否数字
select ('123a' REGEXP '[^0-9.]'); --‘123a'中含有字符'a' 输出结果为1 mysql中常量true输出为1 false输出为0
- golang time打印出的值是62135596800的来源
' 减去62135596800是将"以公元1年1月1日0点为基准"改成"以1970年1月1日0点"为基准 所以,数据库datetime的默认值 : 0000-0 ...
- Linux压力测试工具stress的参数详解
为了测试服务器的负载情况,可以使用stress这个压力测试工具,可以在环境上验证测试下. stress安装 sudo yum install -y epel-release sudo yum inst ...
- Xtrabackup简介
Xtrabackup是由 Percona 开发的一个开源软件,可实现对 InnoDB 的数据备份,支持在线热备份(备份时不影响数据读写),特点如下: 备份过程快速.可靠: 备份过程不会打断正在执行的事 ...
- mysql基础SQL练习
许久收藏的练习mysql语句的,现在看来任然有学习价值! 表如下: Student(Sid,Sname,Sage,Ssex) 学生表 Course(Cid,Cname,Tid) 课程表 SC(Sid, ...
- 说说Python编码规范
前言 已有近两个月没有发表过文章了,前段时间外甥和女儿过来这边渡暑假,平常晚上和周末时间都陪着她们了,趁这个周末有空,再抽空再把这块拾起来. 这么久没写了,再次拿起键盘,想想,发表些什 ...