亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

js也可以有自定義事件 注入就是這么爽

2019-11-18 16:49:27
字體:
來源:轉載
供稿:網友

  在c#中有delegate,還有特殊的可以直接應用于事件編程的delegate,那就是event。而在js中沒有c#的event,更沒有delegate,有的只是dom元素內置的的native的不可擴展的event,比如無法為input元素添加事件,只能在其擁有的事件(如onclick=handler)上擴展應用。那么能不能做到自定義的事件模擬效果呢?答案是肯定的,也就是本文的主題。
  首先弄明白一下事件的意圖——可以在發生一件事的時候執行額外的代碼,如document.attachEvent('onclick', function(){alert('u click document')}),當點擊頁面時(事件發生了),就會執行我們為其掛接的其它代碼(js中以function為語句集合,以下稱為function),當然我們可以在一個事件上掛接任意多的function,這樣就實現了一種靈活的可擴展編程接口。試想如果可以像在元素事件擴展應用一樣可以在任意對象的任意方法上擴展,那對于js編程來講就更加靈活了。先看一個例子,平時我們把相對對立的一個功能命名為一個function,并在需要的地方(通常是另一個function)調用以實現代碼復用:
function F(){
    this.method = function(){
        alert('f.method is called')
        g();
    }
}
function g(){
    alert(123)
}
var f = new F();
f.method()


我們把f.method中直接調用g改寫一下,封裝到一個Event對象中達到一樣的效果,代碼如下:
var Event = {
    __list:[],
    observe:function(obj, ev, fun){
        this.__list.push({o:obj, e:ev, f:fun})
    },
    occor:function(obj, method){
        var arr = []
        for(var i=0; i<this.__list.length; i++){
            if(this.__list[i].o==obj && this.__list[i].e==method) arr.push(this.__list[i]);
        }
        for(var i=0; i<arr.length; i++){
            arr[i].f();
        }
    }
}

function F(){
    this.method = function(){
        alert('f.method is called')
        Event.occor(this, 'method');
    }
}

var f = new F();
Event.observe(f, 'method', function(){alert(123)})
f.method()這樣乍看上去好像費了“太多”功夫,但卻把“在f中調用g的寫法”更通用化了,如果要在f中調用h則只需要多些一行Event.occor(this, 'methodName'),寫到這里你肯定也注意到methodName的寫法和最開始的寫法是一樣的,都是硬編的不具靈活性,如果在每個類的方法中都寫入Event.occor(this, 'method')就太不雅觀了,也背離了我們的初衷,動態修改一下method把它加到最后一行就ok了,下一步就是解決它,改進代碼如下:

var Event = {
    __list:[],
    observe:function(obj, ev, fun){
        this.__list.push({o:obj, e:ev, f:fun})
    },
    occor:function(obj, method){
        var arr = []
        for(var i=0; i<this.__list.length; i++){
            if(this.__list[i].o==obj && this.__list[i].e==method) arr.push(this.__list[i]);
        }
        for(var i=0; i<arr.length; i++){
            arr[i].f();
        }
    },
    inject:function(obj){
        for(var p in obj){
            obj[p] = new Function(obj[p].toString().replace('function(){', '').replace('}', 'Event.occor(this,p)'))
        }
    }
}

function F(){
    this.method = function(){
        alert('f.method is called')
    }
}

var f = new F();
Event.inject(f);
Event.observe(f, 'method', function(){alert(123)})
f.method()我們把顯示的在被調用方法體內調用Event.occor改寫到Event.inject中。到此我們就簡單(還有一些安全代碼沒有處理,如沒有判斷obj[p]是否需要被改寫、沒有測試效率問題,沒有處理更多添加Event.occor時的邏輯判斷,下一步準備把它實現為一個Observeable對象,就更加靈活了)的完成了自定義事件。
http://www.49028c.com/boolean/archive/2006/12/10/boolean.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产欧美精品| 久久久精品电影| 日韩在线高清视频| 国产日产亚洲精品| 久久成人av网站| 日韩欧美在线视频日韩欧美在线视频| 亚洲影视九九影院在线观看| 国产精品户外野外| 亚洲xxxx做受欧美| 久久精品视频网站| 欧美在线一区二区三区四| 97成人精品区在线播放| 另类色图亚洲色图| 亚洲综合日韩在线| 国产一区二区在线免费视频| 成人精品视频在线| 亚洲永久免费观看| 欧美在线视频导航| 欧美成人免费在线观看| 欧美精品aaa| 丝袜亚洲欧美日韩综合| 韩国欧美亚洲国产| 午夜剧场成人观在线视频免费观看| 综合网日日天干夜夜久久| 欧美一级电影免费在线观看| 黑人巨大精品欧美一区二区免费| 在线看日韩欧美| 国产精品一区二区久久精品| 欧美一区亚洲一区| 另类专区欧美制服同性| 日韩欧美精品免费在线| 美日韩精品视频免费看| 欧美日韩中文在线观看| 亚洲成人教育av| 国产精品中文在线| 亚洲精品v欧美精品v日韩精品| 一区二区在线免费视频| 亚洲自拍偷拍区| 蜜臀久久99精品久久久久久宅男| 亚洲欧洲视频在线| 亚洲精品美女视频| 91久久国产婷婷一区二区| 日韩欧美在线播放| 成人免费在线视频网站| 精品女同一区二区三区在线播放| 久久网福利资源网站| 5252色成人免费视频| 亚洲a在线播放| 久久久久久久成人| 97精品免费视频| 久久全球大尺度高清视频| 91久久久国产精品| 欧美激情精品久久久久久变态| 久久五月天综合| 国内外成人免费激情在线视频网站| 欧美一级视频一区二区| 精品国产依人香蕉在线精品| 日本久久久a级免费| 中文字幕国产日韩| 亚洲综合成人婷婷小说| 国产成人涩涩涩视频在线观看| 97人人做人人爱| 欧美日韩精品在线播放| 久久国产精品久久久久久久久久| 亚洲xxxxx性| 国产成人免费av| 国产精品第一视频| 日韩在线精品一区| 欧美另类极品videosbestfree| 91久久久久久久久久久久久| 国产精品入口免费视频一| 国产精品久在线观看| 在线播放国产一区二区三区| 日韩小视频在线| 亚洲激情免费观看| 亚洲激情在线观看视频免费| 国产精品普通话| 日韩欧美极品在线观看| 最近2019中文字幕一页二页| 亚洲成人av中文字幕| 亚洲一区二区三区成人在线视频精品| 青青精品视频播放| 国产精品毛片a∨一区二区三区|国| 亚洲国产成人av在线| 欧美激情va永久在线播放| 亚洲专区中文字幕| 欧美日本啪啪无遮挡网站| 日韩成人xxxx| 亚洲aⅴ日韩av电影在线观看| 情事1991在线| 亚洲免费成人av电影| 97**国产露脸精品国产| 91精品久久久久久久久青青| 欧美人成在线视频| 欧美日韩爱爱视频| 精品福利视频导航| 国产suv精品一区二区| 亚洲黄色av网站| 国产精品电影一区| 成人网址在线观看| 亚洲天堂av在线播放| 亚洲最大的免费| 国产91精品视频在线观看| 欧洲永久精品大片ww免费漫画| 精品国模在线视频| 精品久久久中文| 国产日韩换脸av一区在线观看| 久久91精品国产91久久跳| 色琪琪综合男人的天堂aⅴ视频| 欧美视频在线观看 亚洲欧| 国产精品情侣自拍| 国产一区二区三区在线播放免费观看| 亚洲欧美成人精品| 91国语精品自产拍在线观看性色| 国产精品自拍偷拍视频| 久久久国产一区二区三区| 国产精品成人一区二区| 日韩极品精品视频免费观看| 亚洲老司机av| 最近中文字幕2019免费| 久久久久久久久中文字幕| 国内免费久久久久久久久久久| 日本老师69xxx| 国产999在线观看| 久久精品影视伊人网| 久久精品国产v日韩v亚洲| 精品久久久久久中文字幕| 亚洲天堂av图片| 一区二区三区天堂av| 久久97精品久久久久久久不卡| 久久天天躁狠狠躁夜夜躁| 欧美最近摘花xxxx摘花| 亚洲偷欧美偷国内偷| 精品久久久久久亚洲精品| 欧美日韩精品二区| 国产福利成人在线| 欧美大学生性色视频| 久久国产精品亚洲| 欧美小视频在线| 欧美精品一本久久男人的天堂| 亚洲国产精品久久久久久| 欧美中文在线视频| 国产精品爽黄69天堂a| 国产性猛交xxxx免费看久久| 国产视频一区在线| 黑人与娇小精品av专区| 日韩精品在线免费播放| 国产精品日韩欧美综合| 欧美极品少妇xxxxⅹ免费视频| 久久久久久久亚洲精品| 51ⅴ精品国产91久久久久久| 91禁国产网站| 欧美在线观看一区二区三区| 欧美成年人视频| 亚洲电影免费观看高清完整版在线观看| 久久九九精品99国产精品| 欧美激情国产高清| 69视频在线免费观看| 亚洲视频免费一区| 国产丝袜一区二区三区免费视频| 亚洲第五色综合网| 日韩精品在线第一页| 日韩影视在线观看| 中文日韩在线观看|