资讯专栏INFORMATION COLUMN

HT for Web的HTML5树组件延迟加载技术实现

youkede / 1920人阅读

摘要:整体的思路是这样子的,当然这离我们要实现的树组件的延迟加载技术还有些差距,那么,的树组件的延迟加载技术是怎么实现的呢不要着急,马上开始探讨。

HT for Web的HTML5树组件有延迟加载的功能,这个功能对于那些需要从服务器读取具有层级依赖关系数据时非常有用,需要获取数据的时候再向服务器发起请求,这样可减轻服务器压力,同时也减少了浏览器的等待时间,让页面的加载更加流畅,增强用户体验。
进入正题,今天用来做演示的Demo是,客户端请求服务器读取系统文件目录结构,通过HT for Web的HTML5树组件显示系统文件目录结构。
首先,我们先来设计下服务器,这次Demo的服务器采用Node.js,用到了Node.js的express、socket.io、fs和http这四个模块,Node.js的相关知识,我在这里就不阐述了,网上的教材一堆,这里推荐下socket.io的相关入门http://socket.io/get-started/chat/。
服务端代码代码:

var fs = require("fs"),
    express = require("express"),
    app = express(),
    server = require("http").createServer(app),
    io = require("socket.io")(server),
    root = ‘/Users/admin/Projects/ht-for-web/guide‘;

io.on("connection", function(socket){
    socket.on("explore", function(url){
        socket.emit("file", walk(url || root));
    });
});

app.use(express.static("/Users/admin/Projects/ht-for-web"));

server.listen(5000, function(){
    console.log("server is listening at port 5000");
});

io监听了connection事件,并获得一个socket;socket再监听一个叫explore的自定义事件,通过url参数获取到数据后,派发一个叫file的自定义事件,供客户端监听并做相应处理;通过app.use结合express.static设置项目路径;最后让server监听5000端口。
到此,一个简单的服务器就搭建好了,现在可以通过http://localhost:5000来访问服务器了。等等,好像缺了点什么。对了,获取系统文件目录结构的方法忘记给了,OK,那么我们就先来看看获取整站文件的代码是怎么写的:

function walk(pa) {
    var dirList = fs.readdirSync(pa),
        key = pa.substring(pa.lastIndexOf("/") + 1),
        obj = {
            name: key,
            path: pa,
            children: [],
            files: []
        };
    dirList.forEach(function(item) {
        var stats = fs.statSync(pa + "/" + item);
        if (stats.isDirectory()) {
            obj.children.push(walk(pa + "/" + item));
        }
        else {
            obj.files.push({name: item, dir: pa + "/" + item});
        }
    });

    return obj;
}

如大家所见,采用递归的方式,逐层遍历子目录,代码也没什么高深的地方,相信大家都看得懂。那我们来看看运行效果吧:

duang~文件目录结构出来了,是不是感觉酷酷的,这代码量不小吧。其实,代码并不多,贴出来大家瞅瞅:




    
    tree-loader
    
    
    




这就是全部的HTML代码,加上空行总共也就50几行,怎么样,有没有感觉HT for Web很强大。废话不多说,来看看这些代码都干了些什么:

要用到socket.io就需要在页面引入,其实在我的项目中并不存在/socket.io/socket.io.js文件,但是却能正常使用,具体什么原因,我就不多说,大家自己研究去吧;

最重要的是要引入HT for Web的核心包,这个包不引入的话,下面的HT for Web组件就无法使用;

接下来就是代码了,首先创建一个数据容器DataModel,用来存放文件目录的节点数据,再创建一个TreeView对象并引用刚创建到数据容器,接下来通过socket监听file事件,获取服务器返回的数据,在回调函数中通过调用createChildren和createFiles函数,创建文件目录节点对象,并添加到数据容器中,最后是向服务器发起数据请求,即通过socket派发explore事件。

整体的思路是这样子的,当然这离我们要实现的树组件的延迟加载技术还有些差距,那么,HT for Web的HTML5树组件的延迟加载技术是怎么实现的呢?不要着急,马上开始探讨。
首先我们需要改造下获取文件目录的方法walk,因为前面介绍的方法中,使用的是加载整站文件目录,所以我们要将walk方法改造成只获取一级目录结构,改造起来很简单,就是将递归部分改造成获取当前节点就可以了,具体代码如下:

obj.children.push(walk(pa + "/" + item));
// 将上面对代码改成下面的代码
obj.children.push({name: item, path: pa + "/" + item});

这样子服务器就只请求当前请求路径下的第一级文件目录结构。接下来就是要调整下客户端代码了,首先需要给tree设置上loader:

tree.setLoader({
    load: function(data) {
        socket.emit("explore", data.a("path"));
        data.a("loaded", true);
    },
    isLoaded: function(data) {
        return data.a("loaded");
    }
});

loader包含了两个方法,load和isLoaded,这两个方法的功能分别是加载数据和判断数据是否已经加载,在load方法中,对socket派发explore事件,当前节点的path为参数,向服务器请求数据,之后将当前节点的loaded属性设置为true;在isLoaded方法中,返回当前节点的loaded属性,如果返回为true,那么tree将不会在执行load方法向服务器请求数据。
接下来需要移除createChildren的两个回调方法,并且在createFiles方法中为创建出来的节点的loaded属性设置成true,这样在不是目录的节点前就不会有展开的图标。createChildren和createFiles两个方法修改后的代码如下:

function createChildren(children, parent, dm) {
    children.forEach(function(child) {
        var n = createData(child, parent);
        dm.add(n);
    });
}

function createFiles(files, parent, dm){
    files.forEach(function(file){
        var n = createData(file, parent);
        n.a("loaded", true);
        dm.add(n);
    });
}

如此,HT for Web的HTML5树组件延迟加载技术就设计完成了,我在服务器的控制台打印出请求路径,看看这个延迟加载是不是真的,如下图:


看吧,控制台打印的是4条记录,第一条是请求跟目录时打印的,我在浏览器中展开里三个目录,在控制台打印了其对应的目录路径。
等等,现在这个目录看起来好烦,只有文字,除了位子前的展开图标可以用来区别文件和目录外,没有其他什么区别,所以我决定对其进行一番改造,让每一级目录都有图标,而且不同文件对应不同的图标,来看看效果吧:

怎么样,是不是一眼就能看出是什么文件,这个都是样式上面的问题,我就不再一一阐述了,直接上代码:




    
    
    
    
    




在最后,附上完整的服务器代码:

var fs = require("fs"),
    express = require("express"),
    app = express(),
    server = require("http").createServer(app),
    io = require("socket.io")(server),
    root = "/Users/admin/Projects/ht-for-web/guide";

io.on("connection", function(socket){
    socket.on("explore", function(url){
        socket.emit("file", walk(url || root));
    });
});

app.use(express.static("/Users/admin/Projects/ht-for-web"));

server.listen(5000, function(){
    console.log("server is listening at port 5000");
});

function walk(pa) {
    var dirList = fs.readdirSync(pa),
        key = pa.substring(pa.lastIndexOf("/") + 1),
        obj = {
            name: key,
            path: pa,
            children: [],
            files: []
        };
    dirList.forEach(function(item) {
        var stats = fs.statSync(pa + "/" + item);
        if (stats.isDirectory()) {
            obj.children.push({name: item, path: pa + "/" + item});
        }
        else {
            obj.files.push({name: item, dir: pa + "/" + item});
        }
    });

    return obj;
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/60855.html

相关文章

  • 基于HT for Web矢量实现HTML5文件上传进度条

    摘要:如此,基于自定义类实现文件上传进度条的页面设计及代码设计全部完成,由于篇幅的关系,在方面讲得比较少,还望见谅,下面我讲附上完整的代码,有兴趣的同学可以下载下来研究研究。 在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传、上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件上传进度条,矢量在...

    CNZPH 评论0 收藏0
  • HTML5矢量实现文件上传进度条

    摘要:如此,基于自定义类实现文件上传进度条的页面设计及代码设计全部完成,由于篇幅的关系,在方面讲得比较少,还望见谅,下面我讲附上完整的代码,有兴趣的同学可以下载下来研究研究。 在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传、上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件上传进度条,矢量在...

    zzir 评论0 收藏0
  • 数百个 HTML5 例子学习 HT 图形组件 – 拓扑图篇

    摘要:拓扑图组件作为最典型的客户需求应用,自然是首篇登场。入门手册中也有个简单的编辑器例子,教用户如何自定义创建节点连线和多边形的示例教材,学习自定义拓扑图交互可从此例子入手。 HT 是啥:Everything you need to create cutting-edge 2D and 3D visualization. 这口号是当年心目中的产品方向,接着就朝这个方向慢慢打磨,如今 HT ...

    Shonim 评论0 收藏0
  • 基于HTML5 Canvas WebGL制作分离摩托车

    摘要:我们利用函数解析获得每个材质的模型信息,通过遍历整个模型,获得单独的模型信息,并且将其命名,这样我们就能显示每个模型的名称了,也能对每个部分的模型进行控制。 工业方面制作图表,制作模型方面运用到 3d 模型是非常多的,在一个大的环境中,构建无数个相同的或者不同的模型,构建起来对于程序员来说也是一件相当头疼的事情,我们利用 HT 帮大家解决了很大的难题,无数个例子可在官网上查找到 htt...

    zzbo 评论0 收藏0
  • 玩转 HTML5 下 WebGL 3D 模型交并补

    摘要:对象可以用二叉树表示,其中叶子表示基元,节点表示操作。提供的模型或表面看起来很复杂,但实际上不过是巧妙组合或分解对象。继承于,当的属性为空时显示为六面体效果,如果通过吸附到宿主或后,宿主或可与吸附的图元进行的组合建模。 建设性的立体几何具有许多实际用途,它用于需要简单几何对象的情况下,或者数学精度很重要的地方,几乎所有的工程 CAD 软件包都使用 CSG(可以用于表示刀具切削,以及零件...

    airborne007 评论0 收藏0

发表评论

0条评论

youkede

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<