我們都知道,IE實(shí)現的是一種叫做bubble up的事件模型。在這個(gè)模型中我們的事件可以通過(guò)Web頁(yè)元素的hierarchy,從事件觸發(fā)元素向其parentElement傳遞,除非被顯示的cancel。不過(guò)在一些復雜的事件響應處理中,還有很多細節需要仔細考慮。
對于Web元素可偵聽(tīng)的事件來(lái)說(shuō),大多數的事件都是比較簡(jiǎn)單的。比如什么onload、onclick、onkeypress、onmousedown、onmouseup等等。但是卻有一些是比較麻煩的,比如onmousemove、onmouseover和onmouseout。為什么說(shuō)這幾個(gè)比較麻煩呢?因為這幾個(gè)事件一般會(huì )比較頻繁的被觸發(fā),而且onmouseover和onmouseout還更加特殊,這兩個(gè)事件還會(huì )影響event的toElement和fromElement屬性。
同時(shí)onmouseover和onmouseout以及onmousemove還是不確定的事件,什么意思呢?就是說(shuō)當鼠標從html元素上移動(dòng)時(shí),不是100%能觸發(fā)這幾個(gè)事件。這是因為,瀏覽器中dhtml的事件觸發(fā)是在瀏覽器事件處理進(jìn)程合理idle的時(shí)候,根據用戶(hù)的和瀏覽器的交互遍歷dhtml樹(shù)的狀態(tài)來(lái)產(chǎn)生的。當瀏覽器事件處理進(jìn)程太忙,或者用戶(hù)交互過(guò)于密集的時(shí)候,由于IE沒(méi)有事件隊列,沒(méi)有被處理的事件就再也不會(huì )出發(fā)了。這里的事件丟失是完全可以接受的,如果不作丟棄瀏覽器的交互反而會(huì )非常的難用。就常常會(huì )出現這種情況,有時(shí)當我們的windows太繁忙而不立即響應鼠標事件時(shí),我們卻到處點(diǎn)擊鼠標想"激活"系統,系統在忙完那個(gè)費時(shí)的處理后,會(huì )來(lái)接著(zhù)處理message queue里的一大堆message,我們就能看到剛才點(diǎn)過(guò)的鼠標操作都被windows連續處理了


我們在最外面的藍色span元素中監聽(tīng)事件onmouseover,代碼為:

當我們把鼠標移入藍色region,我們看到status上顯示"blue"。我們繼續在藍色region中移動(dòng)鼠標時(shí)(不要和別的邊相交),我們發(fā)現onmouseover在blue時(shí)的timestamp不變,說(shuō)明如果鼠標已進(jìn)入一個(gè)element的區域中,就不再觸發(fā)onmouseover了(否則就成了onmousemove了)??墒沁@個(gè)時(shí)候如果我把鼠標移入綠色或紅色的region中,我們發(fā)現又有新的onmouseover事件被觸發(fā)并被藍色span元素截獲。而且不斷的在綠色、紅色及藍色regions中移動(dòng)鼠標,timestamp也在不斷地變,說(shuō)明總有onmouseover事件被觸發(fā)。
其實(shí)既然都說(shuō)了IE的事件處理方式是bubble up,那么藍色span截獲綠色和紅色regions中的onmouseover似乎是對的??墒菍τ?font color="#0000ff">藍色span來(lái)說(shuō),這些被多余觸發(fā)的onmouseover事件其實(shí)是不被期望的。IE沒(méi)有做這個(gè)過(guò)濾,不知道是出于什么目的,不過(guò)我們可以自己在腳本中過(guò)濾掉這樣的useless事件,有時(shí)這些事件很可能會(huì )干擾我們做精確的對藍色span進(jìn)行事件控制。假設藍色span的onmouseover事件handler為isAbsoluteMoveOver,代碼如下:














這時(shí)只有在鼠標移入或移出藍色span時(shí),isAbsoluteMoveOver才返回true!
聯(lián)系客服