如何用Javascript捕獲ActiveX對象的事件

來源:互聯網
上載者:User
最近參與了一個項目,我的同事在開發一個ActiveX對象,我幫他編寫JS指令碼來調用這個對象,其中碰到蠻多問題,最難的就是如何響應由ActiveX對象返回的對象事件。正好,現在一起總結一下。

    首先,我來介紹一下COM組件,以便說明js如何響應

     COM組件
         方法:   
                  void init()                    //初始化對象
                   Project createProject()        //建立一個Project類型的對象並返回
         事件:
                   onInit( int_code )             //當init成功後觸發


      Project類的結構:
         方法:
                  void init()                     //初始化Project對象
         事件:
                   onInit( int_code )              //當init成功後觸發


    然後,我們在網頁裡建立一個ActiveX對象

<object id="myobj" classid="CLSID:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"></object>


    然後,我們定義全域的變數obj和project,來儲存對象的執行個體,並調用他們的相關方法

var obj = null;                                    //全域對象
var project = null;                                //Project對象
window.onload = function(){
     obj = document.getElementById('myobj');        //擷取對象
     obj.init();                                    //初始化對象
     project = obj.createProject();                 //建立project對象
     project.init();                                //調用project對象的方法
};


最常見的對象事件回應程式法

最常見的莫過於使用script event for的標籤文法來響應對象事件了,Windows Media Player就是這樣做的

<script language="Javascript" event="onInit( code )" for="myobj">  
if ( code == 0 )
{
    //Todo:
}
</script>


for屬性指定了這個事件響應的對象是myobj,注意,這裡要寫object標籤的id,不能是js變數
event屬性指定了要響應哪個事件,這裡是onInit事件。


如何響應ActiveX對象返回的對象事件

現在問題來了,我們調用了createProject方法,得到了一個project對象。這個對象也有事件,那麼這時應該如何來響應呢?
顯然,用之前的script event for的方法是不行的,因為for屬性不能指定js變數的值。網上搜尋了一下,找到了一種很特別的方法,就是用雙冒號來定義函數名,於是,修改程式如下:

var project = obj.createProject();
function project::onInit( code )
{
    if ( code == 0 )
     {
        //Todo:
     }
}


不過,運行後有報錯,說project未定義,想起來,js會優先執行function這個函數定義,也就是說先定義函數,然後才執行語句。所以,function必須在project建立成功以後才能定義,因此,修改程式如下:

var project = createProject();
var fn = function(){  //定義一個函數,這個函數內部會定義我們的回呼函數
    //回呼函數
    function project::onInit( code )
     {
        if ( code == 0 )
         {
            //Todo:
         }
     }
};
fn();    //執行這個函數,也就是定義回呼函數


運行了一下,確實能響應了。



後記

不知大家看到 function project::onInit( code ) 這樣的寫法,是不是覺得很奇怪?我看到這種寫法以後,很吃驚,因為我從沒看到過javascript有這樣的文法,這看上去像是定義一個靜態函數,又像是在project命名空間中定義一個函數。於是我測試了一下,發現firefox並不能識別這樣的函數定義,會報語法錯誤,說明這個不是標準javascript的寫法,是IE-Only的寫法。難道是JScript的文法?我又把JScript的手冊從頭到尾看了一遍,也沒看到類似的文法。上微軟的MSDN,也沒有找到雙冒號的文法參考。不過,我在一個論壇裡,看到了這樣一段話


A second script block that defines your event handler based on the global variable. This has to be a separate script block, and the object has to be defined before this script block evaluates. Syntax is "function object::Event(params)", where "object" is the name of the variable containing the object, "Event" is the name of the even to which you're subscribing, and "params" is the set of parameters the event handler expects.


或許這種寫法就是為了實現ActiveX的event handler而準備的吧

 

from:http://www.cnblogs.com/carekee/articles/1772194.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.