【问题标题】:IE and quirks mode in a pluggable protocol handler可插入协议处理程序中的 IE 和 quirks 模式
【发布时间】:2013-11-06 21:12:53
【问题描述】:

我有以下问题:

一个可插入的协议处理程序交付 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上找到。

干杯
意象

【问题讨论】:

    标签: internet-explorer quirks-mode pluggableprotocol


    【解决方案1】:

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

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

    对不起。

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

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

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

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

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

    【讨论】:

    • 感谢您的回答。但我应该提一下,X-UA-Compatible 标头在从网络服务器发送时有效,这意味着,通过 http,即使没有任何 doctype。但是,iframe 解决方案可能是一种选择。干杯!
    • @imagiro:重新覆盖,很公平:我对可插拔协议的了解不够多,因此无法确定(因此我说“据我所知”)。但无论如何,我很高兴能够为您推荐一个替代选择。我希望它有效。告诉我。
    • 嗨 Spudley,iframe 解决方案基本上可以工作,我只是不喜欢没有更清洁方法的想法。但这可能是 MS 可能会考虑的事情..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 2013-10-18
    • 1970-01-01
    相关资源
    最近更新 更多