为了引入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=好的用户体验+高性能+高效率的更多相关文章

  1. ajax操作时用于提高用户体验的两段备用代码

    <div id="msgBoxDIV" style="position: absolute; width: 50%; padding-top: 2px; heigh ...

  2. Django Web开发【6】使用Ajax增强用户体验

    Ajax及其优点 Ajax实际上就是指异步Javascript与XML,它包含以下技术: HTML与CSS Javascript XMLHttpRequest XML Ajax技术让客户端与服务器实现 ...

  3. 通过$.ajax设置预加载动画加强用户体验

    以前在jquery请求数据时,总喜欢用简洁的$.get与$.post提交数据,但有时发现由于网速的问题,有些时候网站加载js获得的数据会非常慢,于是就想能不能请求数据中间,给加载数据一个提示,增加用户 ...

  4. 巧用Ajax的beforeSend 提高用户体验--防止重复数据

    巧用Ajax的beforeSend 提高用户体验 jQuery是经常使用的一个开源js框架,其中的$.ajax请求中有一个beforeSend方法,用于在向服务器发送请求前执行一些动作.具体可参考jQ ...

  5. jquery ajax请求方式与提示用户正在处理请稍等,等待数据返回时loading的显示

    1.jquery ajax请求方式与提示用户正在处理请稍等 为了提高用户体验度,我们通常会给出 “正在处理,请稍等!”诸如此类的提示.我们可通过设置$.ajax()下的参数beforeSend()来实 ...

  6. Apple、Google、Microsoft的用户体验设计原则

    轻巧的Apple 注重设计过程: 在设计过程中引入用户交互的5个目标: 了解您的目标客户 分析用户的工作流 构造原型系统 观察用户测试 制定观察用户准则 做出设计决定 避免功能泛滥 80% 方案 优秀 ...

  7. jQuery Pjax – 页面无刷新加载,优化用户体验

    pjax 是 HTML5 pushState 以及 Ajax 两项技术的简称,综合这两个技术可以实现在不刷新页面的情况下载入 HTML 到当前网页,带给你超快速的浏览器体验,而且有固定链接.标题以及后 ...

  8. paip.提升用户体验--radio图片选择器 easyui 实现..

    #paip.提升用户体验--radio图片选择器 easyui 实现.. =================================== ##原因... ------------------- ...

  9. vs2010 使用SignalR 提高B2C商城用户体验(二)

    vs2010 使用SignalR 提高B2C商城用户体验(二) 上一节,已经实现了,当前域内的通信,这一节中,介绍一下跨域的即时通信,既然要做,我们肯定要把这个推送及聊天服务器做为一个单独的服务器,以 ...

随机推荐

  1. 增加响应header让ajax支持跨域

    ajax请求数据步骤 发送请求--->浏览器接受响应--->判断是否是同域下 是的话,就把响应数据返回给ajax.不是的话就提醒禁止跨域请求. 现在可以在响应头重增加 header(&qu ...

  2. jmeter同步定时器

    同步定时器是jmeter中一个比较重要的定时器,同步定时器,相当于一个储蓄池,累积一定的请求,当在规定的时间内达到一定的线程数量,这些线程会在同一个时间点一起并发,可以用来做大数据量的并发请求. 验证 ...

  3. C++解析(22):父子间的冲突

    0.目录 1.同名覆盖 2.赋值兼容 3.函数重写遇上赋值兼容 4.小结 1.同名覆盖 子类中是否可以定义父类中的同名成员?如果可以,如何区分?如果不可以,为什么? 父子间的冲突: 子类可以定义父类中 ...

  4. BZOJ4152:[AMPPZ2014]The Captain——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4152 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1 ...

  5. 【bzoj3672】购票

    Portal -->bzoj3672 Solution 天知道我是怎么调完的qwq调到天昏地暗系列.. ​ 不管这么多,先尝试列一个最简单的状态转移方程 用\(f[i]\)表示\(i\)点到\( ...

  6. Web前端之HTML详解20180327

    一.html概述 html就是超文本标记语言的简写,是最基础的网页语言.html通过标签来定义语言,代码都是由标签所组成. 1.html代码从<html>开始</html>结束 ...

  7. Android 基于身份证号的自定义键盘

    上图上代码 public class MainActivity extends AppCompatActivity { EditText writebankcard_mobileedit; Custo ...

  8. 3 ways to download files with PowerShell

    Perhaps the greatest strength of PowerShell is it's foundation on the .NET framework. The .NET frame ...

  9. Spring 源码学习(2) —— FactoryBean 的使用

    一般情况下, Spring是通过反射机制利用bean的class属性指定实现类来完成实例化bean的.在某些特定的情况下, 想做一些定制,Spring为此提供了一个org.springframewor ...

  10. JS笔记加强版3

    JS 面向对象及组件开发   JS的面向对象:   1.什么是面向对象编程   用对象的思想去写代码,就是面向对象编程 过程式写法 面向对象写法 我们一直都在使用对象 数组 Array 时间 Date ...