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', '');

需要 2 次页面刷新才能真正将正确的值放入 PHP。我的猜测是,这基本上意味着 PHP 脚本是在 JS 函数被触发之前执行的。这可能是因为上面显示的所有代码都在同一个脚本(index.php)中吗?

这对我来说是个问题,因为我想阻止人们在禁用 JS 时使用我的网站。

有没有办法在 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。

这可能会触发无限的重定向循环(特别是如果用户禁用了 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 时才显示)。

第二种选择: 您可以让 PHP 检查 cookie。如果没有设置,让它重定向 ( header("Location: aaa.html");) 到带有 Javascript 的页面以设置 cookie 并重定向回来。(或者,让 PHP 输出 Javascript 来设置 cookie 重新加载页面。)然后您只需要担心“欺骗”cookie 的用户,尽管您也会锁定禁用 cookie 的用户。

于 2012-06-12T14:58:12.157 回答
0

不 - PHP 总是在客户端 JavaScript 之前被调用,所以使用这种方法,您总是必须至少刷新一次页面。您最好开发您的网站,以便非 JS 用户有更差但仍然可以接受的体验,或者在最坏的情况下使用 <noscript> HTML 标记为这些用户提供替代内容。

于 2012-06-12T14:54:39.283 回答
0

在页面呈现/执行之前,您无法在 PHP 中获取由 JavaScript 设置的 cookie。

但是,您可以使用 PHP 设置 cookie。这将确保无论 JavaScript 或多个页面刷新如何,它都已设置并可用。

于 2012-06-12T14:55:46.913 回答