2008-09-29 97 views
19

這是對here回答的後續操作。如何在Javascript中處理ActiveX事件

我有一個自定義的ActiveX控件引發了一個事件(「ReceiveMessage」帶有「msg」參數),需要在Web瀏覽器中由Javascript處理。從歷史上看,我們已經能夠使用下面的IE只語法來做到這一點在不同的項目:

function MyControl::ReceiveMessage(msg) 
{ 
    alert(msg); 
} 

然而,在控制被埋葬佈局內的情況下,JavaScript不能找到控制。具體來說,如果我們把它放到一個簡單的HTML頁面中,它可以正常工作,但如果我們把它放到一個由<Form>標籤包裝的ASPX頁面中,我們會得到一個「MyControl is undefined」錯誤。我們嘗試了以下變體:

var GetControl = document.getElementById("MyControl"); 
function GetControl::ReceiveMessage(msg) 
{ 
    alert(msg); 
} 

...但它導致Javascript錯誤「GetControl未定義」。

處理從ActiveX控件發送的事件的正確方法是什麼?現在我們只對在IE中工作感興趣。這必須是我們正在做的一個自定義ActiveX控件。

謝謝。

+0

澄清一點 - getElementById工作正常。我們有一個對控件的引用,Javascript只是不喜歡使用帶有該引用的::語法。 – Raelshark 2008-09-29 21:44:16

+0

我從來沒有見過::語法,那裏有記錄? – AnthonyWJones 2008-09-30 07:21:49

+0

很難找到它的實際文檔,但是這裏有一個指向它的MSDN文章的鏈接:http://msdn.microsoft.com/en-us/library/ms974564.aspx – Raelshark 2008-09-30 11:57:44

回答

12

我可以使用下面的腳本塊格式得到這個工作,但我仍然好奇,如果這是最好的方法:

<script for="MyControl" event="ReceiveMessage(msg)"> 
    alert(msg); 
</script> 
0

我認爲MyControl :: ReceiveMessage例如不工作因爲ActiveX控件正在以不同的名稱或不同的範圍顯示。

通過GetControl :: ReceiveMessage示例,我相信在設置GetControl引用之前正在解析函數定義,因此它不引用有效的對象並且不能將該函數綁定到對象。

我會通過使用MS腳本調試器並試圖確定該控件的默認引用是否以不同的名稱或不同的範圍(可能作爲窗體的子項)存在來攻擊此問題。如果您可以確定控件的正確引用,則應該能夠使用MSDN文章中指定的Automagic ::方法正確地綁定該函數。

還有一個思想,可以參照基於對象的名稱,而不是ID,所以儘量同時設置:)

1

如果你有一個具有「MyControl的ID在網頁上的ActiveX元件「那麼你的JavaScript處理語法是這樣的:

function MyControl::ReceiveMessage(msg) 
{ 
    alert(msg); 
} 
5

OK,但如果你使用的是C#(.NET 2.0)與繼承的用戶控件(的ActiveX)... 只有這樣,才能使其正常工作是「擴展「事件的處理程序功能: http://www.codeproject.com/KB/dotnet/extend_events.aspx?display=Print

以上項目鏈接來自我們的朋友Werner Willemsens先生保存了我的項目。 如果你不這樣做,JavaScript無法綁定到事件處理程序。

由於他選擇的例子,他以複雜的方式使用了「擴展」,但如果簡單起見,將句柄直接附加到事件本身,它也可以工作。 的C#的ActiveX應該支持「ScriptCallbackObject」的事件綁定到一個javascript函數如下圖所示:

var clock = new ActiveXObject("Clocks.clock"); 
    var extendedClockEvents = clock.ExtendedClockEvents(); 
    // Here you assign (subscribe to) your callback method! 
    extendedClockEvents.ScriptCallbackObject = clock_Callback; 
    ... 
    function clock_Callback(time) 
    { 
    document.getElementById("text_tag").innerHTML = time; 
    } 

當然,你必須實現IObjectSafety的和其他安全東西,以使其更好地工作中。

1

我發現此代碼在表單標籤內工作。在這個例子中,回調是javascript傳遞給ActiveX控件的函數參數,callbackparam是在activeX控件中生成的回調事件的參數。這樣,我對任何類型的事件使用相同的事件處理程序,而不是嘗試聲明一堆單獨的事件處理程序。

<object id="ActivexObject" name="ActivexObject" classid="clsid:15C5A3F3-F8F7-4d5e-B87E-5084CC98A25A"></object>

<script>
function document.ActivexObject::OnCallback(callback, callbackparam){
callback(callbackparam);
}
</script>

8

我以前在我的應用程序中使用過activex。我把對象標籤放在ASP.NET窗體中,下面的JavaScript適用於我。

function onEventHandler(arg1, arg2){ 
    // do something 
} 

window.onload = function(){ 
    var yourActiveXObject = document.getElementById('YourObjectTagID'); 
    if(typeof(yourActiveXObject) === 'undefined' || yourActiveXObject === null){ 
     alert('Unable to load ActiveX'); 
     return; 
    } 

    // attach events 
    var status = yourActiveXObject.attachEvent('EventName', onEventHandler); 
} 
1

對我而言,我需要一種動態創建ActiveX控件並監聽它們的事件的方法。我能夠得到這樣的工作:

//create the ActiveX 
var ax = $("<object></object>", { 
    classid: "clsid:" + clsid, 
    codebase: install ? cabfile : undefined, 
    width: 0, 
    height: 0, 
    id: '__ax_'+idIncrement++ 
}) 
.appendTo('#someHost'); 

然後註冊一個處理程序的事件:

//this function registers an event listener for an ActiveX object (obviously for IE only) 
//the this argument for the handler is the ActiveX object. 
function registerAXEvent(control, name, handler) { 
    control = jQuery(control); 

    //can't use closures through the string due to the parameter renaming done by the JavaScript compressor 
    //can't use jQuery.data() on ActiveX objects because it uses expando properties 

    var id = control[0].id; 

    var axe = registerAXEvent.axevents = registerAXEvent.axevents || {}; 
    axe[id] = axe[id] || {}; 
    axe[id][name] = handler; 

    var script = 
    "(function(){"+ 
    "var f=registerAXEvent.axevents['" + id + "']['" + name + "'],e=jQuery('#" + id + "');"+ 
    "function document." + id + "::" + name + "(){"+ 
     "f.apply(e,arguments);"+ 
    "}"+ 
    "})();"; 
    eval(script); 
} 

該代碼允許您使用關閉和EVAL的範圍(最小化)。

必須已將ActiveX控件的<object>元素添加到文檔中;否則,IE瀏覽器將無法找到該元素,您只會收到腳本錯誤。