internet-explorer - 可插入协议(protocol)处理程序中的 IE 和怪异模式

标签 internet-explorer quirks-mode pluggableprotocol

我有以下问题:

可插入协议(protocol)处理程序提供 HTML 文件。

这些文件没有正确的文档类型 - 文档类型完全丢失。我无法更改此设置,这些文件来自第三方。

所以我想使用“X-UA-Compatible: IE=edge” header 来设置文档类型。当我从真正的网络服务器上执行此操作时,它会按预期工作。当我通过 IHttpNegotiate::OnResponse 从协议(protocol)处理程序执行此操作时,它不起作用。

我已经尝试添加更多 header ,例如“Content-Type”,当然还有“HTTP/1.1 200 OK”,直到我报告收到的所有 header 从真实的网络浏览器 - IE 仍然将 documentMode 设置为 5。

有人对此有什么想法吗?

这是我正在尝试的:

pOIProtSink->ReportProgress(BINDSTATUS_FINDINGRESOURCE, L"Found");
pOIProtSink->ReportProgress(BINDSTATUS_CONNECTING, L"Connecting");
pOIProtSink->ReportProgress(BINDSTATUS_SENDINGREQUEST, L"Sending");

CComQIPtr<IServiceProvider> provider(pOIProtSink);
if (provider) {
  CComPtr<IHttpNegotiate> negotiate;
  provider->QueryService(IID_IHttpNegotiate, IID_IHttpNegotiate,
      (void**)&negotiate.p);
  if (negotiate) {
    CStringW hdrs;
    hdrs.Format(
      L"HTTP/1.1 200 OK\r\nContent-Type: %s\r\nX-UA-Compatible: IE=edge\r\n\r\n",
      sMime);
    negotiate->OnResponse(200, hdrs, L"", NULL);
  }
}

pOIProtSink->ReportProgress(BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE, sMime);
pOIProtSink->ReportData(BSCF_FIRSTDATANOTIFICATION, 0, sz);
pOIProtSink->ReportData(BSCF_LASTDATANOTIFICATION
    | BSCF_DATAFULLYAVAILABLE, sz, sz);

pOIProtSink->ReportResult(S_OK, 0, NULL);

完整代码可以在 github 上找到.

干杯
图像

最佳答案

据我所知,当您错过文档类型时,它会触发 Quirks 模式,并且这会胜过使用 X-UA-Compatible 设置模式的任何其他尝试。

所以简短的回答是,您提出的解决方案行不通。

抱歉。

我能想到的唯一其他解决方案是将整个内容包装到 iframe 中。 IE 只能对页面使用单一渲染模式,包括任何嵌入的框架。这意味着,如果父页面处于标准模式,则任何 iframe 也将处于标准模式,即使它们通常处于怪异模式或兼容模式。

我最近在这里看到了很多对此的提示,人们试图将新代码插入到旧的怪癖模式网站中,反之亦然,并因无法指定 iframe 模式而苦苦挣扎。但就您而言,这可能对您有利,因为如果您可以将内容注入(inject) iframe,那么您将能够根据您指定的模式,有效地将页面设置为您喜欢的任何模式。父页面。让 iframe 填满整个页面,您就得到了解决方案。

这是我能想到的强制您的页面进入标准模式的唯一方法。

当然,如果您可以注入(inject)文档类型,那就容易多了,或者如果原始第三方提供商可以修复他们的代码以包含文档类型,那就更好了。

但令我困惑的是,如果它不包含文档类型并且第三方提供了这样的文档类型,那么他们一定已经以这种方式对其进行了测试,所以大概他们期望它以怪异模式运行?鉴于此,强制其进入标准模式的动机是什么?

关于internet-explorer - 可插入协议(protocol)处理程序中的 IE 和怪异模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19812623/

相关文章:

javascript - 悬停时奇怪的 IE 错误已更新

html - css 导航栏菜单在旧 ie 中不起作用

javascript - 选择类的所有元素并迭代每个偶数对象(第 n 个子(偶数)替换)

javascript - jQuery 的 :hidden selector not working in IE9 Quirks Mode

javascript - 无法触发链接上的点击事件

internet-explorer - 禁用 IE 中的调整大小控件

jquery - <按钮> 在 IE7 中