我的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?
答案 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还是多页刷新,这都将确保其设置和可用。