0

JS 対応の検出に少し問題があります。私は正しい軌道に乗っていることを知っているので、大きすぎません。しかし、ここに私の取引があります:

このコードを使用してJS(jQuery)でCookieを設定しようとすると

$(window).load(function(){
    $.cookies.set('c_jsEnabled', 'true');
});

または、このコードを使用して単純なJSで

function setCookie()
{
    document.cookie='c_jsEnabled=true';
}
<body onload="setCookie();">

次に、このコードを使用してPHPで検出してみてください

if($_COOKIE['c_jsEnabled'] == 'true')
{
    if(file_exists('./main.php'))
    {
        require_once ('./main.php');
    }
    echo getIndex();
}
else 
{
    if(file_exists('./noJS.php'))
    {
        require_once ('./noJS.php');
    }
    echo getIndex();
}
setcookie('c_jsEnabled', '');

PHP に適切な値を実際に取得するには、ページを 2 回更新する必要があります。私の推測では、これは基本的に、JS 関数が起動される前に PHP スクリプトが実行されることを意味します。これは、上記のすべてのコードが同じスクリプト (index.php) 内にあるためでしょうか?

JS が無効になっているときに人々が私の Web サイトを使用できないようにしたいので、これは私にとって一種の問題です。

PHPがCookie変数を取得しようとする前にCookieを設定する方法はありますか?

4

5 に答える 5

6

PHP は常にJavaScript の前に「起動」されます。これは、PHP がサーバー上で処理されてから、ブラウザが処理およびレンダリングするために HTML と JavaScript を送信するためです。このため、JavaScript が PHP の前に実行されることは期待できません。

あなたの場合、JavaScript を使用して Cookie を設定し、リダイレクトを実行してページを更新して、PHP が Cookie の値を取得し、それに応じて動作できるようにします。

于 2012-06-12T14:52:47.353 に答える
2

PHP ファイルから直接 Cookie を設定する必要があります。そうすれば、それが存在することがわかり、さらに重要なことに、Cookie を制御できます。クライアントから設定できますが、HTML がブラウザに送信された後に常に実行されるため、PHP ファイルは次のリクエストまでそれを取得しません。

于 2012-06-12T14:53:32.360 に答える
1

PHP は、コンテンツがブラウザーに送信されるときにのみ Cookie ヘッダーを送信します。その後、Javascript が実行されるため、Cookie を検出するにはページの 2 回目の読み込みが必要になります。

これにより、無限のリダイレクト ループが発生する可能性があるため (特にユーザーが Cookie を無効にしている場合)、注意が必要です。

Javascript を使用しないユーザーに対してサイトを無効にするには、次の点を考慮してください。

<div id="noscript" style="width:100%; height:100%; z-index:999; position:absoloute; top:0px; left:0px; background-color:#CC9900; display:block">
Please Enable Javascript!</div>
<script type="text/javascript">
document.getElementById('noscript').style.display = 'none';
</script>

タグが信頼できないことがわかりました<noscript>(私の記憶が正しければ、iOS にバグがあり、Javascript がある場合にのみタグが表示されるようになりました)。

2 番目のオプション: PHP で Cookie をチェックすることができます。設定されていない場合はheader("Location: aaa.html");、Javascript を含むページにリダイレクト ( ) して、Cookie を設定し、リダイレクトして戻します。(または、PHP 出力 Javascript を使用して Cookie を設定し、ページをリロードします。) そうすれば、Cookie を「スプーフィング」するユーザーについてのみ心配する必要がありますが、Cookie を無効にしているユーザーもロックアウトされます。

于 2012-06-12T14:58:12.157 に答える
0

ページがレンダリング/実行される前に、JavaScript によって設定されている Cookie を PHP で取得することはできません。

ただし、PHP を使用して Cookie を設定することはできます。これにより、JavaScript や複数のページの更新に関係なく、設定されて利用可能になります。

于 2012-06-12T14:55:46.913 に答える
0

いいえ - PHP は常にクライアント側の JavaScript の前に呼び出されるため、このメソッドを使用すると、常にページを少なくとも 1 回更新する必要があります。非 JS ユーザーのエクスペリエンスが悪くても許容できるようにサイトを開発するか、最悪の場合 <noscript> HTML タグを使用してそれらのユーザーに代替コンテンツを提供することをお勧めします。

于 2012-06-12T14:54:39.283 に答える