javascript-裝飾者模式

来源:http://www.cnblogs.com/jtnote/archive/2016/10/24/5992380.html
-Advertisement-
Play Games

裝飾者模式筆記 在不改變原對象的基礎上, 通過對其進行包裝拓展(添加屬性或方法)使原有對象可以滿足用戶的更複雜要求。 需求不是一成不變的,需求會不斷改進,以增強用戶體驗 demo實例:對輸入框添加focus與blur事件 這個實例中,輸入框只有一兩個時,新添需求不覺得麻煩,當有許多輸入框都要新添需求 ...


裝飾者模式筆記
 在不改變原對象的基礎上,
 通過對其進行包裝拓展(添加屬性或方法)使原有對象可以滿足用戶的更複雜要求。
 需求不是一成不變的,需求會不斷改進,以增強用戶體驗
 demo實例:對輸入框添加focus與blur事件
 這個實例中,輸入框只有一兩個時,新添需求不覺得麻煩,當有許多輸入框都要新添需求時,實現會很麻煩,而使用裝飾者模式卻能很簡單完成

html代碼

1         <style>
2             #container{width: 800px;margin:100px auto;}
3             input{margin-right:5px;}
4             span{font-size: 12px;color:#999;}
5         </style>
6         <div id="container">
7             <input name="uname" id="uname" value="" placeholder="請輸入用戶名"/><span id="uname_demo_text">用戶名以字母開頭,由字母、數字、下劃線組成,長度3-16位</span><span id="uname_warn_text"></span><br/><br/>
8             <input name="phone" id="phone" value="" placeholder="請輸入手機號碼"/><span id="phone_demo_text">手機號碼以13、14、15、18開頭,由數字組成,長度11位</span><span id="phone_warn_text"></span>
9         </div>

原有事件功能

 1             var uname=document.getElementById("uname");
 2             var phone=document.getElementById("phone");
 3             var unameDemoText=document.getElementById("uname_demo_text");
 4             var unameWarnText=document.getElementById("uname_warn_text");
 5             var phoneDemoText=document.getElementById("phone_demo_text");
 6             var phoneWarnText=document.getElementById("phone_warn_text");
 7             uname.onblur = function(){
 8                 var nameValid=/^[a-zA-Z][a-zA-Z0-9_]{5,17}$/i;
 9                 if(!nameValid.test(uname.value)){
10                     unameWarnText.innerHTML="用戶名不符合填寫規則";
11                 }else{
12                     unameWarnText.innerHTML="用戶名符合填寫規則";
13                 }
14             }
15             phone.onblur = function(){
16                 var phoneValid=/^1(3|4|5|8)\d{9}$/i;
17                 if(!phoneValid.test(phone.value)){
18                     phoneWarnText.innerHTML="手機號碼不符合填寫規則";
19                 }else{
20                     phoneWarnText.innerHTML="手機號碼符合填寫規則";
21                 }
22             }

裝飾者

 1             /*裝飾者*/
 2             var decorator=function(input,focusFn,blurFn){
 3                 //獲取事件源
 4                 var input=document.getElementById(input);
 5                 //判斷事件源是否綁定focus事件
 6                 if(typeof input.onfocus === 'function'){
 7                     //緩存事件源原有回調函數
 8                     var oldFocusFn = input.onfocus;
 9                     //為事件源定義新的事件
10                     input.onfocus = function(){
11                         //事件源原有回調函數
12                         oldFocusFn();
13                         //新增回調函數
14                         focusFn();
15                     }
16                 }else{
17                     //事件源未綁定事件,直接為事件源添加新增回調函數
18                     input.onfocus = focusFn;
19                 }
20                 //判斷事件源是否綁定blur事件
21                 if(typeof input.onblur === 'function'){
22                     //緩存事件源原有回調函數
23                     var oldBlurFn = input.onblur;
24                     //為事件源定義新的事件
25                     input.onblur = function(){
26                         oldBlurFn();
27                         blurFn();
28                     }
29                 }else{
30                     //事件源未綁定事件,直接為事件源添加新增回調函數
31                     input.onblur = blurFn;
32                 }
33             }

新增回調函數

 1            decorator('uname',function(){
 2                 //新增focus回調函數
 3                 unameDemoText.style.display="none";
 4             },function(){
 5                 //新增blur回調函數
 6                 unameWarnText.style.color="#f03";
 7             });
 8             decorator('phone',function(){
 9                 //新增focus回調函數
10                 phoneDemoText.style.display="none";
11             },function(){
12                 //新增blur回調函數
13                 phoneWarnText.style.color="#f03";
14             });

代碼測試:

 優化裝飾者方法

        /*優化裝飾者方法*/
        var decorator = function(id,type,fn){
            var dom = typeof id === 'string' ? document.getElementById(id) : id;
            //判斷事件源是否綁定事件
            if(typeof dom[type] === 'function'){
                //緩存事件源原有回調函數
                var oldFn = dom[type];
                //為事件源定義新的事件
                dom[type] = function(){
                  //事件源原有回調函數
                  oldFn();
                  //新增回調函數
                  fn();
                }
            }else{
                //事件源未綁定事件,直接為事件源添加新增回調函數
                dom[type] = fn;
            }
        
        };

調用裝飾者方法

 1            decorator('uname','onfocus',function(){
 2                 //新增focus回調函數
 3                 unameDemoText.style.display="none";
 4             });
 5             decorator('uname','onblur',function(){
 6                 //新增focus回調函數
 7                 unameWarnText.style.color="#f03";
 8             });
 9             decorator('phone','onfocus',function(){
10                 //新增focus回調函數
11                 phoneDemoText.style.display="none";
12             });
13            decorator('phone','onblur',function(){
14                 //新增focus回調函數
15                 phoneWarnText.style.color="#f03";
16             });

瀏覽器顯示效果同上

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在逛別人的博客的時候,看見別人的代碼的例子使用了高亮的語法,無論是java,js還是php等等語言,都會自動的對關鍵字進行高亮。 於是在前幾天自己寫了一個博客,遇到code時,自然就想到了別人網站如何漂亮,巴拉巴拉。 開始了正式的搗鼓。 在搗鼓之前去別的網站看了看。這裡貼上簡書的效果: 其中的關鍵字 ...
  • 總有人問我面試時候原型鏈怎麼寫, 作為一位職場老司機,面試界的白神。身經百戰,擼出以下的代碼 怎麼樣,看懂的是不是覺得以上的代碼清新脫俗,煥然一新 沒看懂的,在這裡解釋下 首先我定義了interviewer(面試官)和handsome (英俊)2個函數。 然後給他們2個的原型加了點東西,當然主要是h ...
  • 圖片預覽的 javascript 本地操作 早期瀏覽器,不能將本地圖片作為頁面元素處理,要實現圖片預覽需要將圖片先上傳到伺服器,再從伺服器取得進行預覽 現代的瀏覽器功能越來越全面,因此可以實現對一些數據的本地處理 Chrome MsEdge(ie11) Firefox 上圖的html ...
  • 在學習ajax的過程中,我曾經遇到過這樣的一個問題,為了得到一個詳情列表,我要先向伺服器去請求得到索引表,簡單描述就是ajax中的success中的for迴圈中再次嵌套了ajax,結果第二層success中的ajax的success並不能取得上層ajax的success中的值。 我先使用ajax發送 ...
  • <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <script type="text/javascript"> //substring()方法用於提取字元串中介於兩個指定下標之間的 ...
  • MVC, MVP和MVVM都是用來解決界面呈現和邏輯代碼分離而出現的模式。以前只是對它們有部分的瞭解,沒有深入的研究過,對於一些裡面的概念和區別也是一知半解。現在一邊查資料,並結合自己的理解,來談一下對於這三種模式思想的理解,以及它們的區別。歡迎各位高手拍磚。 閱讀目錄: 一. MVC, MVP, ...
  • 可滾動選日期,並限制哪些日期可選和不可選。 主要用來根據後臺返回生成一個日期選擇器。 具體實現可關註jmslip: https://github.com/jiamao/jmSlip 示例:http://slip.jm47.com/demo/calendar/index.html ...
  • ng-init是給angular執行給定的表達式,初始化變數的值 這樣就初始化了myTest的值,ng-app沒有設值,要是設置的話,就要js啦,要不然就得報錯了 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...