小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

如何用Javascript捕獲ActiveX對(duì)象的事件

 quasiceo 2014-07-10


    最近參與了一個(gè)項(xiàng)目,我的同事在開發(fā)一個(gè)ActiveX對(duì)象,我?guī)退帉慗S腳本來調(diào)用這個(gè)對(duì)象,其中碰到蠻多問題,最難的就是如何響應(yīng)由ActiveX對(duì)象返回的對(duì)象事件。正好,現(xiàn)在一起總結(jié)一下。

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

    COM組件
        方法:   
                  
void init()                    //初始化對(duì)象
                  Project createProject()        //創(chuàng)建一個(gè)Project類型的對(duì)象并返回
        事件:
                  onInit( int_code )             
//當(dāng)init成功后觸發(fā)

     Project類的結(jié)構(gòu):
        方法:
                  
void init()                     //初始化Project對(duì)象
        事件:
                  onInit( int_code )              
//當(dāng)init成功后觸發(fā)

    然后,我們?cè)诰W(wǎng)頁里創(chuàng)建一個(gè)ActiveX對(duì)象

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

    然后,我們定義全局的變量obj和project,來保存對(duì)象的實(shí)例,并調(diào)用他們的相關(guān)方法

var obj = null;                                    //全局對(duì)象
var project = null;                                //Project對(duì)象
window.onload = function(){
    obj 
= document.getElementById('myobj');        //獲取對(duì)象
    obj.init();                                    //初始化對(duì)象
    project = obj.createProject();                 //創(chuàng)建project對(duì)象
    project.init();                                //調(diào)用project對(duì)象的方法
};

最常見的對(duì)象事件響應(yīng)方法

最常見的莫過于使用script event for的標(biāo)簽語法來響應(yīng)對(duì)象事件了,Windows Media Player就是這樣做的

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

for屬性指定了這個(gè)事件響應(yīng)的對(duì)象是myobj,注意,這里要寫object標(biāo)簽的id,不能是js變量
event屬性指定了要響應(yīng)哪個(gè)事件,這里是onInit事件。


如何響應(yīng)ActiveX對(duì)象返回的對(duì)象事件

現(xiàn)在問題來了,我們調(diào)用了createProject方法,得到了一個(gè)project對(duì)象。這個(gè)對(duì)象也有事件,那么這時(shí)應(yīng)該如何來響應(yīng)呢?
顯然,用之前的script event for的方法是不行的,因?yàn)閒or屬性不能指定js變量的值。網(wǎng)上搜索了一下,找到了一種很特別的方法,就是用雙冒號(hào)來定義函數(shù)名,于是,修改程序如下:

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

不過,運(yùn)行后有報(bào)錯(cuò),說project未定義,想起來,js會(huì)優(yōu)先執(zhí)行function這個(gè)函數(shù)定義,也就是說先定義函數(shù),然后才執(zhí)行語句。所以,function必須在project創(chuàng)建成功以后才能定義,因此,修改程序如下:

var project = createProject();
var fn = function(){  //定義一個(gè)函數(shù),這個(gè)函數(shù)內(nèi)部會(huì)定義我們的回調(diào)函數(shù)
    //回調(diào)函數(shù)
    function project::onInit( code )
    {
        
if ( code == 0 )
        {
            
//Todo:
        }
    }
};
fn();    
//執(zhí)行這個(gè)函數(shù),也就是定義回調(diào)函數(shù)

運(yùn)行了一下,確實(shí)能響應(yīng)了。



后記

不知大家看到 function project::onInit( code ) 這樣的寫法,是不是覺得很奇怪?我看到這種寫法以后,很吃驚,因?yàn)槲覐臎]看到過javascript有這樣的語法,這看上去像是定義一個(gè)靜態(tài)函數(shù),又像是在project命名空間中定義一個(gè)函數(shù)。于是我測(cè)試了一下,發(fā)現(xiàn)firefox并不能識(shí)別這樣的函數(shù)定義,會(huì)報(bào)語法錯(cuò)誤,說明這個(gè)不是標(biāo)準(zhǔn)javascript的寫法,是IE-Only的寫法。難道是JScript的語法?我又把JScript的手冊(cè)從頭到尾看了一遍,也沒看到類似的語法。上微軟的MSDN,也沒有找到雙冒號(hào)的語法參考。不過,我在一個(gè)論壇里,看到了這樣一段話

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.

或許這種寫法就是為了實(shí)現(xiàn)ActiveX的event handler而準(zhǔn)備的吧



    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多