使用jQuery一键切换类并保存上一个状态

时间:2018-08-10 23:17:50

标签: javascript jquery bootstrap-4 local-storage session-storage

因此,我试图结合此处在stackoverflow上发布的三个问题的答案; Save current state after jquery click functionSave data to local storageHTML5 local storage save .toggleClass。我想做的是使用jQuery中的.one()在两个类onclick之间切换。然后在切换类别之后。

我想保存最后添加的课程。到目前为止,我的代码如下:

jQuery

$(".post-tag").one('click', function() {
  $(this).find('i').toggleClass('fa-meh fa-smile-beam text-warning text-success');

  var likeState = $(this).find('i').hasClass('fa-smile-beam');
  localStorage.setItem('liked', likeState);

  var likedStorage = localStorage.getItem('liked');

  if(likedStorage && $(this).find('i').hasClass('fa-smile-beam')) {
    $(this).find('i').removeClass('fa-meh')
  }
});

HTML

<div class="post-tag-wrapper">
    <div class="post-tag shadow">
        <i class="far fa-meh text-warning"></i>
    </div>
</div>

我该如何实现?

  

注意::如果将类添加到Field中,我知道这是可行的。   Object;例如使用MongoDB;默认为fa-meh,并且   onclick使用某些AJAX会将Field中的Object更新为   fa-smile-beam。但这是使用LocalStorage所必需的。

     

注意: :根据MDN,LocalStorage违反了政策决策,因此   这不是保存用户交互的做法。

1 个答案:

答案 0 :(得分:1)

好的,您可以执行以下操作。起点的主要问题是您不能在同一功能中进行操作。您将需要两个单独的功能。

  1. 来回切换状态。我建议使用.on bind方法而不是.one,除非您不希望用户能够撤消其操作。

  2. 在加载文档时,除非有其他设置按钮正确状态的方法,否则必须设置状态,该状态保存在按钮的本地存储中。

    < / li>

HTML

<button class="post-tag" id="some-unique-id">
  <i class="fa-meh"></i> Like
</button>

JavaScript

// This will make sure that the state is toggled on user click
// The user can click back and forth, and the state will be saved each time
$(".post-tag").on('click', e => {
  const $elm = $(e.currentTarget);
  // If you have more than one button you'll need unique IDs for them to make this work
  const uniqueId = $elm.attr('id');
  const $i = $elm.find('i');

  $i.toggleClass('fa-meh fa-smile-beam text-warning text-success');

  const likeState = $i.hasClass('fa-smile-beam');
  localStorage.setItem(`likeState-${id}`, likeState);
});

// To persist the change you'll have to run this on page load as well
$( document ).ready(function() {
  const $postTags = $('.post-tag');
  $postTags.each((elm) => {
    const $elm = $(elm);
    const uniqueId = $elm.attr('id');
    const $i = $elm.find('i');

    // Now you apply the state stored in local sotrage to your buttons.
    const likedStorage = localStorage.getItem(`likeState-${id}`);
    if(likedStorage && $i.hasClass('fa-smile-beam')) {
      $i.removeClass('fa-meh')
    }
  });
});