7

私はこの問題を抱えており、解決策を見つけることができないようです...

初期ロード時にネイティブIE7(IE9 / IE8からエミュレートされたものではない)で正常にレンダリングされるページがありますが、ブラウザーのキャッシュから提供される後続の要求でIE6標準モードにフォールバックします。IE7は「div.class1.class2」のような複数のCSSクラスを処理する方法を知っていますが、IE6標準モードはそうではありません。

これを再現する方法は次のとおりです。

  • IE7を開きます(実際のIE9 / IE8のIE7エミュレートモードは機能しません!
  • hhttp://beta.upcload.com/widget/popup?garmentId = workaholicfashion-5276777&sid=にアクセスします
  • 最初の訪問では、すべてが見栄えがよく、ダンディに見えるはずです(たとえば、ChromeやFFのような青いボタン)
  • 今すぐページをリロードすると、ブラウザがIE6標準モードにフォールバックするため、いくつかのCSSルールが破られます(クァークズモードではなく、1つを確認しました!document.compatModeはまだ「CSS1Compat」です)
  • キャッシュをクリアしてリロードすると、すべてが再びきれいに見えます
  • 何度でも繰り返す

したがって、すべてのファイルがAmazonサーバーから提供される場合、IE7は、複数のクラスを含むCSSルールを含め、ファイルを適切にレンダリングするようです。(たとえば、「div.class1.class2」)まったく同じページをまったく同じコードでリロードしようとすると、チェーンされたCSSクラスを理解せず、いくつかを壊すIE6標準モード(Quirksモードではない)に何らかの形で切り替わります。デザイン、例えばボタン。いくつかの異なるDoctype/Metaヘッダーを追加しようとしましたが、すべて違いはありません。現在、ページはXHTML Strictで有効であり、X-UA-Compatible IE = edgeヘッダーがありますが、キャッシュからロードすると正しくレンダリングされません。私が理解できたヘッダーの唯一の違いは、変更されていないリクエストのContent-Typeヘッダーが欠落していることでしたが、それは問題ではないはずですよね?

それに加えて、ローカル開発サーバーでIE7を使用してこのまったく同じページを開くと、リロードした後でも問題なくレンダリングされます。:/

アップデート

さて、ようやく開発サーバーで再現することができました。唯一の違いは「max-age」ヘッダーで、ブラウザはローカルに何もキャッシュしませんでした。キャッシュ時間を増やすと、IE7もそれらのファイルのキャッシュを開始しました。これにより、ファイルがキャッシュから読み込まれると、デザインが中断されました。したがって、サーバーからではなくキャッシュから提供されるファイルに問題があるはずです。

アップデート2

CSSファイルに絞り込みました。IE7は、キャッシュから取得した場合(つまり、Content-Typeヘッダーなし)にIE6モードでレンダリングし、サーバーからロードした場合はIE7モードでレンダリングするようです。(Content-Type:text / css)なぜそうなるのか誰かが知っていますか?たぶんいくつかの不正なCSSルール?回避策として、キャッシュを防ぐためにスタイルシートにランダムなパラメーターを追加します。これにより、IE7がIE6モードに切り替わることはありませんが、スタイルシートからすべてのエラーと警告を削除しても、問題は解決しません。

4

1 に答える 1

5

少し前に、レガシー IE6 アプリをサポートしているときに、まったく逆の動作を経験しました。

とにかく、あなたは xhtml 1.0 の厳密な doctype を使用しています。これは重要な出発点です!

最初に: 通常のチェックリスト:

  • (生成)(X)HTML ファイル/データは BOM なしで送信/保存されます。DTD の前に 1 バイトはありませんか?
  • ファイルを送信したサーバーから送信される設定を確認しましたか?
  • ドキュメントのコンテンツ タイプは 'text/html' または XML ('application/xhtml+xml' または 'application/xml') (マークアップ ソース = メタ タグおよび/またはサーバーによって送信された = ヘッダー内) ですか?
  • ページは、Microsoft ブラックリスト (IE フォールバック モードが許可されていない) のドメインから提供されている (または通信している) か?
  • lan/intRAnet と wan/internet の間の IE のセキュリティ設定の違いを確認しましたか (異なる動作について言及したため)。
  • インターネットにも接続するプロキシが存在する可能性があります (何かを書き換える可能性がありますか?)

このデータの準備ができたら、私が今まで見たブラウザモード切り替えに関する最高の情報源にアクセスしてください
ブラウザモードの切り替えには 2 つの部分があり、いつどのような動作が予想されるかを理解する必要があります。
同じページには、 IEが最終的なレンダリング/ブラウザー モードを決定するためにたどる広範な迷路についての洞察を与えるIE モード切り替えフローチャートもあります。

これが役立つことを本当に願っています!

更新:
IE6 (標準/互換) モードはありません (新しいバージョンの IE では)。マイクロソフトの公式ドキュメント(およびこの引用の更新されたリンク) を参照してください !! 引用させてください:

Windows Internet Explorer 7 は、ユニバーサル セレクターのサポートなど、業界標準をより完全にサポートするように設計された新機能を提供しました。ディレクティブは 2 つの設定 (quirks モードと標準モード) のみをサポートするため、IE7 標準モードが Internet Explorer 6 標準モードに取って代わりました。

そして、これが彼らのdoctype-switchチェッカーのコードです(同じページのソース):

engine = null;
if (window.navigator.appName == "Microsoft Internet Explorer")
{
   // This is an IE browser. What mode is the engine in?
   if (document.documentMode) // IE8 or later
      engine = document.documentMode;
   else // IE 5-7
   {
      engine = 5; // Assume quirks mode unless proven otherwise
      if (document.compatMode)
      {
         if (document.compatMode == "CSS1Compat")
            engine = 7; // standards mode
      }
      // There is no test for IE6 standards mode because that mode  
      // was replaced by IE7 standards mode; there is no emulation.
   }
   // the engine variable now contains the document compatibility mode.
}

上記のマイクロソフトのコードのコメントを読んでください!!!!

2 回目の更新について:
キャッシュについてよくわかりました。したがって、cssが今問題です。従来の IE6 アプリに IE6 が必要な理由 (IE6 を終了させるのが非常に難しい理由) を理解し始めたので、条件付きコメントを確認する必要があるかもしれません。以来:

  • それらはハックではありません (ただし、SDC がコメントで指摘したように、Microsoft はIE10 以降からそれらを削除しました)
  • JavaScriptブラウザスニッフィングなし(スクリプトを有効にする必要がないため、常に機能します)、
  • また、IE の特定の (範囲の) バージョンを排他的にターゲットにすることができます。

それらの中に、IE 固有の css へのリンクを含めることができます (ドキュメントを小さく、スリムで整然とした状態に保ちます)...

于 2012-07-26T02:38:09.523 に答える