如何修复 Google Chrome 中未定义的 cookie 值?

How to fix undefined cookie value in Google Chrome?

我正在使用 jQuery cookie plugin 来设置和存储模态 cookie,因此它只会在用户访问网站时显示一次。我测试了模态,它在最新版本的 Firefox、IE 和 Microsoft Edge 中也能正常工作,但是,Google Chrome 不起作用,并在每次刷新页面时重复显示模态。我创建了一个警报来读取上述 cookie 的值:

alert($.cookie("modal_shown")); // read available cookie

我在控制台调试了一下,注意到上面的代码returns如下:

火狐:1
Internet Explorer:yes
微软边缘:yes
Google Chrome: undefined
歌剧:undefined

话虽这么说,但使用浏览器控制台,我想弄清楚为什么最后两个浏览器给我的值是 undefined 而其他浏览器工作正常?有解决这个问题的方法吗?

这是我的代码:

HTML:

<a href="#openModal">Open Modal</a>
<div id="openModal" class="modalDialog">
    <div>   
        <h2>Notice!</h2>
        <div class="control_toggle_icon"></div>
        <p style="text-align:left; margin: 0 0 12px;">Toggle this menu icon to show/hide the menu bar and view the images in full screen.</p>
        <a href="#close" title="Close" class="modal_btn shortcode_button btn_small btn_type1">Okay, Got it!</a>
    </div>
</div>

模式与我在 jsfiddle 片段中使用的基本相同。

JS:

<script type="text/javascript" src="js/jquery.cookie.js"></script>
<script type="text/javascript">
jQuery(document).ready(function(){
    "use strict";
    // only show modal once and hide it until expired
    if ($.cookie('modal_shown') == null) 
    {
        $.cookie('modal_shown', 'yes', { expires: 365, path: '/' });
        // show modal
        $(".modalDialog").css({opacity : "1", pointerEvents : "auto"});
    }

    // destroy modal upon click
    $(".modal_btn").click(function(){
        $(".modalDialog").css({opacity : "0", pointerEvents : "none"});
    });
    alert($.cookie("modal_shown")); // read available cookie
});
</script>

更新的测试代码:

<script type="text/javascript">
jQuery(document).ready(function(){
    "use strict";
    console.log(cookieVal); // undefined
    var cookieVal = $.cookie("modal_shown") || "no";
    console.log(cookieVal); // "no", "1" for firefox, "yes" for ie, me

    // only show modal once and hide it until expired
    if (cookieVal !== "yes")
    {
        console.log(cookieVal); // "no", "1" for firefox, "yes" for ie, me
        $.cookie('modal_shown', 'yes', { expires: 365, path: '/' }); // here it doesn't change the value to yes until next line
        cookieVal= "yes"; // force value to become yes from no
        // show modal
        $(".modalDialog").css({opacity : "1", pointerEvents : "auto"});
        console.log(cookieVal); // "yes"
    }

    // destroy modal upon click
    $(".modal_btn").click(function(){
        $(".modalDialog").css({opacity : "0", pointerEvents : "none"});
        console.log(cookieVal); // "yes"
    });
});
</script>

解决方案:必须将代码上传到本地或在线服务器,jquery cookie 才能按预期完全工作。它现在适用于所有现代浏览器版本。模态将在页面刷新或 closing/reopening 浏览器上显示一次且永远不会再次出现(或直到设置的到期日期,在本例中为 365 天)。

如果 cookie 值不存在,则 $.cookie() 将 return undefined。因此,您可以测试该特定值,也可以指定默认值。

如果您想分配一个默认值,而您的期望值是 "no""yes"undefined,那么您可以这样做:

var cookieVal = $.cookie("modal_shown") || "no";

可以这样合并:

<script type="text/javascript" src="js/jquery.cookie.js"></script>
<script type="text/javascript">
jQuery(document).ready(function(){
    "use strict";
    // only show modal once and hide it until expired
    var cookieVal = $.cookie("modal_shown") || "no";
    console.log(cookieVal);      // log cookieVal
    if (cookieVal !== "yes") {
        $.cookie('modal_shown', 'yes', { expires: 365, path: '/' });
        // show modal
        $(".modalDialog").css({opacity : "1", pointerEvents : "auto"});
    }

    // destroy modal upon click
    $(".modal_btn").click(function() {
        $(".modalDialog").css({opacity : "0", pointerEvents : "none"});
    });
});
</script>