【问题标题】:jquery button with cookies to remember menu setting after refresh带有 cookie 的 jquery 按钮,用于在刷新后记住菜单设置
【发布时间】:2015-07-19 12:17:27
【问题描述】:

在我的网页上,访问者可以按“相关性”或“日期”对菜单进行排序。 但是当一个人选择“相关性”并加载一个新页面时,选择会回到“日期”。 据我所知,没有cookie就不可能解决这个问题!?所以我将“jquery-1.11.3.min.js”和“jquery.cookie.js”上传到我的页面。

我现在可以开始为按钮激活 cookie 吗? 如何保存 cookie 以使选项在刷新后保持不变? 由于“日期”是默认选项,我实际上只需要在人们选择“相关性”时保存 cookie。 实现我的目标的代码是什么?

这是我用于菜单的代码:

/** 
 * Hier beginnt im JSFiddle der JavaScript Bereich
 *
 * @param sortCriteria
 *   Name of the data-attribute for sorting.
 * @param itemsToSort
 *   A string selector for items for sorting.
 * @param container
 *   A container to put items.
 * @returns {Function}
 */
var sortByDataAttr = function (sortCriteria, itemsToSort, container) {
    return function () {

        // Grab all the items for sorting.
        var $collection = $(itemsToSort);

        // Sort them and append in to container.
        $collection.sort(function (a, b) {
            return $(b).data(sortCriteria) - $(a).data(sortCriteria)
        }).appendTo($(container));
    };
},


/**
 * Remove class from all elements and apply to current.
 *
 * @param current
 *   HTML node to apply class.
 * @param activeClass
 *   Active-state string class.
 */
highlightActive = function (current, activeClass) {
    $('.' + activeClass).removeClass(activeClass);
    $(current).addClass(activeClass);
};

// Sort by 'data-date' at the start.
highlightActive('.btn-sort-date', 'btn-sort--active');
sortByDataAttr('date', '.item', '.list');

$('.btn-sort-date').on('click', function () {
    highlightActive(this, 'btn-sort--active');
    sortByDataAttr('date', '.item', '.list')();
});

$('.btn-sort-relevance').on('click', function () {
    highlightActive(this, 'btn-sort--active');
    sortByDataAttr('relevance', '.item', '.list')();
});
// Hier endet im JSFiddle der JavaScript Bereich
<!-- Im JSFiddle startet der html Bereich hier -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<aside id="nav_menu-5" class="widget-1 widget-first widget-odd widget widget_nav_menu">
    <div class="menu-projects-container">
        <ul id="menu-projects" class="menu">

<div style="color:#A4A4A4" class="daterel"> 
<span class="btn btn-sort-date"><i>date</i></span>
<span>|</span>

                <span class="btn btn-sort-relevance"><i>relevance</i></span>
</div>

            <div class="projects">


<b>PROJECTS</b>

           
            </div>
            <div class="list">
                     <li id="menu-item-649" class="item" data-relevance="11" data-date="2015.6"><a href="http://thomasmedicus.at/brickstone-blues/">brickstone blues</a>
<span style="color:#A4A4A4">video</span>
                         
                <li id="menu-item-649" class="item" data-relevance="7" data-date="2015.5"><a href="http://thomasmedicus.at/copypaste/">copy&#038;paste</a>
<span style="color:#A4A4A4">installation</span>

                    <li id="menu-item-649" class="item" data-relevance="6" data-date="2015.4"><a href="http://thomasmedicus.at/zebral-fluids/">zebral fluids</a>
<span style="color:#A4A4A4">gif</span>

                        <li id="menu-item-649" class="item" data-relevance="8" data-date="2015.3"><a href="http://thomasmedicus.at/fried-egg-variation/">fried egg variation</a>
<span style="color:#A4A4A4">glass</span>

                        </li>
                        <li id="menu-item-649" class="item" data-relevance="8" data-date="2015.2"><a href="http://thomasmedicus.at/bearrr/">bearrr&#8230;</a>
<span style="color:#A4A4A4">illustration</span>

                        </li>
                        <li id="menu-item-649" class="item" data-relevance="7" data-date="2015.1"><a href="http://thomasmedicus.at/glass-ribbon/">glass ribbon</a>
<span style="color:#A4A4A4">glass</span>

                        </li>
                        <li id="menu-item-649" class="item" data-relevance="13" data-date="2014.5"><a href="http://thomasmedicus.at/emulsifier/">emulsifier</a>
<span style="color:#A4A4A4">sculpture</span>

                        </li>
                        <li id="menu-item-649" class="item" data-relevance="9" data-date="2014.4"><a href="http://thomasmedicus.at/black-holes/">black holes</a>
<span style="color:#A4A4A4">illustration</span>

                        </li>
                        <li id="menu-item-649" class="item" data-relevance="7" data-date="2014.3"><a href="http://thomasmedicus.at/this/">**** this!</a>
<span style="color:#A4A4A4">concept</span>

                        </li>
                        <li id="menu-item-649" class="item" data-relevance="10" data-date="2014.2"><a href="http://thomasmedicus.at/heads/">heads</a>
<span style="color:#A4A4A4">mask</span>

                        </li>
                        <li id="menu-item-649" class="item" data-relevance="5" data-date="2014.1"><a href="http://thomasmedicus.at/staining-glass/">staining glass</a>
<span style="color:#A4A4A4">glass</span>

                        </li>
                        <li id="menu-item-649" class="item" data-relevance="11" data-date="2013.2"><a href="http://thomasmedicus.at/fishbird/">fish&#038;bird</a>
<span style="color:#A4A4A4">flipbook</span>

                        </li>
                        <li id="menu-item-649" class="item" data-relevance="6" data-date="2013.1"><a href="http://thomasmedicus.at/faces/">faces</a>
<span style="color:#A4A4A4">sculpture</span>

                        </li>
            </div>
<!-- Im JSFiddle geht der html Bereich bis hier -->

感谢您的支持!

【问题讨论】:

  • 您确实需要清理您的htmlli 元素不允许作为div 的子元素,并且您有多个具有相同值的id 属性。 id 应该是唯一的。
  • 感谢您的提示。我为此调整了正常的 wordpress 菜单代码,它可以工作。如果 wordpress 做到了,如果它有效,那么对我来说没问题。我的代码有问题是否有任何原因,例如与某些浏览器不兼容等?

标签: javascript jquery html css cookies


【解决方案1】:

如果你想使用cookies,你应该在sortByDataAttr('relevance', '.item', '.list')();之后添加以下内容:

$.cookie('sortby', 'relevance', {expires:30});

这在你的 javascript 开头:

$(document).ready(function() {
    if ('relevance' == $.cookie('sortby')) {
        sortByDataAttr('relevance', '.item', '.list')();
    } else {
        sortByDataAttr('date', '.item', '.list')();
    }
});

它将查找名称为“sortby”的 cookie,如果值为“relevance”,它将相应地对列表进行排序。

【讨论】:

  • 谢谢,但它没有用。我将“jquery-1.11.3.min.js”和“jquery.cookie.js”上传到我的页面并添加 到头部?还是我必须做其他事情才能使用与 cookie 一起使用的代码?
  • 我假设你使用了this script。您应该将它下载到您的 wp-includes/js 目录中并像这样包含它:
【解决方案2】:

使用HTML5 localStorage 应该如下所示:

$(document).ready(function(){

    $('.btn-sort-date').on("click", function(){
        localStorage.setItem("selected_item", "date");
    });

    $('.btn-sort-relevance').on("click", function(){
        localStorage.setItem("selected_item", "relevance");
    });

    var selected_item = localStorage.getItem("selected_item");

    if (selected_item) {
         sortByDataAttr(selected_item, '.item', '.list');
    }

});

在页面末尾运行它..

希望对你有帮助。

【讨论】:

  • 谢谢。你能更精确一点,在哪里添加代码。 “标签”在哪里?如果你说“单独”,我必须把代码放在哪里?我没有受过很好的训练,谢谢
  • 嗯,这只是一个例子。我已经更新了你想要的,但没有测试
【解决方案3】:

你需要这样做:

添加 cookie

$('.btn-sort-date').on('click', function () {
    highlightActive(this, 'btn-sort--active');
    sortByDataAttr('date', '.item', '.list')();
    $.cookie('sort','date');
});

$('.btn-sort-relevance').on('click', function () {
    highlightActive(this, 'btn-sort--active');
    sortByDataAttr('relevance', '.item', '.list')();
    $.cookie('sort','relevance');
});

并在页面加载时检查 cookie

if (typeof $.cookie('sort') == 'undefined'){
    $.cookie('sort','date');
    highlightActive('.btn-sort-date', 'btn-sort--active');
    sortByDataAttr('date', '.item', '.list');
}
else{
    var sort=$.cookie('sort');
    highlightActive('.btn-sort-'+sort, 'btn-sort--active');
    sortByDataAttr(sort, '.item', '.list');
}

所以你的最终代码是

/** 
 * Hier beginnt im JSFiddle der JavaScript Bereich
 *
 * @param sortCriteria
 *   Name of the data-attribute for sorting.
 * @param itemsToSort
 *   A string selector for items for sorting.
 * @param container
 *   A container to put items.
 * @returns {Function}
 */
var sortByDataAttr = function (sortCriteria, itemsToSort, container) {
    return function () {

        // Grab all the items for sorting.
        var $collection = $(itemsToSort);

        // Sort them and append in to container.
        $collection.sort(function (a, b) {
            return $(b).data(sortCriteria) - $(a).data(sortCriteria)
        }).appendTo($(container));
    };
},


/**
 * Remove class from all elements and apply to current.
 *
 * @param current
 *   HTML node to apply class.
 * @param activeClass
 *   Active-state string class.
 */
highlightActive = function (current, activeClass) {
    $('.' + activeClass).removeClass(activeClass);
    $(current).addClass(activeClass);
};

if (typeof $.cookie('sort') === 'undefined'){
    $.cookie('sort','date');
    highlightActive('.btn-sort-date', 'btn-sort--active');
    sortByDataAttr('date', '.item', '.list');
}
else{
    var sort=$.cookie('sort');
    highlightActive('.btn-sort-'+sort, 'btn-sort--active');
    sortByDataAttr(sort, '.item', '.list');
}

$('.btn-sort-date').on('click', function () {
    highlightActive(this, 'btn-sort--active');
    sortByDataAttr('date', '.item', '.list')();
    $.cookie('sort','date');
});

$('.btn-sort-relevance').on('click', function () {
    highlightActive(this, 'btn-sort--active');
    sortByDataAttr('relevance', '.item', '.list')();
    $.cookie('sort','relevance');
});

// Hier endet im JSFiddle der JavaScript Bereich

更新:

更改了函数的定义方式并按预期工作:DEMO

/** 
 * Hier beginnt im JSFiddle der JavaScript Bereich
 *
 * @param sortCriteria
 *   Name of the data-attribute for sorting.
 * @param itemsToSort
 *   A string selector for items for sorting.
 * @param container
 *   A container to put items.
 * @returns {Function}
 */
function sortByDataAttr(sortCriteria, itemsToSort, container) {
        alert('inside');

        // Grab all the items for sorting.
        var $collection = $(itemsToSort);

        // Sort them and append in to container.
        $collection.sort(function (a, b) {
            return $(b).data(sortCriteria) - $(a).data(sortCriteria)
        }).appendTo($(container));
};


/**
 * Remove class from all elements and apply to current.
 *
 * @param current
 *   HTML node to apply class.
 * @param activeClass
 *   Active-state string class.
 */
function highlightActive(current, activeClass) {
    $('.' + activeClass).removeClass(activeClass);
    $(current).addClass(activeClass);
};

if (typeof $.cookie('sort') === 'undefined'){
    alert($.cookie('sort'));
    $.cookie('sort','date');
    highlightActive('.btn-sort-date', 'btn-sort--active');
    sortByDataAttr('date', '.item', '.list');
}
else{
    alert($.cookie('sort'));
    var sort=$.cookie('sort');
    highlightActive('.btn-sort-'+sort, 'btn-sort--active');
    sortByDataAttr(sort, '.item', '.list');
}

$('.btn-sort-date').on('click', function () {
    highlightActive(this, 'btn-sort--active');
    sortByDataAttr('date', '.item', '.list')();
    $.cookie('sort','date');
});

$('.btn-sort-relevance').on('click', function () {
    highlightActive(this, 'btn-sort--active');
    sortByDataAttr('relevance', '.item', '.list')();
    $.cookie('sort','relevance');
});

// Hier endet im JSFiddle der JavaScript Bereich

【讨论】:

  • 谢谢!添加 cookie 有效,但是当我添加“if,else”部分时,整个排序功能不再起作用。一定是某个地方出错了。
  • 哦,是的,cookie 写错了,已修复,现在应该可以正常工作了 ;)
  • 还是不行。我将您的代码放入小提琴中,排序不再起作用...jsfiddle.net/6g2oLtsz 又一个错误? :)
  • 它在小提琴中不起作用,因为没有加载 jquery cookie 插件 => jsfiddle.net/6g2oLtsz/1
  • 我不知道为什么,但似乎 fiddle 不会在 cookie 检查后应用更改,但如果您在页面加载时收到 cookie 警报,您会在点击后看到cookie 设置的排序按钮! =>jsfiddle.net/6g2oLtsz/2 如果你在一个项目上尝试这个,我相信它会起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 2012-06-24
  • 2014-02-12
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
相关资源
最近更新 更多