浏览器无法从onclick事件中设置cookie

4

我对这个错误感到非常头疼,尽管我确定它是显而易见的。如果是这样,请原谅。

以下JavaScript成功地设置了我的cookie:

<script type="text/javascript">
$(document).ready(function(){
    $.post('../setCookie.php',{'region':'test'});
});
</script>

但是,当我将同样的代码绑定到一个 onclick 事件时,就像这样...

<script type="text/javascript">
$(document).ready(function(){
    $("#us a").click(function(){
        $.post('../setCookie.php',{'region':'en-us'});
    });
    $("#uk a").click(function(){
        $.post('../setCookie.php',{'region':'en-gb'});
    });
});
</script>

<ul>
    <li id="uk"><a href="http://www.example.com/uk">
        <span>Enter UK site</span></a></li>
    <li id="us"><a href="http://www.example.com/us">
        <span>Enter US site</span></a></li>
</ul>

现在它不再设置cookie了!尽管以完全相同的方式调用和执行相同的代码(我可以顺利地进行步骤,并且看到所有应该有的东西)。

重申:JavaScript正常运行。我正在逐步执行setCookie.php,一切都是相同的……除了最后没有cookie。

发生了什么?我猜测这是浏览器安全或其他原因所致?


对于任何感兴趣的人,以下是我的解决方法:

<script type="text/javascript">
$(document).ready(function(){
$("#us a").click(function(e){
    e.preventDefault();
    $.post('../setCookie.php',{'region':'en-us'},
        function() {
            window.location = "http://www.example.com/us";
        }
    );
});

$("#uk a").click(function(e){
    e.preventDefault();
    $.post('../setCookie.php',{'region':'en-gb'},
        function() {
            window.location = "http://www.example.com/uk";
        }
    );
});
});
</script>

你为什么要使用ajax调用来设置cookie,而不是直接使用document.cookie = ...呢?JS完全可以自己设置cookie,而不需要通过AJAX与PHP交互。 - Marc B
@Marc,我已经将它绑定到了项目中其他地方正在使用的一个类上。我认为把它们放在一起更整洁。但除此之外,没有别的。 - Chuck Le Butt
@Marc,$_COOKIE[] 有时间触发吗? - Chuck Le Butt
$_COOKIE是由客户端在脚本启动时发送的cookie填充的。它不会更改以适应您从脚本内部进行的任何setcookie()调用。您在PHP中设置的任何cookie都只会在下一次调用脚本时显示在$_COOKIE中。 - Marc B
好的,我的意思是使用 JQuery 的 $.cookie,但现在已经没问题了,它运行得很好,谢谢。 - Chuck Le Butt
4个回答

9

尽管 setCookie.php 被触发了,而且我一直跟踪到它完成,但你是完全正确的:一旦我加入 "preventDefault",cookie 就被写入了!我以为这种情况应该是异步的?回到起点重新开始。谢谢! - Chuck Le Butt
жҲ‘жғіжІЎжңүд»»дҪ•зҗҶз”ұйҳ»жӯўжҲ‘еңЁ$.postд№ӢеҗҺзӣҙжҺҘж”ҫзҪ®window.location = 'http://www.newurl.com';пјҢеҜ№еҗ—пјҹ - Chuck Le Butt
你需要等待请求被发送,否则它将会使 e.preventDefault() 失去意义。 - Niklas
正因为它是异步的,所以你需要使用preventDefault()来防止默认行为。你需要在post请求成功处理程序中调用window.location = '<url>'。 - timdev

1

将此代码放置在 <script> 标签所在的位置:(我假设是 <head>)

$(document).ready(function(){
    $("#us a").click(function(){
        $.post('../setCookie.php',{'region':'en-us'});
    });

    $("#uk a").click(function(){
        $.post('../setCookie.php',{'region':'en-gb'});
    });
});

这可能是一种更干净的方法,谢谢,但它仍然不起作用。 - Chuck Le Butt
我建议你下载 Firebug(如果你还没有),查看 ajax post 和它的响应。这可能与你的 setCookie.php 源代码有关。如果你发现是这样的话,随时在这里发布,我会帮你解决的。 - Tyler Diaz

0
如果这是一个安全问题,您将在控制台上看到错误(firebug\webkit\IE dev tools)。
我想在这种情况下我会更改点击事件并将其放在这里:
<script type="text/javascript">
$(document).ready(function(){
$("#someid > li").click(function(){
    $.post('../setCookie.php',{'region':$(this).attr("id")});
}); 
});
</script>

然后..:

<ul id="someID">
    <li id="uk"><a href="http://www.example.com/uk">
            <span>Enter UK site</span></a></li>
    <li id="us"><a href="www.example.com/us">
                <span>Enter US site</span></a></li>
</ul>

我建议不要在HTML中使用JavaScript \ jQuery,只需使用document.ready()并绑定事件(如果您使用jQuery的话)。

-1
很可能是因为在创建jQuery($)之前尝试访问它。最好使用你第一个示例中的document.ready来解决这个问题。

正如我在问题中所述,一切都很好。我逐步执行代码(即“setCookie.php”)。重申:JavaScript 运行良好。 - Chuck Le Butt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接