最近公司的很多项目都涉及到了海量操作 之前说好的插件基本上都趴了
无奈只好自己动手写了
(别问我 为什么不用类似分页之类的方法解决,客户说不行)
解决了3处:图片相册 树形插件 缩略图
以树形插件为例 来和大家探讨下 海量操作下的JS编码
web上的树形插件不少 之前也写过几个 很简单 但是在以10W个子节点的加载情况下 运行的效果确实很糟糕
(另外 我会告诉你客户要求的是IE8么。。。。)
firefox下 展开10W个节点的时间花费 基本上在5-10S左右
所以只好放弃 普通的tree插件 改用即时渲染的方式来加载
窗体一次性只显示大约30-50条 因为节点的请求是异步的。。。。(废话)
所以构思在于 在js代码里维护一套自己的数据流(数据树) 对异步请求回来的数据进行动态的填充和记录索引
并对每条数据进行必要的属性编辑 包括上下节点的关系 即时绘制的处理方式(后面会提及)
另外 因为是tree型插件 所以有必要返回一个操作对象 给web 方便其他空间调用
大概的一个编码方式如下
这里是以JQ插件的形式做的论述 其他不做详解
主要的注意点 在于:
1.各个职能独立 这样的编码规范 可以让你在编码的时候更加有侧重点
2.数据处理 与页面渲染 完全分开 上述的行为如再细分的话 可以再划分一处事件处理机制的响应
3.return出来的manager 可以极大的方便插件整合至项目中时 对其它的插件的编码影响
无奈只好自己动手写了
(别问我 为什么不用类似分页之类的方法解决,客户说不行)
解决了3处:图片相册 树形插件 缩略图
以树形插件为例 来和大家探讨下 海量操作下的JS编码
web上的树形插件不少 之前也写过几个 很简单 但是在以10W个子节点的加载情况下 运行的效果确实很糟糕
(另外 我会告诉你客户要求的是IE8么。。。。)
firefox下 展开10W个节点的时间花费 基本上在5-10S左右
所以只好放弃 普通的tree插件 改用即时渲染的方式来加载
窗体一次性只显示大约30-50条 因为节点的请求是异步的。。。。(废话)
所以构思在于 在js代码里维护一套自己的数据流(数据树) 对异步请求回来的数据进行动态的填充和记录索引
并对每条数据进行必要的属性编辑 包括上下节点的关系 即时绘制的处理方式(后面会提及)
另外 因为是tree型插件 所以有必要返回一个操作对象 给web 方便其他空间调用
大概的一个编码方式如下
$.fn.extend({
// config 配置文件 主要包括 独特功能的开关 如:是否第一次就进行ajax请求
tree : function ( config ){
var tree_data,
ajax_data,
init_GUI,
data_control_tool,
manager;
init_GUI = {
/*!
* 初始化tree插件界面 包括放置必要的 DOM元素
*/
function(){}
};
ajax_data = {
/*!
* 这里放置 ajax请求
* 对 请求回来的数据 填充致tree_data中 并记录索引 建议以路径的方式记录:0-0-0-0-1
* 另外 进行节点的属性编辑
*/
function(){}......
};
data_control_tool = {
/*!
* 这里放置 对数据的处理 返回一个应该符合界面展示的结果 并支持即时绘制渲染
* 每一条属性根据上下点的关系 进行动态的属性编辑
*/
function(){}.......
};
manager = {
/*!
* 返回致前端的管理对象 这里不做详细累述
* ps:这里的function应该尽量的 短小 仅仅只是作为提供外部API接口
*/
function(){}......
};
return manager;
};
});
这里是以JQ插件的形式做的论述 其他不做详解
主要的注意点 在于:
1.各个职能独立 这样的编码规范 可以让你在编码的时候更加有侧重点
2.数据处理 与页面渲染 完全分开 上述的行为如再细分的话 可以再划分一处事件处理机制的响应
3.return出来的manager 可以极大的方便插件整合至项目中时 对其它的插件的编码影响
上面3点 只做抛砖引玉之用
欢迎大神们吐槽