关于JavaScript组件化的探索
Loaders
先放出项目地址:https://github.com/j20041426/Loaders
这是一个可以动态选择加载动画的样式和颜色的插件。这个项目仅仅是作为对js组件化的一个探索,不太建议用在生产环境中。
原理
通过动态渲染页面元素的方式,实现加载动画的样式选择;再通过less的客户端插件,动态改变css样式中的背景颜色,从而实现加载动画的颜色选择。
讲解
1. 结构
var Loader = (function(){
var _instance; //私有属性,对外界隐藏
var LoadingFun = function(config){
...
}
LoadingFun.prototype.show = function(){
...
}
LoadingFun.prototype.hide = function(){
...
}
return LoadingFun;
})();
这是这个插件的大体结构。在IIFE(立即执行函数)中,返回一个函数结构LoadingFun,并且在原型链中增加show和hide两个方法,这样对外界就只暴露了Loader这个构造函数,以及show和hide这两个成员函数。而_instance这个属性,就作为私有成员存在,而不被外界所知。

2. 构造方法
var LoadingFun = function(config){
_adaptParams(config); //参数的适配器
_init(); //初始化动画
_render(); //渲染动画到页面中
_instance.style.display = "none"; //默认隐藏
}
2.1 适配器
其中_adaptParams这个函数的作用是适配参数。不管调用者是否传递参数,或者以随机顺序传递参数,都可以让loaders正确接收到相应的参数。
var _config = { //默认参数
type : "ball-pulse",
color : "#fff"
}
var _adaptParams = function(config){ //适配器
if(config){
for(var param in _config){
if(config[param]){
_config[param] = config[param];
}
}
}
}
2.2 初始化动画
这个函数的作用是动态加载需要的less文件,并设置less文件中的全局参数@color为参数中的颜色值,然后动态引用less客户端插件进行less文件的预编译,最终得到需要的css样式代码。
var _init = function(){
var head = document.getElementsByTagName('HEAD').item(0);
var style = document.createElement('link');
style.href = 'css/loaders.less';
style.rel = 'stylesheet/less';
style.type = 'text/css';
head.appendChild(style);
var options = document.createElement('script');
options.innerHTML = "less = {globalVars:{color:'" + _config.color + "'}};";
head.appendChild(options);
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'js/less.min.js';
head.appendChild(script);
}

2.3 渲染
根据不同加载动画的DOM结构,动态生成对应的DOM元素,然后append到body元素中。
var divs= {
"ball-pulse" : 3,
...
};
var loader = document.createElement("div");
loader.className = "loader";
var loader_inner = document.createElement("div");
loader_inner.className = "loader-inner " + _config.type;
for(var i = 0; i < divs[_config.type]; i++){
var div = document.createElement("div");
loader_inner.appendChild(div);
}
loader.appendChild(loader_inner);
document.body.appendChild(loader);
_instance = loader; //将渲染的DOM元素存到私有成员_instance中,便于后续的显示控制
3. 显示控制
因为渲染时得到了加载动画的DOM对象_instance,所以可以通过_instance来控制元素的显示与隐藏。
_instance.style.display = "flex" 这里设置成flex是因为加载动画是用flexbox来控制居中显示的。
return this 返回this对象可以实现链式调用。
LoadingFun.prototype.show = function(){
_instance.style.display = "flex";
return this;
}
LoadingFun.prototype.hide = function(){
_instance.style.display = "none";
return this;
}
4. 结语
由于在加载和渲染动画时,使用了less的预编译功能,所以加载会有时间损耗。不太建议用在生产环境中,如果一定要使用的话,尽量在页面首次加载时,调用var loaders = new Loaders(),然后在需要显示和隐藏时,再分别调用loaders.show()、loaders.hide()。
由于自己在前端方面也是个新手,欢迎大家的指正。
关于JavaScript组件化的探索的更多相关文章
- javascript组件化(转)
javascript组件化(转) By purplebamboo 3月 16 2015 更新日期:3月 23 2015 文章目录 1. 最简陋的写法 2. 作用域隔离 3. 面向对象 4. 抽象出ba ...
- JavaScript 组件化开发之路(一)
*:first-child{margin-top: 0 !important}.markdown-body>*:last-child{margin-bottom: 0 !important}.m ...
- javascript 组件化(转载)
这边只是很简陋的实现了类的继承机制.如果对类的实现有兴趣可以参考我另一篇文章javascript oo实现 我们看下使用方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
- 通过构建Cocoapods私有库进行组件化开发探索
专题一 一.创建私有索引库 选Github或者码云都可以,本例以Github为例.创建私有索引库用来作为自己组件库的索引: 二.本地添加私有索引库 添加:pod repo add 索引库名称 索引库地 ...
- javascript组件化
http://purplebamboo.github.io/2015/03/16/javascript-component/#%E5%BC%95%E5%85%A5%E4%BA%8B%E4%BB%B6% ...
- 【转】Web应用的组件化开发(一)
原文转自:http://blog.jobbole.com/56161/ 基本思路 1. 为什么要做组件化? 无论前端也好,后端也好,都是整个软件体系的一部分.软件产品也是产品,它的研发过程也必然是有其 ...
- Web应用的组件化(一)
基本思路 1. 为什么要做组件化? 无论前端也好,后端也好,都是整个软件体系的一部分.软件产品也是产品,它的研发过程也必然是有其目的.绝大多数软件产品是追逐利润的,在产品目标确定的情况下,成本有两个途 ...
- 前端web应用组件化(一) 徐飞
https://github.com/xufei/blog/issues/6 Web应用的组件化(一) 基本思路 1. 为什么要做组件化? 无论前端也好,后端也好,都是整个软件体系的一部分.软件产品也 ...
- 从徐飞的文章《Web应用的组件化开发(一)中窥视web应用开发的历史
Web应用的组件化开发(一) 原文来自 徐飞 基本思路 1. 为什么要做组件化? 无论前端也好,后端也好,都是整个软件体系的一部分.软件产品也是产品,它的研发过程也必然是有其目的.绝大多数软件产品是追 ...
随机推荐
- openvpn配置注意事项
1.安装VPN安装结束后,需要配置CONFIG文件夹服务端及客户端的配置文件,建议从sample文件里直接拷贝修改,网上的一些案例会引起无法启动的问题,没仔细研究过是哪里错了,反正最后从sample里 ...
- 去除MyEclipse频繁弹出的Update Progress窗口
方法1: 1.关闭updating index Window => Preferences => Myeclipse Enterprise Workbench => Maven4My ...
- 二叉树问题(区间DP好题)
二叉树问题 时间限制: 1 Sec 内存限制: 128 MB 题目描述 Petya Bulochkin很幸运:他得到了一份在"Macrohard"公司的工作.他想要展现他的才华, ...
- Mac机上安装nvm遇到的坑--nvm command not found
在Mac机上,我最开始是通过homebrew来安装nvm,如下: $ brew install nvm 安装完成后,在命令行输入nvm list,发现出现如下提示: What?!!我不是才安装了nvm ...
- jquery获取当前选项的属性值a
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...
- Web前端总结(小伙伴的)
以下总结是我工作室的小伙伴的心得,可以参考一下 html+css知识点总结 HTMl+CSS知识点收集 1.letter-spacing和word-spacing的区别 letter-spacing: ...
- php通过curl扩展进行模拟登录(含验证码)
以下为本人工作中遇到的需要做的事情,之前也没怎么用过curl,查了好多资料,才稍微弄明白一点:本文所有内容只是自己平日工作的记录,仅供大家参考:<?php/*** 模拟登录*/header(&q ...
- java如何LOG打印出日志信息
log4j 记录日志方式 log4j 是apache 提供的记录日志的jar 档. 下载路径: http://logging.apache.org/log4j/1.2/download.html 这里 ...
- DOCKER 从入门到放弃(二)
搜索镜像 从docker官方镜像仓库搜索镜像 docker search [OPTIONS] TERM OPTIONS: --automated :只显示自动创建的镜像,默认值为fasle --fil ...
- 详解Mysql自动备份与恢复
通过 mysqldump命令,直接生成一个完整的 .sql 文件 Step 1: 创建一个批处理备份SQL c: cd C:Program Filesmysql5.6.24bin mysqldump ...