怎麼樣才是設計功能函數的好思路(javascript)?

来源:http://www.cnblogs.com/androidshouce/archive/2016/06/12/5576497.html
-Advertisement-
Play Games

在js裡面,對於函數的調用,實際上也是也是面向對象的思路,於是寫好js函數,也是考核面向對象設計的能力,同時也必須考慮到如何實現高內聚和低耦合,拿一個例子來說,現在的需求是這樣的,實現個投資進度框,就是如圖所示:總共分四步來走,第一步“創建訂單中”,成功改變提示信息“創建訂單成功!”,顯示,不成功改 ...


在js裡面,對於函數的調用,實際上也是也是面向對象的思路,於是寫好js函數,也是考核面向對象設計的能力,同時也必須考慮到如何實現高內聚和低耦合,拿一個例子來說,現在的需求是這樣的,實現個投資進度框,就是如圖所示:總共分四步來走,第一步“創建訂單中”,成功改變提示信息“創建訂單成功!”,顯示,不成功改變提示信息“創建訂單失敗!”,顯示,依次下去第二步,第三步,第四步!

我的dom結構是這樣的http://t.cn/RUbL4rP
1 2 3 4 5 6 7 8 9 10 11 12 <!--投資操作進度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為不成功,於是怎麼一個函數就出來:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 /* 調用說明 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來保證第一步可以實現某個操作

雖然功能可以實現,但是代碼相當冗餘,可擴展性不好,相當不智能!

於是另外一種方法出來了,

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 /* 調用說明 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!
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 基於css3新屬性transform,實現3d立方體的旋轉 通過原生JS,點擊事件,滑鼠按下、滑鼠抬起和滑鼠移動事件,實現3d立方體的拖動旋轉,並將旋轉角度實時的反應至界面上顯示 實現原理:通過獲取滑鼠點擊屏幕時的坐標和滑鼠移動時的坐標,來獲得滑鼠在X軸、Y軸移動的距離,將距離實時賦值給transf ...
  • 想實現這樣一個功能,就是在一個表格中,由於很多字過多,所以用文字溢出的方法處理了,但是這樣就無法看到表格中具體的內容呢。想實現當滑鼠移上去的時候可以顯示這一行被隱藏的內容。當然這個網上有很多插件,但是我沒有用,還是自己寫了一個。 css部分 html部分 js部分 最後,其實bootstrap裡面有 ...
  • 前些天學習了bootstrap,把其中的柵格系統整理出來,如有錯誤,歡迎指正。 概要,柵格系統針對pc,pad,移動端開發出響應式web頁面,根據不同屏幕解析度有針對不同的解決方法。 (0.1, 屏幕設備尺寸大於1200px 選擇col-lg (0.2. 屏幕設備尺寸在970px到1200px 選擇 ...
  • PS:請先升級Node 6.2.1,Node 升級命令 .NOde.js擴展是一個通過C/C++編寫的動態鏈接庫,並通過Node.js的函數require()函數載入,用起來就像使用一個普通的Node.js模塊。它主要為Node與C/C++庫之間提供介面。 這樣,若一個方法或函數是通過Node擴展實 ...
  • 設置 相容性視圖設置--添加此網站--在IE8中調試(防止調整IE內核後瀏覽器崩潰,360可通過設置極速模式-相容模式 點擊地址欄綠色圖標) ...
  • 使用delegate(),on()綁定事件,可以將事件綁定到其祖先元素上,這樣以後載入出來的元素,單擊事件仍然有效 ...
  • 1.先說幾個基本類型: DOMString, boolean, long, unsigned long, double, NaN(Not-a-Number)。 DOMString其實就是其它大家常用的語言中的string。 在HTML5中,它用於表示url,Dom內容 等等。其他的boolean(布 ...
  • 1.下拉框 select : 移除option $("#ID option").each(function(){ if($(this).val() == 111){ $(this).remove(); } }); 添加option $("<option value='111'>UPS Ground< ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...