操作系统版本:Windows 8.1
MSIE(Microsoft Internet Explorer)版本: 11 .0.9600.16476(KB2898785)
我有一个简单的HTML
代码,用于创建我的ActiveX Control
(AX)。
此代码始终适用于所有以前版本的MSIE,但在 Windows 8.1 上使用新的MSIE-11时,它已停止工作。
我在这里带来了演示问题的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
答案 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.1
,MSIE-11
上为我工作。
答案 1 :(得分:1)
在Metro模式下,ActiveX在Windows8 / IE11上受到严格限制。
它被锁定为仅允许一组非常有限的控件,几乎所有控件都是内部MS控件。
如果您需要使用不在该列表中的任何ActiveX控件,则只有在桌面模式下使用Win8时才能使用它。即使这样,您仍可能需要手动设置浏览器设置以启用ActiveX。
有关详细信息,请参阅this post。