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


最近參與了一個項目,我的同事在開發一個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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM