用createEventObject來類比事件參數

來源:互聯網
上載者:User
    原來在程式中類比事件觸發的時候,我寫過一篇文章叫"在什麼時候才會用到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提供的獨家方法。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.