禁用JS时的不同页面内容

时间:2012-06-12 14:50:58

标签: php javascript jquery cookies

我的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?

5 个答案:

答案 0 :(得分:6)

PHP在JavaScript之前始终“触发”,因为PHP在服务器上处理,然后发送HTML和JavaScript以供浏览器处理和呈现。因此,你永远不会期望JavaScript在PHP之前执行。

在您的情况下,使用JavaScript设置cookie,然后执行重定向以刷新页面,以便PHP可以获取cookie值并采取相应的行动。

答案 1 :(得分:2)

您应该直接从PHP文件设置cookie。这样,您就知道它存在,更重要的是,您可以控制cookie。您可以从客户端设置它,但是在将HTML发送到浏览器之后总是会执行它,因此PHP文件在下一个请求之前不会获取它。

答案 2 :(得分: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的用户。

答案 3 :(得分:0)

Nope - PHP将始终在客户端JavaScript之前调用,因此使用此方法您将始终必须刷新页面至少一次。您最好开发自己的网站,以便非JS用户的体验更差但仍然可以接受,或者最糟糕的情况是使用&lt; noscript&gt; HTML标记,为这些用户提供替代内容。

答案 4 :(得分:0)

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

然而,你可以set the cookie using PHP。无论JavaScript还是多页刷新,这都将确保其设置和可用。