【问题标题】:remember radio button selections记住单选按钮选择
【发布时间】:2011-11-04 03:11:29
【问题描述】:

我有以下完美运行的代码。它允许用户使用单选按钮“喜欢”或“不喜欢”每个帖子。复选框是允许用户显示/隐藏所有喜欢或不喜欢的帖子的开关。

问题是,当用户离开和返回时,我需要页面记住单选按钮的选择。这需要cookie吗?如果是这样,我该如何实现它?

    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Unhide on checkboxes/radio buttons</title>
    <link rel="stylesheet" type="text/css" href="_styles.css" media="screen" />
    <script type="text/javascript">

function radioGroupValue(groupObj)
{
    //Check if there is only one option (i.e. not an array)
    if (!groupObj.length)
    {
        return (groupObj.checked) ? groupObj.value : false;
    }

    //Multiple options, iterate through each option
    for (var i=0; i<groupObj.length; i++)
    {
        if (groupObj[i].checked)
        {
            return groupObj[i].value;
        }
    }

    //No option was selected
    return false;
}


function toggleLayer(formObj)
{
    var showLikes = document.getElementById('show_likes').checked;
    var showDislikes = document.getElementById('show_dislikes').checked;

    var postIndex = 1;
    while(document.getElementById('post_'+postIndex))
    {
        var liked = radioGroupValue(formObj.elements['like_'+postIndex])
        var display = ((!showLikes && liked==='1') || (!showDislikes && liked==='0')) ? 'none' : '';
        document.getElementById('post_'+postIndex).style.display = display;
        postIndex++;
    }
}
</script>
</head>
<body>

<form action="" method="post">
    <fieldset>
        <legend>Unhide Layer Form</legend>
        <ul>
            <p><input id="show_likes" name="show_likes" type="checkbox" value="1" checked="checked" onclick="toggleLayer(this.form);" /><label for="b1">Show Likes:</label> </p>
            <p><input id="show_dislikes" name="show_dislikes" type="checkbox" value="1" checked="checked" onclick="toggleLayer(this.form);" /><label for="b1">Show Disikes:</label> </p>
        </ul>

    <label>Email:</label>

        <input type="email" />  
    </fieldset>
<br><br>

    <fieldset>
        <legend>Posts</legend>

<div id="post_1" class="post">
    <b>Post #1</b><br>
    Content of post #1<br>
    <p><input type="radio" name="like_1" value="1"><label for="like1a">Like</label></p> <p><input type="radio" name="like_1" value="0" onclick="toggleLayer(this.form);"><label for="like1b"> Dislike</label></p>
</div>
<div id="post_2" class="post">
    <b>Post #2</b><br>
    Content of post #2<br>
    <p><input type="radio" name="like_2" value="1"><label for="like2a">Like</label></p> <p><input type="radio" name="like_2" value="0" onclick="toggleLayer(this.form);"><label for="like2b"> Dislike</label></p>
</div>
<div id="post_3" class="post">
    <b>Post #3</b><br>
    Content of post #3<br>
    <p><input type="radio" name="like_3" value="1"><label for="like3a">Like</label></p> <p><input type="radio" name="like_3" value="0" onclick="toggleLayer(this.form);"><label for="like3b"> Dislike</label></p>
</div>
<div id="post_4" class="post">
    <b>Post #4</b><br>
    Content of post #4<br>
    <p><input type="radio" name="like_4" value="1"><label for="like4a">Like</label></p> <p><input type="radio" name="like_4" value="0" onclick="toggleLayer(this.form);"><label for="like4b"> Dislike</label></p>
</div>
<div id="post_5" class="post">
    <b>Post #5</b><br>
    Content of post #5<br>
    <p><input type="radio" name="like_5" value="1"><label for="like5a">Like</label></p> <p><input type="radio" name="like_5" value="0" onclick="toggleLayer(this.form);"><label for="like5b"> Dislike</label></p>
</div>
<div id="post_6" class="post">
    <b>Post #6</b><br>
    Content of post #6<br>
    <p><input type="radio" name="like_6" value="1"><label for="like6a">Like</label></p> <p><input type="radio" name="like_6" value="0" onclick="toggleLayer(this.form);"><label for="like6b"> Dislike</label></p>
</div>
<div id="post_7" class="post">
    <b>Post #7</b><br>
    Content of post #7<br>
    <p><input type="radio" name="like_7" value="1"><label for="like7a">Like</label></p> <p><input type="radio" name="like_7" value="0" onclick="toggleLayer(this.form);"><label for="like7b"> Dislike</label></p>
</div>
</form>

任何指针?

【问题讨论】:

  • 您的数据有多重要?需要坚持多久?如果您的应用程序出错并丢失数据,那会是个问题吗?您的应用程序是否为用户提供便利而不是真正重要的东西?
  • 这对用户来说相当重要。信息在任何情况下都不应丢失。
  • 在这种情况下不要使用cookies;用户清除他们的历史记录,转移到不同的浏览器和其他东西,仅举几个 cookie 不适合存储重要数据的原因。

标签: jquery cookies radio-button checkbox


【解决方案1】:

你可以使用localstorage:

$(function()
{
    $('input[type=radio]').each(function()
    {
        var state = JSON.parse( localStorage.getItem('radio_'  + this.id) );

        if (state) this.checked = state.checked;
    });
});

$(window).bind('unload', function()
{
    $('input[type=radio]').each(function()
    {
        localStorage.setItem(
            'radio_' + this.id, JSON.stringify({checked: this.checked})
        );
    });
});​

所有现代浏览器都支持localstorage,包括IE8。

对于旧版本的IE,可以add support easily(在上述脚本之前)。

这里是the fiddle。使用单选按钮,关闭窗口,然后重新打开它(或只是刷新)。您会看到它们保留了它们的状态。

【讨论】:

  • 我尝试使用此代码,但它不起作用...刷新页面时,所有按钮都会重置。
  • @Jonathan:您在哪个浏览器(以及哪个版本)中测试过它?
  • @Jonathan:你是对的。我的错。我在该代码中有一些错误。我已经更新了我的答案,并包含了一个小提琴。
  • @Joseph 我完全不知道 IE8 支持本地存储。另外,非常感谢
  • @JamWaffles:我的错。我忘了检查localStorage 是否确实返回了一个对象。我更新了上面的代码以及小提琴。让我知道它现在是否适合您。
【解决方案2】:

如果您希望其他人看到喜欢(如计数),请考虑使用AJAX 将数据发送到某处的存储数据库。这是它可以与页面一起加载。如果您只对存储单个用户的选择感兴趣,我仍然会推荐 AJAX,但不要保存计数器,而是保存每个用户的是/否答案并发布到数据库中的表中。为了节省空间,最好只存储是的答案并假设其他答案为否。

【讨论】:

    【解决方案3】:

    除了 cookie,更好的方法是将其作为数据库解决方案来实现。 Cookie 可以被删除,因此这将成为一个不一致的解决方案。如果您希望只要用户在您的系统中处于活动状态,它就一直保留此选择,则将您的用户选择保存在数据库中,并围绕他们保存的喜欢和不喜欢实现您的呈现逻辑。

    【讨论】:

    • 数据库是更好的方法?这就像说航天飞机比乘坐城市公共汽车要好。对于这个简单的问题,数据库完全是多余的。饼干会很好。本地存储会更好。
    • @Evik - 所以你说我在办公室做了 100 次不喜欢,然后从家里登录,我会看到我所有的不喜欢 - 即使我说我不喜欢它们。类似地,我对大约 100 个东西进行了磁盘操作,然后我清除了我的浏览器缓存(不确定 localstorage 会发生什么,但 cookie 肯定会消失),瞧……我的不喜欢又回来了……这是一个非常棒的用户体验!不是吗?试试看。 :)
    • 这取决于应用程序。如果它是从一个位置或不规则地使用或具有不重要数据的应用程序类型,那么 cookie 更合适。我不认为这个问题清楚地概述了需要数据库的任何内容。当然,我可能是错的。很明显,提出这个问题的人正在寻找短期的、低级别的数据持久性,而不是长期的数据存储。而且,大多数人无权访问数据库。
    • 确实,我更喜欢不使用数据库的解决方案,因为考虑到这只是一个开/关开关,需要实施的工作量是惊人的。
    • 提供的解决方案但不起作用。将其添加到我的代码中会杀死复选框功能,并且不再隐藏任何内容。刷新时选择也不会被存储,只有在向后和向前按下时才会存储......任何解决方案?
    猜你喜欢
    • 1970-01-01
    • 2020-12-24
    • 2023-04-02
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    相关资源
    最近更新 更多