2011-05-29 54 views
4

雖然我確定這是一件顯而易見的事情,但我仍在用這個bug拉我的頭髮。道歉,如果是的話。瀏覽器不會從onclick事件中設置cookie

下面的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> 
+0

任何你使用ajax調用這個cookie的原因,而不是隻做'document.cookie = ...'? JS完全有能力自己設置Cookie,而不需要通過AJAX使用PHP。 – 2011-05-29 00:55:34

+0

@Marc,我把它和我在項目中其他地方使用的類綁定在一起。我認爲,把它們放在一起會更加整潔。但否則,不。 – 2011-05-29 01:04:34

+0

@Marc,$ _COOKIE []竟然有時間開火嗎? – 2011-05-29 01:11:02

回答

9

我沒有看到任何阻止正常的鏈接點擊經歷?如果您沒有任何功能阻止正常的a href通過,那麼在頁面已更改之前,將沒有時間執行$.post請求。

嘗試以下操作:

$(document).ready(function(){ 
    $('a').click(function(e){ 
     e.preventDefault(); 
     $.post('../setCookie.php',{'region':'test'}); 
    }); 
}); 

它將停止鏈接頁面的變化,但至少應通過cookie中。現在,如果您還希望頁面也被加載,請將onComplete方法添加到請求中,以便一旦cookie數據成功發送,您就可以繼續進行頁面更改。

+0

儘管setCookie.php被解僱了,但我完全一步步完成了,你是絕對正確的:只要我把「preventDefault」放在那裏,這個cookie就寫出來了!我認爲這應該是_asynchronous_?回到繪圖板。謝謝! – 2011-05-29 01:10:00

+0

我不認爲有什麼理由不能在'$ .post'之後放置'window.location ='http://www.newurl.com';'? – 2011-05-29 01:14:48

+0

您需要等待請求被髮送,否則它只會破壞e.preventDefault()的目的。 – Niklas 2011-05-29 01:16:16

-1

最有可能的,因爲它試圖訪問的jQuery($)創建真實之前。最好從你的第一個例子中使用document.ready

+0

正如我在我的問題中所述,所有事情都很好。我遍歷代碼(即「setCookie.php」)。重複:JavaScript正在解僱罰款。 – 2011-05-29 00:53:18

0

如果它是一個安全問題,你會看到你的控制檯(螢火蟲\ WebKit的\ IE開發工具)

上的錯誤,我想我會做什麼在這種情況正在發生變化click事件,並把它放在這裏:

<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> 

我建議不要使用JavaScript \ jQuery的HTML中,只是使用的document.ready()和綁定你的事件(如果你使用C的jQuery ourse)

1

將這段代碼的< script>標記是:(我假設<頭>)

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

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

這可能是一個更乾淨的方式,謝謝,但它仍然不起作用。 – 2011-05-29 00:58:23

+0

我建議越來越[Firebug](http://getfirebug.com/)(如果你還沒有它),看着ajax文章和它的迴應。它可能只是與你的setCookie.php源有關。如果您發現它,請隨時在此發佈,我會爲您提供幫助。 – 2011-05-29 01:01:18

相關問題