用javascript作一个通用向导说明


Posted in Javascript onAugust 30, 2011

1、界面设计
index.html:只提供了一个向导显示位置的占位符

<html> 
<head> 
<title>礼物推荐向导</title> 
<meta http-equiv="content-type" content="text/html; charset=utf-8"> 
<link rel="stylesheet" type="text/css" href="style.css"> 
<script src="jquery.js" type="text/javascript"></script> 
<script src="wizard.js" type="text/javascript"></script> 
</head> 
<body> 
<div id="wizard"></div> 
</body> 
</html>

style.css:默认情况下向导里有一个h2呈现的标题,一个ul呈现的主要内容,一个div呈现的按钮条,我们简单设计了一下他们的默认外观,实际应用中大家可以自由的美化它们。
body{ 
margin:0; 
} 
/*向导容器*/ 
#wizard{ 
height:400px; 
width:600px; 
background-color:#999; 
} 
/*向导的主体内容,用列表展示*/ 
#wizard ul{ 
margin:10px; 
height:80%; 
} 
/*横向显示列表内容*/ 
#wizard li{ 
display:inline-block; 
margin:10px; 
cursor:pointer; 
} 
/*列表的标题*/ 
#wizard h2{ 
margin:10px; 
} 
/*列表的功能条,如返回按钮*/ 
#wizard .bar{ 
margin:10px; 
clear:both; 
}

2、准备每一步骤

向导可以分为每一步骤,每个步骤需要呈现内容,捕捉用户选择,提供标题等功能,我们让每一步都自己负责自己的事情,但要符合我们规定的一些契约。

每一个步骤用一个函数表示,第一个参数data_key是选择本步骤数据的关键字,一般用于上一个步骤的结果决定下一个步骤显示数据的情况,第二个参数result_callback是个回调函数,就是在本步骤获取结果时调用,它用于和向导类进行通信,向导类在得到上一步的结果后存储结果并跳向到下一步。

该函数返回一个二元组,第一个元素是本步骤的标题,第二个元素是本步骤主体部分的UI。

我们的示例是一个礼物推荐系统,共分三步,第一步选择送礼对象,第二步选择关键字,其中第一步的选择结果会影响到第二步显示,第三步选择价格区间,如下就是代码的实现,其中绘制界面和事件捕捉用了jquery来简化操作。

function step1(data_key, result_callback){ 
var targets = ['女朋友','男朋友','父亲','妈妈','孩子']; 
var warpper = $('<ul></ul>') 
$.each(targets, function(k,v){ 
$('<li>'+v+'</li>').click(function(){result_callback(v)}).appendTo(warpper); 
}); 
return ['第一步:请选择送礼物的对象',warpper]; 
} 
function step2(data_key, result_callback){ 
var tags = { 
'女朋友':['创意','可爱','浪漫','激情','实用','数码', 
'自制','毛绒玩具','衣服','包包'], 
'男朋友':['男士用品','温馨','实用','数码','创意','衣物'], 
'父亲' :['男士用品','健康','植物','衣物'], 
'妈妈' :['温馨','健康','创意','护肤品','实用'], 
'孩子' :['玩具','学习用品','实用','数码'] 
}; 
var warpper = $('<ul></ul>') 
$.each(tags[data_key], function(k,v){ 
$('<li>'+v+'</li>').click(function(){result_callback(v)}).appendTo(warpper); 
}); 
return ['第二步:请选择关键词',warpper]; 
} 
function step3(data_key, result_callback){ 
var price_level = ['便宜','普通','稍贵','贵重']; 
var warpper = $('<ul></ul>') 
$.each(price_level, function(k,v){ 
$('<li>'+v+'</li>').click(function(){result_callback(v)}).appendTo(warpper); 
}); 
return ['第三步:请选择价格区间',warpper]; 
}

3、向导类的实现

向导类要设置向导所在的DOM元素,要执行的步骤列表,向导完成后执行的回调,向导还应该提供上一步和下一步的方法,所以我们用一个类来表示向导,在构造函数里传入DOM容器,步骤列表和回调函数,用prototype给类增加三个方法。render用来呈现某一步骤的UI,并在本步骤收集结果的回调里推向下一步,如果本步骤是最后一步,则调用向导执行完成的回调函数。

另外两个next和back函数分别是执行上一个步骤和下一个步骤,这两个函数实用index的私有变量来维持整个向导的状态

function Wizard(container, steps, callback){ 
this.container = container; //向导容器 
this.steps = steps; //向导步骤 
this.callback = callback; //向导执行完毕执行的回调 
this.collect_data = []; //保存向导每一步骤的结果 
this.index = -1; //当前执行在那一步骤 
} 
//绘制某一步骤 
Wizard.prototype.render = function(step, this_result){ 
var me = this; 
//执行该步骤并得到该步骤的UI 
var to_append = step(this_result,function(result){ 
me.collect_data.push(result); //收集本步骤结果 
//向导执行完毕时调用回调函数,否则执行下一步 
if(me.collect_data.length == me.steps.length) 
me.callback(me.collect_data); 
else 
me.next(result); 
}); 
//绘制本步骤的UI 
this.container.empty(); 
this.container.append("<h2>"+to_append[0]+"</h2>"); 
this.container.append(to_append[1]); 
if(this.index > 0){ 
//后退按钮 
this.container.append($("<div class='bar'><a href='javascript:;'>后退</a></div>") 
.click(function(){me.back()} 
)); 
} 
} 
//执行下一步 
Wizard.prototype.next = function(this_result){ 
if(this.index >= this.steps.length -1) 
return; 
var step = this.steps[++this.index]; 
this.render(step,this_result); 
} 
//后退到上一步 
Wizard.prototype.back = function(){ 
if(this.index <= 0) 
return; 
var step = this.steps[--this.index]; 
//步骤回到上一步,但上一步的数据需要上上一步的结果来决定 
this.collect_data = this.collect_data.slice(0, this.index); 
this.render(step, this.collect_data[this.index - 1]); 
}

4、小结

本向导结构简单,可定制性强,结合了javascript的函数式编程特性和面向对象的特性,体现了javascript的强大和便利。

其中wizard类里界面绘制的部分和步骤函数里界面绘制的部分还是存在一些耦合,继续重构的话,可以把所有绘制界面的部分再抽象到一起,使界面改动更方便。

Javascript 相关文章推荐
Javascript中的变量使用说明
May 18 Javascript
jQuery 阴影插件代码分享
Jan 09 Javascript
JavaScript中操作字符串之localeCompare()方法的使用
Jun 06 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
Sep 15 Javascript
基于 Node.js 实现前后端分离
Apr 23 Javascript
jquery实现点击弹出可放大居中及关闭的对话框(附demo源码下载)
May 10 Javascript
js 判断登录界面的账号密码是否为空
Feb 08 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
Jun 12 jQuery
Vue $mount实战之实现消息弹窗组件
Apr 22 Javascript
Electron-vue开发的客户端支付收款工具的实现
May 24 Javascript
javascript使用Blob对象实现的下载文件操作示例
Apr 18 Javascript
jquery插件实现代码雨特效
Apr 24 jQuery
JS 无限级 Select效果实现代码(json格式)
Aug 30 #Javascript
javascript 原型继承介绍
Aug 30 #Javascript
dojo学习第二天 ajax异步请求之绑定列表
Aug 29 #Javascript
非常强大的 jQuery.AsyncBox 弹出对话框插件
Aug 29 #Javascript
新浪微博字数统计 textarea字数统计实现代码
Aug 28 #Javascript
Javascript面向对象编程(三) 非构造函数的继承
Aug 28 #Javascript
Javascript面向对象编程(二) 构造函数的继承
Aug 28 #Javascript
You might like
MySQL相关说明
2007/01/15 PHP
php设计模式 DAO(数据访问对象模式)
2011/06/26 PHP
PHP基于PDO实现的SQLite操作类【包含增删改查及事务等操作】
2017/06/21 PHP
浅谈Yii乐观锁的使用及原理
2017/07/25 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
JavaScript 编程引入命名空间的方法与代码
2007/08/13 Javascript
tangram框架响应式加载图片方法
2013/11/21 Javascript
JS阻止用户多次提交示例代码
2014/03/26 Javascript
javascript强制点击广告的方法
2015/02/06 Javascript
AngularJS基础学习笔记之简单介绍
2015/05/10 Javascript
使用coffeescript编写node.js项目的方法汇总
2015/08/05 Javascript
浅析Javascript ES6中的原生Promise
2016/08/25 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
TypeScript的安装、使用、自动编译的实现
2020/04/10 Javascript
基于canvasJS在PHP中制作动态图表
2020/05/30 Javascript
Openlayers绘制地图标注
2020/09/28 Javascript
Nest.js 授权验证的方法示例
2021/02/22 Javascript
Python接收Gmail新邮件并发送到gtalk的方法
2015/03/10 Python
利用Django框架中select_related和prefetch_related函数对数据库查询优化
2015/04/01 Python
python 字典操作提取key,value的方法
2019/06/26 Python
Django框架之登录后自定义跳转页面的实现方法
2019/07/18 Python
python各类经纬度转换的实例代码
2019/08/08 Python
如何用Anaconda搭建虚拟环境并创建Django项目
2020/08/02 Python
ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
2020/10/21 Python
基于CSS3特效之动画:animation的应用
2013/05/09 HTML / CSS
美国著名的家居用品购物网站:Bed Bath & Beyond
2018/01/05 全球购物
欧洲第一中国智能手机和平板电脑网上商店:CECT-SHOP
2018/01/08 全球购物
一套SQL笔试题
2016/08/14 面试题
总经理办公室主任岗位职责
2013/11/12 职场文书
前厅收银主管岗位职责
2014/02/04 职场文书
毕业自我鉴定怎么写
2014/03/25 职场文书
《故都的秋》教学反思
2014/04/15 职场文书
安全生产目标管理责任书
2014/07/25 职场文书
最美孝心少年事迹材料
2014/08/15 职场文书
见义勇为事迹材料
2014/12/24 职场文书
电脑无法安装Windows 11怎么办?无法安装Win11的解决方法
2021/11/21 数码科技