【问题标题】:document.body.innerHTML fails on IE when setting it to "<P><HR>"document.body.innerHTML 在 IE 上设置为“<P><HR>”时失败
【发布时间】:2017-12-24 22:03:59
【问题描述】:

我们的应用程序使用嵌入式 IE 控件,我们注意到设置:

document.body.innerHTML&lt;P&gt;&lt;HR&gt; 会导致 OLE 异常 "Unknown runtime error"
我可以在 IE 浏览器本身(IE 版本 8)中重现这一点。

<!DOCTYPE HTML>
<html>
<head>
  <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
  <title>Untitled</title>
  <script>
  function load(){
  // alert(document.body.innerHTML)
  document.body.innerHTML = '<P><HR>';
  }
  </script>
</head>

<body onload="load()">
</body>
</html>

如果 body.innerHTML 设置为 &lt;P&gt;&lt;/P&gt;&lt;HR&gt; 一切都很好。但是 HTML 字符串来自数据库的问题。为什么会发生这种情况,如何解决?


编辑: 代码在 IE11 上运行良好。但问题存在于使用 IE8 的系统上。无论我是否更改 FEATURE_CONTROL_BROWSER_EMULATION 键。 IE8有什么可以做的吗?

【问题讨论】:

  • 我无法重现此问题。你的代码对我来说很好。您使用 Web 浏览器控件的后端语言是什么?
  • @AlexanderRyanBaggett,我使用 Delphi (TWebBrowser)。您是否在真正的 IE 浏览器中尝试过 HTML 代码?如果是,哪个版本?
  • 我实际上是在 .net Web 浏览器控件中完成的。是的,它适用于 Win10/IE11,但我必须允许通过鼠标单击阻止内容。
  • 使用 IE11 浏览器通过 f12 开发工具对您的页面进行故障排除。首先进入工具>互联网选项>高级选项卡,选中“始终记录开发者控制台消息”。保存更改。当您使用 f12 开发工具加载页面时...控制台选项卡将列出标记错误...您使用的 DTD 无效(使用 代替。开发工具的仿真选项卡会告诉您哪个仿真模式 IE(浏览器正在使用).. 我希望 IE 将显示 IE11 仿真模式(默认)但是您的 Delphi 托管的 WBC 将使用 IE7 或 IE5 仿真。
  • @AlexanderRyanBaggett,我在 XP/Win7 中测试了上面的 HTML 代码。两者都安装了IE8。这两种情况我都可以重现。

标签: html internet-explorer dom webbrowser-control


【解决方案1】:

无论是由 Delphi 还是 .net 桌面应用程序托管的 MSIE WBC(Web 浏览器控件),默认情况下都使用 IE7 仿真...。要确定托管的 WBC 使用哪种 IE 仿真模式,请将以下 sn-p 添加到加载事件。 alert(document.documentMode?document.documentMode:'n/a'); 要使您的 WBC 使用 IE 仿真模式,您需要在注册表的 FEATURE_CONTROL_BROWSER_EMULATION 键中添加一个注册表项。

在此处查看文档 - https://msdn.microsoft.com/en-us/library/ms537184%28v=vs.85%29.aspx

让您的无效标记生效。 1. 使用有效的文档类型声明。 ()。 2. 更改注册表中的 FEATURE_CONTROL_BROWSER_EMULATION 值以模拟 IE8 或更高版本....

理想情况下,您希望 WBC 模拟 IE11 和现代 Web 标准的 html5,但如果您现有的标记是 HTML5 之前的 CSS 3,这可能是不可能的。(即:您的标记是在 Intranet 网站上为 IE6 开发的,使用 DHTML(HTML 的早期 MS 版本)。

【讨论】:

  • Rob 这个信息是正确的。但是,鉴于我可以在不更改注册表的情况下让他的代码工作,我不相信这是必要的,或者它会解决他的问题。
  • 您能否在使用 Web 浏览器控件重新创建问题时产生问题?
  • document.documentMode 说什么?我希望它会返回 5... 表示 MSHTML.dll 正在使用 Quirks 模式。你的开发语言是什么?视觉 C?视觉基础? X代码?德尔福?我认为您最初的问题表明您使用的是 .ocx (VS/VB/Delphi),它仅以 32 位形式提供
  • Rob,zig 是原始海报。我用 .net wpf 后端运行它。但最终,它仍然 IEFrame.dll 被加载到应用程序的内存中。当我做 navigator.useragent 时,我得到了 MSIE7。无论如何,他的代码对我有用,因为我看到了水平规则。虽然他的 script 标签不应该在 head 和 body 标签之间。
  • 更改 FEATURE_CONTROL_BROWSER_EMULATION 没有任何区别。我使用 IE8 浏览器(我的许多客户也是如此)。并设置 FEATURE_CONTROL_BROWSER_EMULATION(或http-equiv="X-UA-Compatible" content="IE=edge")会将其设置为最大 8。这在具有 IE11 的系统上运行良好。但不是 8。
猜你喜欢
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
相关资源
最近更新 更多