3

バックグラウンド

私は使用しているCMS用のレスポンシブ画像プラグインに取り組んでおり、ユーザーの画面のサイズをサーバーに通知するために、即時のset-cookieメソッドを使用することを選択しました。

これに慣れていない場合は、ドキュメントの上部にあるjavascriptでCookieを設定することを意味します。したがって、ブラウザがドキュメントの残りの部分を解析し続けると、画像のリクエストとともにCookieが送信されます。

これは、IE9を除くほとんどのブラウザーで機能します。これについての一般的な説明は、IE9がドキュメントの解析を完了するまで実際にはCookieを設定しないというもののようですが、これは本当に奇妙な動作のようです。私は独自のテストを行い、Cookieは単なる特別な例外ではなく、実際にはIE9がjavascriptを処理する方法であるという結論に達しました。IE9はドキュメントの解析が完了するまでjavascriptを実行しないようです。

残念ながら、インラインJSの実行に取り掛かる前に、外部リソースに対するすべての要求を送信します。

質問

ドキュメントがまだ解析されている間に、IE9(およびこの動作を示す他のブラウザー)にjavascriptを実行させる方法はありますか?

編集

だから私は進歩を始めています、それはバックグラウンドコンパイルを行うIE9javascriptエンジンと関係があるかもしれません。私はそれがそれをコンパイルする前にそれがすべてのjavascriptを取得するまで待つと想像します。特定のブロックの動作を切り替えることができる、あまり知られていないIEのscript-tag属性があるのではないかと思います。狩りに行くので、何か見つけたらお知らせします。

編集2

IE9がjavascriptで動作する方法についての私の仮定については完全に正しいわけではないようです。これは、科学界が「間違ってさえいない」と表現する不幸な状況の1つです。このように、私が尋ねた方法での質問は、いくつかの誤った仮定に依存しているため、もはや役に立ちません。ただし、テストに使用した変更済みコードを以下に投稿します。

test.php

<?php
file_put_contents("log.txt", "\r\n\r\nTestResStart\r\n", FILE_APPEND);
?>
<!DOCTYPE HTML>
<html lang="en-US">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <img src="image.php?q=1" />
    <script type="text/javascript">
        document.write('<img src="image.php?q=4-js" />');
        alert("HALT!");
        document.write('<img src="image.php?q=5-js" />');
    </script>
    <img src="image.php?q=2" />
    <img src="image.php?q=3" />
</body>
</html>

image.php

<?php
session_start();
file_put_contents("log.txt", "image".$_GET['q']."\r\n", FILE_APPEND);
$rImg = ImageCreate(300,50);
$cor = imagecolorallocate($rImg, 225, 225, 225);
$cor = imagecolorallocate($rImg, 0, 0, 0);
imagestring($rImg,2,0,0,$_GET['q'],$cor);
header('Content-type: image/jpeg');
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
imagejpeg($rImg,NULL,100);

test.phpを実行すると、htmlおよびdocument.writeを介して画像が読み込まれます。image.phpは、これらのリクエストを受信した順序でログに記録します。アラートが表示されている場合でも、リクエストは引き続き処理されることに気付くでしょう。そのため、アラートは実行を停止しません(ただし、他のほとんどのブラウザーは同様の動作を示します)。スクエア1に戻る!

4

3 に答える 3

1

を使用してスクリプト タグをドキュメントに書き込むとdocument.write()、問題が解決する場合があります。

奇妙に思えるかもしれませんが、そうすると各スクリプトの後に DOM が実際に画面にレンダリングされることに気付きました (そうでない場合はそうではなく、ロード中に進行状況バーをアニメーション化しようとすると非常に面倒です)

同じ原因があれば、Cookie の問題も解決する可能性があります。

于 2012-11-16T03:09:36.793 に答える
0

DOMの構築を遅らせることができます。'テンプレートの方法'に移動します。

1)htmlコードを。内に配置し<script type="text/template" id="someID"></script>ます。これにより、ブラウザにjavascriptではないタイプのスクリプトノードが含まれるようになります。これにより、ブラウザはその内容を単に無視しますが、スクリプトノードのinnerHTMLを取得することで、ブラウザにアクセスできるようになります。

2)ページがロードされ、クックが設定されたら、document.readyイベントハンドルを添付して、DOMの実際の構築を実行できます。この時点で、解析と初期レンダリングは終了しているので、IEはこれまでにCookieを設定していると思います。そうでない場合は、setTimout(fn、1);内でDOMの構築をトリガーします。

3)次のようなことをします:

var content = document.getElementById('someID');
var container = document.getElementById('containerID'); // This could be an empty DIV right next to the <script> tag. 
container.innerHTML = content.innerHTML;
于 2012-11-16T03:25:59.393 に答える
0

それで、この質問がなった質問に答えるために;

Cookie を設定したときに、設定した Cookie を IE9 が尊重するようにするにはどうすればよいですか?

その答えは特徴検出です。ブラウザーが Cookie の即時設定をサポートしているかどうかを (昔ながらのメタ タグを使用して) 検出できます。サポートしていない場合は、できるだけ早く (時間を浪費する前に) ページをリロードします。

コード

<script type="text/javascript">
    var c ='resolution='+Math.max(screen.width,screen.height)+("devicePixelRatio" in window ? ","+devicePixelRatio : ",1");
    var cSet = new RegExp(c);

    //If cookies are enabled and our cookie isn't set
    if(navigator.cookieEnabled && !cSet.test(document.cookie))
    {
        //Set the cookie via a meta tag
        document.write('<me'+'ta http-equiv="Set-Cookie" content="'+c+'; path=/" />');

        //If it hasn't been parsed yet
        if(!cSet.test(document.cookie))
        {
            //Reload the page
            document.location.reload();
        }
    }
</script>

そして、ここの私のブログのより完全でとりとめのない解決策:

http://iain-fraser.com/2012/11/cookie-based-responsive-images-that-work-in-ie9/

週末の後に投稿を更新する予定です。まだ新鮮なうちにすべてをダウンロードする必要がありました。もちろん、さらに開発する場合は、それに応じて SO を更新します。

于 2012-11-16T09:24:26.167 に答える