在MSIE 11上动态创建ActiveX已被破坏?

时间:2013-12-19 12:04:38

标签: javascript activex windows-8.1 internet-explorer-11

操作系统版本:Windows 8.1
MSIE(Microsoft Internet Explorer)版本: 11 .0.9600.16476(KB2898785)

我有一个简单的HTML代码,用于创建我的ActiveX Control(AX)。
此代码始终适用于所有以前版本的MSIE,但在 Windows 8.1 上使用新的MSIE-11时,它已停止工作。

我在这里带来了演示问题的HTML代码 请注意:

  • 创建我的AX的静态HTML代码(<OBJECT>始终有效
  • 在MSIE 11上创建我的AX(document.createElement的动态JavaScript代码失败

    <BODY>
        <BR>
        <BR>
            <INPUT TYPE="BUTTON" VALUE="CreateAX" OnClick="CreateAX()" STYLE="WIDTH: 89PX" />
        <BR>
        <BR>
        <!--    This always work:   -->
        <OBJECT ID      = "MyCtrl"
                CLASSID = "CLSID:F417FD96-3D17-4556-80AA-F7CEEE1E3FD8" 
                WIDTH   = 100
                HEIGHT  = 100>
        </OBJECT>
        <BR>
        <BR>
    </BODY>
    
    <SCRIPT LANGUAGE="javascript" TYPE="text/javascript">
    function CreateAX() 
    {
        //  This will not work on MSIE 11
        var playbackObjectGlobal = document.createElement('object');
        playbackObjectGlobal.setAttribute('id',     'MyCtrl2');
        playbackObjectGlobal.setAttribute('classid','CLSID:F417FD96-3D17-4556-80AA-F7CEEE1E3FD8');
        playbackObjectGlobal.setAttribute('width',  '200');
        playbackObjectGlobal.setAttribute('height', '200');
        playbackObjectGlobal.setAttribute('hidden', 'false');
        document.body.appendChild(playbackObjectGlobal);
    }
    </SCRIPT>
    

调试后发现我的工作确实已创建没有窗口m_hWnd==NULL)因此所有与GUI相关的功能和事件都被禁用。

任何人都熟悉这个问题吗? 谢谢,PazO

2 个答案:

答案 0 :(得分:3)

在使用Microsoft支持打开电话后,我设法解决了这个问题。
我将带来微软的答案:

  

通过进一步的调试,我们似乎在动态添加对象时遇到已知的行为和设计变化   之前,某些操作可能会强制对象在进入控制树之前进行实例化,这会破坏许多站点。
作为修复它的一部分,我们现在完全提交一个对象,当它进入树并且它的身份不能在那之后改变。因为repro页面在对象进入树之前才设置CLSID属性,所以忽略该值。
如果移动控件上设置 CLSID 的步骤对象插入树之前,控件应该正确实例化。
除了上述更改之外,我们还删除了“隐藏”属性,因为它设置了对象在隐藏模式下。

修复前:

function CreateAX() 
{
    var playbackObjectGlobal = document.createElement('object');
    playbackObjectGlobal.setAttribute('id',         'MyCtrl2');
    playbackObjectGlobal.setAttribute('classid','CLSID:F417FD96-3D17-4556-80AA-F7CEEE1E3FD8');
    playbackObjectGlobal.setAttribute('width',      '200');
    playbackObjectGlobal.setAttribute('height',     '200');
    playbackObjectGlobal.setAttribute('hidden',     'false');
    document.body.appendChild(playbackObjectGlobal);
}

修复后:

function CreateAX_New() 
{
    var playbackObjectGlobal = document.createElement('object');
    //    *Change-1*   Next two lines swiched places:
    playbackObjectGlobal.setAttribute('classid','CLSID:F417FD96-3D17-4556-80AA-F7CEEE1E3FD8');
    playbackObjectGlobal.setAttribute('id',         'MyCtrl2');
    //    *Change-2*   Object is appended before sizes are set:
    document.body.appendChild(playbackObjectGlobal);
    playbackObjectGlobal.setAttribute('width',      '200');
    playbackObjectGlobal.setAttribute('height',     '200');
    //    *Change-3*   The 'Hidden' tag was removed
}

现在所有人都在Windows 8.1MSIE-11上为我工作。

答案 1 :(得分:1)

在Metro模式下,ActiveX在Windows8 / IE11上受到严格限制。

它被锁定为仅允许一组非常有限的控件,几乎所有控件都是内部MS控件。

如果您需要使用不在该列表中的任何ActiveX控件,则只有在桌面模式下使用Win8时才能使用它。即使这样,您仍可能需要手动设置浏览器设置以启用ActiveX。

有关详细信息,请参阅this post

相关问题