Ajax+innerHTML+Dgls=好的用户体验+高性能+高效率
为了引入Dgls,我们从创建Dom节点说起。
用JS创建Dom节点
var div = document.createElement('div');
div.className = 'gdls';
var test = document.createTextNode('zhe');
div = div.appendChild(test);
看到没,我们仅仅为了创建<div class="dgls">zhe</div>竟然写了四行代码,而且用了那么多无用的字符。
用JQ创建Dom节点
$('div',{
'class': 'dgls',
'id': 'dgls',
'css':{
'border': '1px solid green'
},
'html': $('<a>', {
href: '#',
html: 'hello world',
})
});
这个看起来比JS的要爽多了,而且可以嵌套子节点。可是<div><a></a><a></a></div>怎么创建呢?难道要用两个html,显然是不行的。
<div></div><div></div>这个标签又怎么创建呢?也许不行吧。
用字符串创建Dom结点
'<div></div><div></div>'
'<div><a></a><a></a></div>'
我只能说这个是最简单的了,但是局限性也就大了。我要动态加个class属性,就要使用+号来连接字符串,如果我要创建一个复杂且庞大的结构,不知道要用多少个+号,不便于阅读。更严重的是+号的效率低下啊,尽管后来JS改善了+号的性能。
用Dgls创建Dom结点
_('div',
_('a', {'href': 'www.baidu.com'}, 'baidu'),
_('a', {'href': 'www.cnblogs.com'}, 'google')
).string();
/*
<div><a href="www.baidu.com">baidu</a><a href="www.cnblogs.com">google</a></div>
*/
_('div', {'class': 'dgls'}, '1').concat(
_('div', {'class': 'dgls'}, '2')).string();
/*
<div class="dgls">1</div><div class="dgls">2</div>
*/
只要是你能够想得到的结构,Dgls都能够创建!当然Dgls创建的都是字符串,只要与innerHTML结合使用就可以将字符串转化为Dom节点了,而且innerHTML性能也是不错的,甚至超过了JS,当我们要大量创建dom元素的时候。
揭开Dgls神秘的面纱
Dgls是Dynamically Generate Lable String。换句话说,也就是动态生成标签字符串的意思,刚刚大家也见识了它的魅力了。
Dgls源码
下面我就贴出Dgls的源码,欢迎大家指教!
(function(Global, undefined){
function Dgls(tagName, tagAttr, single){
this._name = tagName;
this._attr = tagAttr;
this._single = single;
this._brother = [];
this._children = [];
} Dgls.extend = function(obj){
var proto = this.prototype;
for(name in obj){
if((typeof proto[name] != 'function') && (typeof obj[name] == 'function')){
proto[name] = obj[name];
}else{
throw 'The method of ' + name + ' has exsited!';
}
}
}; Dgls.extend({
attr: function(key, value){
var len = arguments.length;
if(len == 2){
if(value !== undefined){
this._attr[key] = value;
}
}else if(len == 1){
var k;
for(k in key){
if(key[k] !== undefined){
this._attr[k] = key[k];
}
}
}
return this;
},
push: function(tag){
this._children.push(tag);
return this;
},
unshift: function(tag){
this._children.unshift(tag);
return this;
},
concat: function(tag){
this._brother = this._brother.concat(tag);
return this;
},
string: function(){
var arr = [],
tmp = [],
arrlen = 0;
arr[arrlen++] = '<';
arr[arrlen++] = this._name;
for(var key in this._attr){
tmp[0] = ' ';
tmp[1] = key;
tmp[2] = '="';
tmp[3] = this._attr[key];
tmp[4] = '"';
arr[arrlen++] = tmp.join('');
}
arr[arrlen++] = '>';
if(!this._single){
this._children.map(function(tag){
if(tag != undefined) {
if(tag instanceof Dgls){
arr[arrlen++] = tag.string();
}else if(typeof tag == 'string'){
arr[arrlen++] = tag;
}
}
});
arr[arrlen++] = '</';
arr[arrlen++] = this._name;
arr[arrlen++] = '>';
}
this._brother.map(function(tag){
if(tag != undefined) {
if(tag instanceof Dgls){
arr[arrlen++] = tag.string();
}else if(typeof tag == 'string'){
arr[arrlen++] = tag;
}
}
});
return arr.join('');
},
childs: function(){
var arr = [],
arrlen = 0;
this._children.map(function(tag){
if(tag != undefined) {
if(tag instanceof Dgls){
arr[arrlen++] = tag.string();
}else if(typeof tag == 'string'){
arr[arrlen++] = tag;
}
}
});
return arr.join('');
}
}); var dgls = function(tagName){
var attrs = {},
obj,
i = 1;
if(arguments[1] != 's'){
if((arguments[1] instanceof Object) && !(arguments[1] instanceof Dgls)){
attrs = arguments[1];
i = 2;
}
obj = new Dgls(tagName, attrs, false);
}else{
i = 2;
if((arguments[2] instanceof Object) && !(arguments[2] instanceof Dgls)){
attrs = arguments[2];
i = 3;
}
obj = new Dgls(tagName, attrs, true);
}
for(var length = arguments.length; i<length; i++){
obj.push(arguments[i]);
}
return obj;
}; Global._ = dgls;
Global.Dgls = Dgls;
})(window);
Dgls项目
项目地址:https://github.com/ysyfff/Dgls
有关Dgls的更多用法以及Dgls的扩展,请参见项目中的README。
欢迎大家来Fork!与参与。
Ajax+innerHTML+Dgls=好的用户体验+高性能+高效率的更多相关文章
- ajax操作时用于提高用户体验的两段备用代码
<div id="msgBoxDIV" style="position: absolute; width: 50%; padding-top: 2px; heigh ...
- Django Web开发【6】使用Ajax增强用户体验
Ajax及其优点 Ajax实际上就是指异步Javascript与XML,它包含以下技术: HTML与CSS Javascript XMLHttpRequest XML Ajax技术让客户端与服务器实现 ...
- 通过$.ajax设置预加载动画加强用户体验
以前在jquery请求数据时,总喜欢用简洁的$.get与$.post提交数据,但有时发现由于网速的问题,有些时候网站加载js获得的数据会非常慢,于是就想能不能请求数据中间,给加载数据一个提示,增加用户 ...
- 巧用Ajax的beforeSend 提高用户体验--防止重复数据
巧用Ajax的beforeSend 提高用户体验 jQuery是经常使用的一个开源js框架,其中的$.ajax请求中有一个beforeSend方法,用于在向服务器发送请求前执行一些动作.具体可参考jQ ...
- jquery ajax请求方式与提示用户正在处理请稍等,等待数据返回时loading的显示
1.jquery ajax请求方式与提示用户正在处理请稍等 为了提高用户体验度,我们通常会给出 “正在处理,请稍等!”诸如此类的提示.我们可通过设置$.ajax()下的参数beforeSend()来实 ...
- Apple、Google、Microsoft的用户体验设计原则
轻巧的Apple 注重设计过程: 在设计过程中引入用户交互的5个目标: 了解您的目标客户 分析用户的工作流 构造原型系统 观察用户测试 制定观察用户准则 做出设计决定 避免功能泛滥 80% 方案 优秀 ...
- jQuery Pjax – 页面无刷新加载,优化用户体验
pjax 是 HTML5 pushState 以及 Ajax 两项技术的简称,综合这两个技术可以实现在不刷新页面的情况下载入 HTML 到当前网页,带给你超快速的浏览器体验,而且有固定链接.标题以及后 ...
- paip.提升用户体验--radio图片选择器 easyui 实现..
#paip.提升用户体验--radio图片选择器 easyui 实现.. =================================== ##原因... ------------------- ...
- vs2010 使用SignalR 提高B2C商城用户体验(二)
vs2010 使用SignalR 提高B2C商城用户体验(二) 上一节,已经实现了,当前域内的通信,这一节中,介绍一下跨域的即时通信,既然要做,我们肯定要把这个推送及聊天服务器做为一个单独的服务器,以 ...
随机推荐
- Struts2转换器配置和用法
struts转换器:在B/S应用中,将字符串请求参数转换为相应的数据类型,是MVC框架提供的功能,而Struts2是很好的MVC框架实现者,理所当然,提供了类型转换机制. 一.类型转换的意义 对于一个 ...
- 虚拟机中安装 centOS,本地安装 SSH 连接 - 02
先进入 centOS 中,查询虚拟机的 IP 地址: 双击打开 SSH 可视化客户端: 点击 Connect 需要输入之前那个[无论如何都要使用]的密码. 密码在[centOS - 01]里面设置过, ...
- python3判断字典、列表、元组为空以及字典是否存在某个key的方法
#!/usr/bin/python3 #False,0,'',[],{},()都可以视为假 m1=[] m2={} m3=() m4={"name":1,"age&quo ...
- 第197天:js---caller、callee、constructor和prototype用法
一.caller---返回函数调用者 //返回函数调用者 //caller的应用场景 主要用于察看函数本身被哪个函数调用 function fn() { //判断某函数是否被调用 if (fn.cal ...
- Strus默认跳转方式是请求转发 地址栏不变 与javaweb的内部转发一样
Strus默认跳转方式是请求转发 地址栏不变 与javaweb的内部转发一样
- Impala:新一代开源大数据分析引擎--转载
原文地址:http://www.parallellabs.com/2013/08/25/impala-big-data-analytics/ 文 / 耿益锋 陈冠诚 大数据处理是云计算中非常重要的问题 ...
- CTSC2012-Cheat
题意 给出一些母01串,多次询问,每次询问一个01串,问一个最大的\(L\),使得可以在询问串中选出若干个不相交的,长度大于等于\(L\)的子串,这些子串都在母串中出现过,且子串的长度和大于等于询问串 ...
- bzoj2386 [CEOI2011] Team
题意 给你n个数,每个数的大小在1到n之间,要求把它们分成几组,每个数字的大小要小于等于它所在组中的数字总个数,问最多能分出多少组. 分析 首先把所有数字排序,比较显然的是最后一定存在一个最优解是按这 ...
- 再谈获取网站图标Icon
上一篇文章讨论了一下获取网站图标方法,是通过从根目录直接获取和html解析结合的方式来获取的,并给出了相应的代码示例.这一篇来讨论一个更现成的方法,这个方法是从360导航的页面发现的,在导航页面中点击 ...
- 【bzoj3589】动态树
Portal --> bzoj3589 Description 给你一棵\(n\)个节点的树,总共有\(q\)次操作,每次操作是以下两种中的一种: 操作\((0,x,delta)\):给以\(x ...