ActiveX event handlers in an HTA using JScript

前端 未结 2 1525
忘了有多久
忘了有多久 2020-12-06 15:48

In C# I can write event handlers as follows:

var wdApp = new Microsoft.Office.Interop.Word.Application();
wdApp.DocumentBeforeSave += (Document doc, ref bool          


        
2条回答
  •  南笙
    南笙 (楼主)
    2020-12-06 16:11

    The error appears to be because

    1. In Javascript/JScript function declarations are evaluated first, before the variable is initialized. It's as if the code was written thus:

       var wdApp;
       function wdApp::Quit() { ... }
       wdApp = new ActiveXObject('Word.Application');
      
    2. The Microsoft JScript parser interprets the specially-named declaration (with ::) as an instruction to attach the function as an event handler.

    3. But at the point of the declaration, the handler cannot be attached to the object referred to by wdApp, because wdApp at that point is still undefined. Hence, the error.

    The solution is to force the function declaration to be evaluated after wdApp is initialized. This can be done in one of three ways1:

    1. Since the function declaration is hoisted only to within the function scope, wrap the function declaration in an IIFE:

       var wdApp = new ActiveXObject('Word.Application');
       (function() {
           function wdApp::Quit() {
               //do stuff here
           }
       })();
      
    2. Create the declaration using some sort of string -> code mechanism -- eval, setTimeout with a string, window.execScript, or new Function:

       var wdApp = new ActiveXObject('Word.Application');
       eval('function wdApp::Quit() { ... }`);
      
    3. Initialize the variable before the current SCRIPT block. Most of the examples in the Scripting Events article do this by setting the id property on some element before the SCRIPT block:

    
    
        
    
    

    As far as polluting the global namespace, only the third variant requires wdApp to be in the global namespace; the other two variants can be wrapped in an IIFE.


    1. Technically, there is a fourth way under IE and HTAs, but it involves non-standard HTML instead of non-standard Javascript; But it can only be used if the object is declared using the HTML OBJECT tag, not with new ActiveXObject( ... ).

    
    

    提交回复
    热议问题