2

我有以下问题:

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

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

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

我已经尝试添加更多的标题,例如“ Content-Type”,当然还有“ HTTP/1.1 200 OK”,直到我报告从真正的网络浏览器收到的所有标题 - 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上找到。

干杯
想象

4

1 回答 1

2

据我所知,当您错过 doctype 时,它​​会触发 Quirks 模式,这胜过任何其他使用X-UA-Compatible.

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

对不起。

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

我最近在这里看到了许多抱怨这个问题的问题,人们试图将新代码插入旧的怪癖模式站点,反之亦然,并且无法为 iframe 指定模式。但是在您的情况下,这可能对您有利,因为如果您可以将内容注入 iframe,那么您将能够根据您指定的模式有效地将页面设置为您喜欢的任何模式父页面。让 iframe 填满整个页面,您就有了解决方案。

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

当然,如果你可以只注入 doctype 会容易得多,或者如果原始的第三方提供商可以修复他们的代码以包含 doctype,那就更好了。

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

于 2013-11-06T13:12:53.400 回答