在js里面,对于函数的调用,实际上也是也是面向对象的思路,于是写好js函数,也是考核面向对象设计的能力,同时也必须考虑到如何实现高内聚和低耦合,拿一个例子来说,现在的需求是这样的,实现个投资进度框,就是如图所示:总共分四步来走,第一步“创建订单中”,成功改变提示信息“创建订单成功!”,显示,不成功改变提示信息“创建订单失败!”,显示,依次下去第二步,第三步,第四步!

我的dom结构是这样的http://t.cn/RUbL4rP
<!--投资操作进度tip-->
<div class="invest_progress_tip">
<div class="progress_tip_title text-center">
<div class="la-timer la-2x" >
<div></div>
</div>
<span>小羊正在拼命地处理中···</span>
</div>
<div class="progress_tip_content"> </div>
</div>

<!--投资操作进度tip//-->

那就是这样的,我需要做的就是设计一个函数,对其调用,依次传参,然后对其<div class="progress_tip_content"></div>添加dom节点,添加每个实现步骤。那如何设计这个函数勒?刚开始,我是依照三种状态来设计这个函数的,flag为0,1,2。0为初始化,1为成功,2为不成功,于是怎么一个函数就出来:

/*
调用说明
show_p_tip({
step:"createOrder", //步骤名称,名称任意
flag: 0, // 0=状态未显示 1=状态已显示(成功) 2=状态已显示(未成功)
msg:'正在创建订单··· ', //提示信息
is_begin: true, //提示框初始化,用于第一步操作,第一步必须初始化,前提flag必为0
is_success: true, //成功支付的提示(成功支付按钮),用于最后一步成功结果,,前提flag必为1
param: object对象 //如 {is_NoAuth:true, url:'http://www.baidu.com', tradeData:'hahahhaha', method:'post'} is_NoAuth必为true 前提flag必为2
}); */ function show_p_tip(object){ switch(object.flag){
case 0:
if(object.is_begin){
$(".invest_tip .invest_tip_close").removeClass('close_window');
$(".invest_tip").css('z-index',9996);
$(".invest_progress_tip").center().fadeIn();
}
$(".invest_progress_tip .progress_tip_content").append('<div id="div_'+object.step+'"><span id="span_'+object.step+'">'+object.msg+'</span><i class="p-icon p-1"></i></div>');
break; case 1:
if(object.msg!=''){
$(".invest_progress_tip .progress_tip_content #span_"+object.step).html(object.msg);
}
$(".invest_progress_tip .progress_tip_content > div#div_"+object.step+" .p-icon").fadeIn();
if(object.is_success){
$(".invest_progress_tip .progress_tip_content").append('<div class="invest_success_result mt15 text-center"><a href="javascript:void(0);" class="invest_result_btn btn btn-primary btn-block">完成支付</a></div>');
}
break; case 2:
if(object.msg!=''){
$(".invest_progress_tip .progress_tip_content #span_"+object.step).html(object.msg);
}
$(".invest_progress_tip .progress_tip_content > div#div_"+object.step+" .p-icon").addClass('p-2');
$(".invest_progress_tip .progress_tip_content > div#div_"+object.step+" .p-icon").fadeIn();
if(object.param.is_NoAuth){
var form = createForm(object.param);
$(".invest_progress_tip .progress_tip_content").append('<div class="invest_noauth_tip mt5">点击支付按钮前往<span class="text-primary">一麻袋</span>进行支付操作</div>');
$(".invest_progress_tip .progress_tip_content .invest_noauth_tip").append(form);
}
break; } if(object.tip_msg&&object.tip_msg!=''){
$(".invest_progress_tip .progress_tip_title .la-timer>div").addClass('success');
$(".invest_progress_tip .progress_tip_title span").text(object.tip_msg);
} }

那么可以看出来,使用flag作为参考依据,于是就会出现很多问题,代码出现了很多问题,比如

状态为flag为1,成功的时候,我要求显示”完成支付“的按钮,需要在flag为1的前提下,添加个参数is_success;

状态为flag为0,显示初始化的时候,需要在第一步做些其他操作(初始化),又要传入参数is_begin来保证第一步可以实现某个操作

虽然功能可以实现,但是代码相当冗余,可扩展性不好,相当不智能!

于是另外一种方法出来了,

/*
调用说明
show_p_tip({
action:'_init', //动作名
name: 'tag1', //标识名
msg:'正在创建订单...', //提示信息
status: 1, // 0错误 1正确
form: object对象 //如 {url:'http://www.baidu.com', tradeData:'hahahhaha', method:'post'}
});
eg: show_p_tip({ action:'_init',msg:'小羊正在疯狂处理中!'}); show_p_tip({ action:'_tips',name:'tag1',msg:'正在创建订单...'});
show_p_tip({ action:'_tips',name:'tag1',msg:'创建订单成功!',status:1});
show_p_tip({ action:'_tips',name:'tag1',msg:'现金券下单失败!',status:0}); show_p_tip({ action:'_jump',form:{url:'http://www.baidu.com', tradeData:'hahahhaha', method:'post'}}); show_p_tip({ action:'_complete'}); show_p_tip({ action:'_end'});
*/
function show_p_tip(object){
switch(object.action){
//初始化
case '_init':
var msg = object.msg?object.msg:'小羊正在拼命地处理中!';
$('.invest_progress_tip').attr('rel',1);
$('.invest_progress_tip .progress_tip_title span').text(msg);
$(".invest_tip .invest_tip_close").removeClass('close_window');
$(".invest_tip").css('z-index',9996);
$(".invest_progress_tip").center().fadeIn();
break;
//流程提示
case '_tips':
if($('.invest_progress_tip').attr('rel')!='1'){
show_p_tip({action:'_init'});
}
if(!$('#div_'+object.name).length){
$(".invest_progress_tip .progress_tip_content").append('<div id="div_'+object.name+'"><span id="span_'+object.name+'">'+object.msg+'</span><i class="p-icon p-1"></i></div>');
}
$("#span_"+object.name).html(object.msg);
if(object.status==1) $("#div_"+object.name+" .p-icon").fadeIn();
if(object.status==0) $("#div_"+object.name+" .p-icon").addClass('p-2').fadeIn();
break;
//跳转支付
case '_jump':
var form = createForm(object.form);
$(".invest_progress_tip .progress_tip_content").append('<div class="invest_noauth_tip mt5">点击支付按钮前往<span class="text-primary">一麻袋</span>进行支付操作</div>');
$(".invest_progress_tip .progress_tip_content .invest_noauth_tip").append(form);
break;
//完成
case '_complete':
var msg = object.msg?object.msg:'完成支付';
$(".invest_progress_tip .progress_tip_content").append('<div class="invest_success_result mt15 text-center"><a href="javascript:void(0);" class="invest_result_btn btn btn-primary btn-block">'+msg+'</a></div>');
break;
//结束
case '_end':
var msg = object.msg?object.msg:'小羊保证完成任务!';
$(".invest_progress_tip .progress_tip_title span").text(msg);
$(".invest_progress_tip .progress_tip_title .la-timer>div").addClass('success');
break;
}
}
 这种方式,是以action来做参考依据的,分为5种情况,分别是_init(初始化),_tips(流程提示),_jump(跳转支付),_complete(完成支付),_end(结束),然后再使用递归,这样的话就划分了5个模块来处理这样的功能,_init(初始化),可以在第一步做递归调用,每一步都可以使用_tips(流程提示),即可随时改变状态,提示信息,有可以判断是否初始化,而决定是否递归调用_init(初始化),有可以处理其他特殊情况,比如第一步需要初始化操作,最后一步成功需要显示”完成支付“按钮,都是作为_jump(跳转支付),_complete(完成支付)来处理。代码不冗余了,可扩展性强了!条例清晰多了!
 
总结:在写js功能处理函数时,正确的思想是根据此功能将其划分成多个模块部分,通用模块,初始化模块,结束模块,特殊模块,用好递归等编程思想,这样的思路可以有效的写出好的代码!come on!!!bin!
 

怎么样才是设计功能函数的好思路(javascript)?的更多相关文章

  1. Qt调用dll中的功能函数

    声明: 事先我已经自己动手写了一个简单的dll文件(myDLL.dll),C版接口的.并且用我前两篇有关DLL文章里面的方法,从dll中导出了导入库(.lib)文件,dll中有两个函数,原型如下:   ...

  2. JS自定义功能函数实现动态添加网址参数修改网址参数值

    无论是前端开发还是后台设计,很多时候开发人员都需要获取当前或目标网址的相关信息.这个已有现成的内置对象属性可以直接调用了(下面是获取当前页面的参考代码) 复制代码 代码如下: <script t ...

  3. 痞子衡嵌入式:深扒IAR启动函数流程及其__low_level_init设计对函数重定向的影响

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR启动函数流程及其__low_level_init设计对函数重定向的影响. 上一篇文章 <IAR下RT-Thread工程自定义 ...

  4. php文字、图片水印功能函数封装

    一直在做有关php文字图片上传方面的工作,所以把此功能函数整理了一次,现在分享给大家. <?php class image { var $g_img; var $g_w; var $g_h; v ...

  5. php实现数字格式化,数字每三位加逗号的功能函数

    原地址:http://www.jb51.net/article/73781.htm php实现数字格式化,数字每三位加逗号的功能函数,具体代码如下: ? 1 2 3 4 5 6 7 8 9 10 11 ...

  6. jQuery基础之(三)jQuery功能函数前缀及与window.onload冲突

    1.jQuery功能函数前缀 在javascript中,开发者通常会编写一些小函数来处理各种操作细节,例如在用户提交表单时,要将文本框最前端和最末端的空格内容清理掉.而javascript中没有类似t ...

  7. ylbtech-权限管理-数据库设计-功能权限管理技术

    ylbtech-DatabaseDesgin:ylbtech-权限管理-数据库设计-功能权限管理技术 DatabaseName:ylb_permission(权限管理-功能权限管理技术)实现 Type ...

  8. python小练习,打出1-100之间的所有偶数,设计一个函数,在桌面上创建10个文件,并以数字命名,复利计算函数

    练习一:打出1-100之间的所有偶数 def even_print(): for i in range(1,101): if i % 2 == 0: print (i) even_print() #列 ...

  9. 设计一函数,求整数区间[a,b]和[c,d]的交集

    问题: 设计一函数,求整数区间[a,b]和[c,d]的交集.(c/c++.Java.Javascript.C#.Python)  1.Python: def calcMixed(a,b,c,d): r ...

随机推荐

  1. [原][粒子特效][spark]深入浅出osgSpark

    背景: 目前我使用的spark粒子特效库是2.0 这个库好像是原来鬼火引擎的一部分,需要从github上找 现在我要将其使用到我自己开发的基于osgearth开的三维地图引擎中 步骤: 1.编译spa ...

  2. 总要先爬出坑的JEE架构

    先来看看官网对它的定义. Java平台企业版(Java EE)是社区驱动的企业软件的标准.Java EE是使用Java Community Process开发的,其中包括来自行业专家,商业和开源组织, ...

  3. JNI开发-Java从C/C++获取List集合对象

    NI开发有时需要Java从C/C++获取List对象,此篇主要讲解Java从C/C++获取List<Student>返回值; 1. 定义com.niubashaoye.simple.jni ...

  4. SpringBoot集成TkMybatis插件

    前提: 基于SpringBoot项目,正常集成Mybatis后,为了简化sql语句的编写,甚至达到无mapper.xml文件. 在本篇总结教程,不在进行SpringBoot集成Mybatis的概述. ...

  5. springBoot springSecurty: x-frame-options deny禁止iframe调用

    springBoot springSecurty:  x-frame-options deny禁止iframe调用 https://blog.csdn.net/whiteforever/article ...

  6. delphi 程 序从exe运行改成dll库

    第一种方法: 具体步骤: 1.生成新的或着打开已经存在的工程文件(DPR)(Project1.dpr). 2.选择[View]—>[Project Manager],选中[ProjectGrou ...

  7. mat 使用 分析 oom 使用 Eclipse Memory Analyzer 进行堆转储文件分析

    概述 对于大型 JAVA 应用程序来说,再精细的测试也难以堵住所有的漏洞,即便我们在测试阶段进行了大量卓有成效的工作,很多问题还是会在生产环境下暴露出来,并且很难在测试环境中进行重现.JVM 能够记录 ...

  8. java读取ACCESS数据库的简单示例

    java读取ACCESS数据库的简单示例 虽然简单,对初学者来说,如果没有一段可以成功执行的代码供参考,还真难调试 先用ACCESS建一个数据库 DB1.MDB,里面有一表"table1&q ...

  9. pytorch学习记录

    1.pytorch中的torch.split只能将tensor分割为相等的几分,如果需要特定的需求将tensor分割开,可以用torch.index_select.使用的时候,先生成index索引,示 ...

  10. python-day91--JS实现的ajax

    一.AJAX核心(XMLHttpRequest) 其实AJAX就是在Javascript中多添加了一个对象:XMLHttpRequest对象.所有的异步交互都是使用XMLHttpServlet对象完成 ...