原來在程式中類比事件觸發的時候,我寫過一篇文章叫"在什麼時候才會用到fireEvent方法呢?"。文章中說了我們怎麼樣來使用類比事件的詳細方法和步驟,不過當時忽略了fireEvent的一個Optional的參數
oEventObject,它是做什麼的呢?
由於一次對事件的更精確的觸發控制,才知道了為什麼會需要createEventObject這個方法。原來覺得可以fireEvent,對於控制事件觸發已經非常的方便和強大了,可是一次BT的控制,發現居然還必須自己控制事件參數event的值。我們知道當事件觸發時,正常的window.event對象的眾多屬性基本都是readonly的。而使用fireEvent觸發事件後,event對象的很多屬性都是預設值(或空值),那麼我們怎麼修改它成為我們期望的值呢?這時createEventObject方法就派上用場了。
調用document對象的createEventObject方法,我們會得到一個event的對象執行個體。這個是當然了,不過這個我們建立的event執行個體的屬性大都是可寫的,這樣一來我們就完全可以定製一個具有我們希望屬性參數的event對象。在使用它來作為fireEvent方法的參數,事件觸發後的控制就完完全全的在我們自己的掌握之中了。看下面這個我整理並簡化後,使用createEventObject方法配合fireEvent的案例:
<div id="divEvent" oncontextmenu="return false;" style="border: dotted 1px blue;
width: 170px; height: 100px; padding: 10px" onmousedown="ShowContextMenu(this)">
</div>
Right click the above rectangle.
<script>
function ShowContextMenu(elmt)
{
var evt = elmt.document.parentWindow.event;
if ( evt.button == 2 )
{
var popup = window.createPopup();
var menuHTML = "<div style='width:100%;height:100%;border: solid 1px red'>Context Menu</div>";
popup.document.body.innerHTML = menuHTML;
popup.show(evt.offsetX, evt.offsetY, 100, 24, elmt);
}
divEvent.innerText = '"onmousedown" event fired in this divsion element.';
}
</script>
<script Language="javascript">
function RunEvent()
{
// divEvent.onmousedown();
divEvent.fireEvent('onmousedown');
}
function FireEvent()
{
var evt = document.createEventObject();
evt.button = 2;
evt.type = 'onmousedown';
var rect = divEvent.getBoundingClientRect();
evt.offsetX = (rect.right+rect.left)/2;
evt.offsetY = (rect.bottom-rect.top)/2;
divEvent.fireEvent('onmousedown', evt);
}
</script>
<br />
<br />
<button onclick="RunEvent()">
Run Event</button>
<button onclick="FireEvent()">
Fire Event</button>
<br />
<br />
<button onclick="document.location.href=document.location.href">
Refresh</button>
當我們在藍色的地區內點擊滑鼠右鍵時,通過調用ShowContextMenu方法,會出現一個context menu。並且ShowContextMenu的邏輯依賴於event對象的屬性值,當我麼使用"Run Event"這個按鈕時,由於event對象裡是預設值,ShowContextMenu方法不能正確的執行。使用FireEvent方法,我們通過createEventObject調用,建立一個event對象,並賦與適當的屬性值,我們就可以完全使用代碼類比出滑鼠或鍵盤所觸發的事件動作。
當然,fireEvent和createEventObject方法都是IE實現的DOM提供的獨家方法。