extJs 2 0學習筆記 事件註冊總結篇

2021-04-18 22:25:25 字數 2945 閱讀 3481

本來,我也沒把這檔子事放在眼裡,因為簡單,例如:

ext.get("elem").on("click",};

這樣的**誰不會寫啊。乙個on就了結了。但是,今天,我在研究ext.panel的tbar時,發現,那現工具欄按鈕的事件註冊不一樣:

元素註冊、元件註冊都是:

工具欄按鈕的事件註冊:

嘿,我就在想,為什麼ext的作者就不統一一下呢,都是fn多好。省得我分心了。一不小心準搞錯了。還好,不是fn就是handler,凡是工具欄上面的東西註冊事件,一般都是用handler,平常元件註冊事件統統都用fn。

關於元件的事件註冊,一般都是建立時就定義好,而不是建立後再來on。所以,用extjs寫程式,常常看到ext.onready裡面巢狀了無數層,items裡面還有items,items裡面還有listeners。然後listeners裡面定義事件處理器。這樣,**就比較難看了。有人說:extjs寫的**莫名其妙。呵呵,可見大夥不大喜歡這種寫法啊。

關於事件處理,我把element的api文件翻譯了一下。事實上事件註冊都是建立在element之上的。

一、元素的事件註冊

on( string eventname, function fn, [object scope], [object options] ) : void

其中:eventname:string

事件名稱

fn:function

事件處理函式,它有三個引數

evt:eventobject 事件物件

t:element    事件發生的目標element,注意:它將被delegate選項所篩選(很有用)。

o:object     addlistener函式傳入的options物件。

scope:object 範圍

options:object 選項引數

乙個包含了事件配置屬性的物件,它可能包括如下屬性:

scope :它表示事件處理函式的執行範圍,即處理函式時面的this的上下文。

delegate :乙個簡單的selector,用於過濾target或者找target的子孫。

stopevent :為true就停止事件,即停止事件的傳播和阻止預設行為。

preventdefault :阻止預設行為

stoppropagation :停止事件的傳播

normalized : 為false的話就傳遞乙個瀏覽器的原裝事件物件給函式,而不是ext.eventobject。

delay : 這個值表示事件發生後多少毫秒,事件處理函式才被執行。

single : 為真的話呢就表示這個事件處理器只執行一次,之後自刪除。

buffer :它的作用就是執行緩衝,有時候,使用者點按鈕做死的點,一秒點它幾十次,難道讓事件處理函式執行幾十次嗎?其實,使用者並不一定是執行多次。如果真的就這樣老老實實執行了,很可能就壞事了,做了無用功。

這個值表示,在事件發生後,事件處理函式將放到ext.util.delayedtask中去計畫執行,多少毫秒之內,如果再次發生同一事件,那麼,這一事件將覆蓋原來的事件。只執行後面那一次,當然,那個緩衝時間也在後一次時被重新整理。

組合options中的選項

在下面的例子中,on這種快捷的方式比冗長的addlistener好用的多了。兩者是等價的。使用options作引數,它能組合多種不同的事件處理器:

乙個普通的,能延時執行的,只執行一次的,能自動停止事件的,還有乙個自定義引數(forumid)在options物件,這個options物件是合法的。**如下:

el.on('click', this.onclick, this, );

一次註冊多個事件

這個方法也允許只傳乙個config,但是乙個config中包含多個事件處理資訊。**如下:

el.on(,

'mouseover' : ,

'mouseout' :

});或者是以下簡捷語法:

el.on();

上面是一般事件,還有快捷鍵註冊的問題,事實上,ext對快捷鍵這個功能的封裝其實就是對keypress這個事件的改造。怎樣定義快捷鍵對映呢,ext.element.addkeymap(config)。所以,問題的重心又到了config這個東西了。我找到ext.keymap這個類,研究一下:

config的屬性有:

key:number/string/array,例如:

key: 13, // or ext.eventobject.enter

key: "a/r/n/t"

key: [10,13],    //回車鍵被按了

key: "abc"     //按了a或b或c

key: "/t"

由上可知,可以是設成單個按鍵,也可是多個按鍵,可是ascii碼,也可以是那個字母。

fn:function

相關聯的處理函式,例如:

fn: function()

ctrl:boolean

shift:boolean

alt:boolean

scope:object

總結上面,element中的事件註冊方法都差不多。

二、關於元件上的事件註冊

元件的事件註冊有它的特點了,儘管本質上還是on、un。如果用on、un,它的語法跟element的語一樣,沒什麼差別,關鍵是,元件允許在建立時的 config中用listeners:,yyyy:{}}的形式的註冊事件。不過,listeners裡面的寫法跟on的組合寫法是一樣的。這個我研究了。例如:

listeners:}

還是:事件名:options

元件沒有什麼快捷鍵關聯的功能,不過,能通過元素的快捷鍵註冊功能來得到。這個沒什麼問題。ext.window

有乙個keys config的屬性,用它可以定義快捷鍵。  

extJs 2 0學習筆記 事件註冊總結篇

extjs 2.0學習筆記 事件註冊總結篇 本來,我也沒把這檔子事放在眼裡,因為簡單,例如 ext.get elem on click 這樣的 誰不會寫啊。乙個on就了結了。但是,今天,我在研究ext.panel的tbar時,發現,那現工具欄按鈕的事件註冊不一樣 元素註冊 元件註冊都是 工具欄按鈕的...

extJs 2 0學習筆記 事件註冊總結篇

本來,我也沒把這檔子事放在眼裡,因為簡單,例如 ext.get elem on click 這樣的 誰不會寫啊。乙個on就了結了。但是,今天,我在研究ext.panel的tbar時,發現,那現工具欄按鈕的事件註冊不一樣 元素註冊 元件註冊都是 工具欄按鈕的事件註冊 嘿,我就在想,為什麼ext的作者就...

extJs 2 0學習筆記 Ajax篇

一聽到ajax,我與大家一樣,如雷貫耳,都說 ajax框架,事實上,這一部分內容在extjs中是基礎中的基礎,就那個樣。這兒主要是討論一些資料 書本都不會涉及的領域。這些東西平常只能由自己摸索的。在此話題之先,先解決乙個問題,現在用asp.net的人多了,但是,用asp.net ajax並不爽,但是...