【问题标题】:Dynamic creation of ActiveX on MSIE 11 is broken?在 MSIE 11 上动态创建 ActiveX 被破坏了?
【发布时间】:2014-01-15 20:24:07
【问题描述】:

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

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

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

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

    <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

【问题讨论】:

  • 我无法回答为什么它不能按照您的方式工作。但是您是否考虑过使用“new ActiveXObject(name);”?
  • 传统上我们的代码总是使用document.createElement('object')并且它总是有效,但现在尝试ActiveXObjct(progid)也失败了(虽然我对这个API不是很熟悉,因此可能用错了)。

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


【解决方案1】:

在与 Microsoft 支持人员通话后,我设法解决了这个问题。
我将按原样带来微软的答案:

通过进一步调试,我们似乎在动态添加对象时遇到了已知行为和设计更改。
早些时候,某些操作可能会强制对象在进入控制树之前进行实例化,这会破坏许多站点。
作为解决此问题的一部分,我们现在在对象进入树时完全提交对象并且其身份不能在那之后发生了变化。因为再现页面直到对象进入树之后才设置 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 上的一切都在为我工作。

【讨论】:

    【解决方案2】:

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

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

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

    请参阅this post 了解更多信息。

    【讨论】:

    • 我不认为这是一个安全问题,因为 (a) 我在安全设置中启用了 ActiveX 控件,并且 (b) &lt;OBJECT&gt; 标记确实成功创建了 AX 控件。
    • 附注我在桌面模式(不是 Metro)下运行 MSIE。
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    相关资源
    最近更新 更多