开发平台:Visual Studio 6.0/Visual Studio 2008
ATL类型:ATL控件
已实现接口:IProvideClassInfo2Impl
问题描述:在JavaScript无法动态为ATL控件附加事件在ATL控件中添加了 OnShowText 事件,ShowText 方法var atl = new ActiveXObject("MyPro.MyControl");
atl.OnShowText = function()//这样IE7报错,对象不支持此属性或方法
{
alert("ok");
}atl.attachEvent("OnShowText",eventFun);//这样也报错function eventFun()
{
alert("ok");
}<script event="OnShowText"></script> //这种方式可以正常响应
创建 MFC ActiveX控件存在同样问题,请问各位知道有谁原因吗?

解决方案 »

  1.   

    JavaScript本身不直接支持连接点(VBS是可以的),唯一能挂上事件的方式就是在网页中通过event=... for=...来实现,局限性非常高。至于atl.OnShowText和attachEvent,这是HTML元素提供的属性和方法,跟连接点一点关系都没有,你的控件不是DOM元素,无法这样使用,除非你自己在控件里也加上OnShowText属性或者attachEvent方法。
      

  2.   

    <script language = "JavaScript">   
        function Yfunction() {
            atl.ShowText( );  <!- 调用方法 -->
        }
    </script>                           
    <script language="JavaScript1.2" FOR="atl" EVENT = "OnShowText" >  <!-相应事件(只能用事件名称,不能带参数)-->
        alert("ok");  <!-使用OnShowText事件发生 即弹出警告框。-->
    </script><input id="" type="button" value=" 开 始:" onclick=“Yfunction()"  />  <!-按钮调用JavaScript方法,JavaScript再调用控件方法-->JavaScript毕竟是脚本语言 的确有很多局限性 只要了解了它与控件之间交互的过程 尽量避免 还是可以达到一定目的的。
      

  3.   

    非常感谢两位高手。
    不过我仍然有一些疑问:
    (1)腾迅的多文件上传插件没有使用 event for 这样的语法来为他们的控件设置事件,而是使用 attachEvent 语法来设置的。
    (2)微软的 XMLHttpRequest 组件可以直接在JavaScript里面设置他们的事件
       例如:
    <script type="text/javascript">
    var xmlhttp;
    function loadXMLDoc(url)
    {
    xmlhttp=null;
    if (window.XMLHttpRequest)
    {// code for all new browsers
    xmlhttp=new XMLHttpRequest();
    }
    else if (window.ActiveXObject)
    {// code for IE5 and IE6
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    if (xmlhttp!=null)
    {
    xmlhttp.onreadystatechange = state_Change;//在这里动态设置了事件
    xmlhttp.open("GET",url,true);
    xmlhttp.send(null);
    }
    else
    {
    alert("Your browser does not support XMLHTTP.");
    }
    } function state_Change()
    {
    if (xmlhttp.readyState==4)
    {// 4 = "loaded"
    if (xmlhttp.status==200)
    {// 200 = OK
    // ...our code here...
    }
    else
    {
    alert("Problem retrieving XML data");
    }
    }
    }
    </script>
      

  4.   

    xmlhttp.onreadystatechange = state_Change;//在这里动态设置了事件
    ==============
    这就是关键!xmlhttp组件本身有一个可设置的onreadystatechange属性,所以上面的赋值相当于设置一个属性值,这不是连接点。还是上面说的,你也可以添加一个OnShowText属性。
      

  5.   

    太感谢 浆糊 了,终于让我明白为什么XMLHttp能够直接赋值,看来我把 JavaScript 语法与 ATL 本身的事件等机制搞混了。