javascript事件模型代碼
2024-09-06 12:41:58
供稿:網友
本節稍稍深入地討論關于事件處理的話題,如果你對模式、閉包和面向對象等概念還不太理解,不妨暫且等閱讀完相關內容之后再回過頭來閱讀它,相信你會有很大收獲。
1 事件處理模式
在程序設計領域,“事件處理”是一種模式,當一個對象受外部影響而改變狀態時,通過消息的方式將這個狀態改變通知給這個對象或者相關聯的某個對象,讓它執行對應的動作,這就是事件處理的基本原理。負責通知狀態改變的對象被稱作“消息”,而執行響應動作的屬性則被稱作“事件代理”。
例如下面就是一個簡單的事件處理模式的應用:
function dispatchEvent(owner, eventType, eventArgs)
{
if(owner && owner["on"+eventType])
setTimeout(function(){owner["on"+eventType](eventArgs)}, 1);
}
function randomSerials(len)
{
function randomSignal()
{
return Math.random() > 0.5 ? 1 : 0;
}
var ret = [];
for(var i = 0; i < len; i++)
{
ret.push(randomSignal());
}
return ret;
}
function Differ(obl)
{
var buffer = new Array(obl);
var time = 0;
this.readBuffer = function()
{
var buf = buffer;
buffer = new Array(obl);
time = 0;
return buf;
}
this.bufferSize = function()
{
return obl;
}
this.input = function(serials)
{
for(var i = 1; i < serials.length; i++)
{
var signal = Math.abs(serials[i] - serials[i - 1]);
buffer[time++ % obl] = signal;
if(signal)
dispatchEvent(this, "signalchange",
{input:serials, time:time, buffer:buffer.slice(0)});
}
}
}
var inputSerials = randomSerials(20);
alert(inputSerials);
var diff10 = new Differ(20);
diff10.input(inputSerials);
alert(diff10.readBuffer());
diff10.onsignalchange = function(eventArgs)
{
alert(eventArgs.time);
}
diff10.input(inputSerials);
在上面的例子中,函數dispatchEvent負責分派事件,onsignalchange是事件代理,在這個差分系統diff10中,當輸入信號的電平發生變化(從0到1或者從1到0)時,觸發相應的事件onsignalchange,并且將當前輸入信號、時序和當前輸出緩存作為事件參數傳入事件處理程序。