扁平数组构建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节点分为三大类: 元素节点,属性节点,文本节点 ...
随机推荐
- 生成Area URL链接
关于Area的URL链接生成,可以分为这么三种情况:第一种是在当前Area生成指向当前Area的链接:第二种是生成指向其他Area的链接:第三种是在某个Area中生成指向根目录的链接.下面是这三种情况 ...
- sql注入--基于报错的注入
这是经典的sqli-labs 中的less-5 问题首先通过几个常见的进行测试, 发现只要正确的话就会输出you are in.... 并不能绕过,因此不能出现敏感信息,因此要用一种新思路(参考白帽学 ...
- Nand_ECC_校验和纠错_详解
word下载 ECC的全称是Error Checking and Correction,是一种用于Nand的差错检测和修正算法.如果操作时序和电路稳定性不存在问题的话,NAND Flash出错的时候一 ...
- F - 质数检测 V2
https://vjudge.net/contest/218366 Java解 import java.math.BigInteger; import java.util.Scanner; publi ...
- Vmware下mint os的安装
在vmware 11中,mint倒是很好安装.直接读取iso文件,会自动进入一个类似WindowsPE的安装系统,直接双击开始安装就好,比较傻瓜化. 但是安装好了,字体太小,看着很不舒服,于是就倒腾V ...
- 前端工程化系列[04]-Grunt构建工具的使用进阶
在前端工程化系列[02]-Grunt构建工具的基本使用和前端工程化系列[03]-Grunt构建工具的运转机制这两篇文章中,我们对Grunt以及Grunt插件的使用已经有了初步的认识,并探讨了Grunt ...
- 【MAC】Mac下部分常用的小工具
Homebrew: 官方介绍:The missing package manager for OS X(OS X 不可或缺的套件管理器) /usr/bin/ruby -e "$(curl - ...
- 简单理解 RPC(转载)
原文地址:http://www.syyong.com/architecture/Simple-understanding-of-RPC.html RPC(Remote Procedure Call P ...
- 通过一个小Trick实现shader的像素识别/统计操作
2018/12/14日补充:后来发现compute shader里用AppendStructuredBuffer可以解决这类问题,请看这里:https://www.cnblogs.com/hont/p ...
- Windows上使用Vagrant打造Laravel Homestead可协同跨平台开发环境
1.简介 Laravel 致力于让整个 PHP 开发过程变得让人愉悦,包括本地开发环境,为此官方为我们提供了一整套本地开发环境 —— Laravel Homestead. Laravel Homest ...