2

PHPスクリプトがブラウザウィンドウの幅にアクセスできるようにしたいと思います。私はこれを読んでいますが、PHPはこの情報自体にアクセスできませんが、Javascript / jQueryはアクセスでき、AJAXを使用してサーバーに渡すことができるため、PHPはこの情報にアクセスできます。

オンラインでいくつかの解決策に従って、次のテストファイルを作成し、「test.php」と呼びました。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>  
</head>

<?php
if (!isset($_POST["window_width"])) {
?>

<script type="text/javascript">
    var window_width = $(window).width();
    $.ajax({
        type: "POST",
        data: "window_width="+window_width,
    });
</script>   

<?php
}

if(!isset($_POST["window_width"])) {
    echo "not set";
}

?>
</html>

test.phpをロードすると、「未設定」と表示されます。これは、window_width変数がPHPによって取得されていないことを示しています。Firebugは変数がそこにあることを示しているので、これは私には奇妙に思えます(これは私のブラウザーの幅であるため、私のコンピューターでは1366に設定されています)。

PHPを使用してアクセスできるように$_POST["window_width"]が設定されていることを確認するにはどうすればよいですか?

4

4 に答える 4

3

説明

何を目標にしているのかわかりませんが、DOMの準備ができるまで待つのを忘れたようです。

サンプル

$(function() {
   var window_width = $(window).width();
   $.ajax({
       type: "POST",
       data: "window_width="+window_width,
   });
});
于 2012-04-18T15:34:07.457 に答える
3

サーバー側のコードは、JavaScriptが実行されるのを待つために処理を一時停止しません。ここでは、2つの別々のHTTPリクエストを処理しています。

  1. ブラウザがHTMLドキュメントを要求します
  2. $_POST['window_width']そのリクエストには設定されていないので。PHPは、スクリプトを含むHTMLドキュメントを返します。その要求に$_POST['window_width']まだが設定されていないため、設定されていないこともエコーします。
  3. ブラウザはHTTP応答を受信し、それを解析します。このプロセスの一部として、JavaScriptを実行します。
  4. JavaScriptは、URIを含めなかったためにjQueryがデフォルトでリクエストを送信する場所にPOSTリクエストを送信します(これは非常に簡単なテストで現在のURIであることが示唆されています)。
  5. このリクエスト$_POST["window_width"]は設定され、JavaScriptに返されるドキュメントに含まれます。
  6. JavaScriptにはsuccessハンドラー(またはHTTPリクエストが戻ってきたときに実行される他のコード)がないため、ブラウザーはそのドキュメントに対して何もしません。

Ajaxは、「JavaScriptを使用してWebサーバーと通信する」という簡単な言い方です。HTTPがステートレスな要求/応答プロトコルであることを止めません。

ウィンドウ幅(ページの読み込み後に変更される可能性があります)を取得するためのユースケースを述べていないため、問題が発生した場合の適切な解決策を提案することは困難です。(あなたはXY問題を尋ねたようです)。

ウィンドウ幅を知りたい2つの一般的な理由は次のとおりです。

  • 統計—この場合、PHPでデータを処理するだけで、クライアントへのレンダリングについて心配する必要はありません。
  • レイアウトの変更—これは通常CSSメディアクエリでよりよく達成されます
于 2012-04-18T15:36:07.830 に答える
2

この場合、ajaxを使用する必要はないと思います。「外側」(?)ページは、「内側」のajaxリクエストではなく、データを受信する必要があります。

<?php session_start(); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>  
</head>

<?php
if (!isset($_POST["window_width"]) && !isset($_SESSION['window_width'])) {
?>
<body>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" id="window_width_form" style="display:none;">
<input name="window_width" id="window_width" value="" />
</form>
<script type="text/javascript">
    $(function(){
        $('#window_width').val($(window).width());
        $('#window_width_form').submit();
    });
</script>   
</body>
<?php
}
elseif (isset($_POST['window_width']) && !isset($_SESSION['window_width']))
{
    $_SESSION['window_width'] = $_POST['window_width'];
    exit(header("Location: {$_SERVER['PHP_SELF']}\r\n"));
}

if(!isset($_POST["window_width"]) && !isset($_SESSION['window_width'])) {
    echo "not set";
}

?>
</html>
于 2012-04-18T15:38:47.160 に答える
1

試す

$.ajax({
        url : "your url goes here"
        type: "POST",
        data: {"window_width":window_width}
    });
于 2012-04-18T15:34:35.960 に答える