【问题标题】:Saving dropdown menu selection in a cookie?将下拉菜单选择保存在 cookie 中?
【发布时间】:2026-02-09 06:35:01
【问题描述】:

我已多次看到此帖子,但我根本无法让代码正常工作。 我需要帮助让这个下拉菜单将其设置保存到 cookie,因此当用户再次访问该站点时,他们之前的选择会被保留。

下拉菜单:

<select id="ThemeSelect">
    <option value="zelda">Zelda</option>
    <option value="smb2">SMB 2</option>
</select>

作为参考,此代码在 Wordpress 小部件中包含一些 Javascript,可更改 css 代码,例如主题选择器。

如何将其保存为 cookie?我觉得我什么都试过了!

编辑: 我应该说,但我使用这段代码来更改 CSS:

var saveclass = null;
var sel = document.getElementById('ThemeSelect');
sel.onchange = function(){
    saveclass = saveclass ? saveclass : document.body.className;
    document.body.className = saveclass + ' ' + sel.value;
};

【问题讨论】:

    标签: javascript css cookies menu


    【解决方案1】:

    这些方面的东西应该适合你。通过 javascript 创建 cookie 的函数位于 Setting a Cookie from JavaScript,javascripter.net 上的帖子。

    HTML

    <select id="ThemeSelect" onchange="setCookie('theme', this.value, 365);">
        <option value="zelda">Zelda</option>
        <option value="smb2">SMB 2</option>
    </select>
    

    Javascript

    function setCookie(cookieName, cookieValue, nDays) {
        var today = new Date();
        var expire = new Date();
    
        if (!nDays) 
            nDays=1;
    
        expire.setTime(today.getTime() + 3600000*24*nDays);
        document.cookie = cookieName+"="+escape(cookieValue) + ";expires="+expire.toGMTString();
    }
    

    编辑

    保存 cookie

    我已经为你把这两个功能合二为一了。

    HTML

    <select id="ThemeSelect" onchange="saveTheme(this.value);">
        <option value="zelda">Zelda</option>
        <option value="smb2">SMB 2</option>
    </select>
    

    Javascript

    var saveclass = null;
    
    function saveTheme(cookieValue)
    {
        var sel = document.getElementById('ThemeSelect');
    
        saveclass = saveclass ? saveclass : document.body.className;
        document.body.className = saveclass + ' ' + sel.value;
    
        setCookie('theme', cookieValue, 365);
    }
    
    function setCookie(cookieName, cookieValue, nDays) {
        var today = new Date();
        var expire = new Date();
    
        if (nDays==null || nDays==0)
            nDays=1;
    
        expire.setTime(today.getTime() + 3600000*24*nDays);
        document.cookie = cookieName+"="+escape(cookieValue) + ";expires="+expire.toGMTString();
    }
    

    Live DEMO

    返回页面时读取 cookie

    感谢 dunsmoreb

    我们可以使用shamelessly stolen from this question这个函数获取cookie。

    function readCookie(name) {
      var nameEQ = name + "=";
      var ca = document.cookie.split(';');
      for(var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') c = c.substring(1, c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
      }
      return null;
    }
    

    然后我们需要选择页面加载时的值。下面的代码将实现这一点:

    document.addEventListener('DOMContentLoaded', function() {
        var themeSelect = document.getElementById('ThemeSelect');
        var selectedTheme = readCookie('theme');
    
        themeSelect.value = selectedTheme;
        saveclass = saveclass ? saveclass : document.body.className;
        document.body.className = saveclass + ' ' + selectedTheme;
    });
    

    Live DEMO

    【讨论】:

    • 我可以建议将:if (nDays == null || nDays == 0) 更改为 if (!nDays) 吗?这样,它会检查 null、零和未定义。
    • 对我来说,这看起来非常完美,但是,当我将它放在测试页面上时,我不知道为什么它不起作用。顺便说一句,dcvidya.com/testing 是页面。我做错什么了吗?
    • @DANCUBE 函数的名称是SetCookie,你正在调用setCookie。案件很重要。
    • @JoshMein 我添加了另一个答案,扩展了您的答案。随意编辑它。
    • @DANCUBE 我已经更新了代码以使用 zelda 和 smb3
    【解决方案2】:

    注意:此答案添加到Josh Mein's answer。随意合并它。

    我们可以使用这个函数获取cookie,shamelessly stolen from this question.

    function readCookie(name) {
      var nameEQ = name + "=";
      var ca = document.cookie.split(';');
      for(var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') c = c.substring(1, c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
      }
      return null;
    }
    

    然后我们需要选择页面加载时的值。下面的代码将完成这一点。

    document.addEventListener('DOMContentLoaded', function() {
      var themeSelect = document.getElementById('ThemeSelect');
      var selectedTheme = readCookie('theme');
    
      if (selectedTheme) {
        themeSelect.value = selectedTheme;
      }
    });
    

    【讨论】:

    • 这对我来说很奇怪,即使这样也行不通。我已经在原始问题中添加了我需要的代码,但即使我从示例页面中删除了此代码,选择仍然没有保存。
    • 啊,我刚刚复制了您的源代码,现在可以使用了。但是,我如何整合我在问题中发布的其他脚本?我需要这样做,否则 css 无法正确显示。
    • 只需将代码附加到回调。所以基本上复制并粘贴代码之后:themeSelect.selectedIndex = selectedTheme;.
    • @DANCUBE 看看我更新的答案。我包含了您拥有的其他代码。
    【解决方案3】:

    您应该考虑在 PHP 中创建 Session 变量。

    http://www.w3schools.com/php/php_sessions.asp

    您可以将变量保存到会话中,并在加载页面时检查您设置的变量的值,根据它的值,下拉菜单可能会以某种方式运行。也许将下拉项的名称存储为会话变量?

    【讨论】:

    • 他想知道如何通过 Javascript 设置 cookie。
    • 如果他将它存储在会话中,如果他离开站点并稍后返回,它将不再可访问。
    • 啊,对了,对不起。虽然如果有人有兴趣在 PHP 中做这件事,使用 cookie 可能会更好......w3schools.com/php/php_cookies.asp
    • -1 -> 他的代码与PHP无关,所以这不是一个相关的答案。