使用PHP显示浏览器窗口宽度

时间:2012-04-18 15:31:52

标签: php javascript jquery ajax

我希望我的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显示“未设置”,表明PHP没有获取window_width变量。这对我来说似乎很奇怪,因为Firebug显示变量在那里(在我的计算机上设置为1366,因为这是我的浏览器的宽度)。

如何确保设置$ _POST [“window_width”]以便我可以使用PHP访问它?

4 个答案:

答案 0 :(得分:3)

描述

我不明白你的目标是什么,但看起来你忘了等到DOM准备好了。

示例

$(function() {
   var window_width = $(window).width();
   $.ajax({
       type: "POST",
       data: "window_width="+window_width,
   });
});

答案 1 :(得分:3)

您的服务器端代码不会暂停处理以等待JavaScript运行。您在这里处理两个单独的HTTP请求。

  1. 浏览器请求HTML文档
  2. 由于未为该请求设置$_POST['window_width']。 PHP返回包含该脚本的HTML文档。由于$_POST['window_width'] 仍未为该请求设置,因此它还会回显未设置
  3. 浏览器接收HTTP响应并解析它。作为此过程的一部分,它运行JavaScript。
  4. JavaScript向...发出POST请求,默认情况下jQuery发送请求,因为您没有包含URI(非常快速的测试表明是当前的URI)。
  5. 对于此请求,$_POST["window_width"]已设置并包含在返回JavaScript的文档中。
  6. 由于JavaScript没有success处理程序(或HTTP请求返回时运行的任何其他代码),因此浏览器不会对该文档执行任何操作。
  7. Ajax是一种简单的说法“用JavaScript与网络服务器对话”。它不会阻止HTTP成为无状态请求 - 响应协议。

    您尚未说明获取窗口宽度的用例(在页面加载后可能会发生变化),因此很难为您遇到的任何问题提出一个好的解决方案。 (您似乎已经问过XY Problem)。

    想知道窗口宽度的两个常见原因是:

    • 统计 - 在这种情况下,您只需处理PHP中的数据,而不必担心将其呈现给客户端
    • 更改布局 - 通常使用CSS媒体查询可以更好地实现

答案 2 :(得分:2)

我认为在这种情况下你不需要使用ajax,'outer'(?)页面需要接收数据,而不是'内部'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>

答案 3 :(得分:1)

尝试

$.ajax({
        url : "your url goes here"
        type: "POST",
        data: {"window_width":window_width}
    });