jQuery .data方法 - 根据商店数据动态添加或删除元素

时间:2011-07-25 14:05:31

标签: javascript jquery jquery-selectors attributes jquery-data

我创建了一个搜索页面,使用参数化过滤来更改复选框值。

http://jsfiddle.net/s9FjY/4/

    $('#parameters input[type="checkbox"]:enabled').bind('change', function(e) {
      var $this = $(this),
        $checkedBoxes = $('#parameters').find('input:checkbox').filter(':checked').length,
        index = $('#parameters input:checkbox').index($this),
        txt = jQuery.trim($this.parent().text());
      if ($checkedBoxes === 0) {
        //remove all filters
        $('#filters > ul > li').remove();
      } else {
        if ($this.is(':checked')) {
          // add filter text
          var filterLink = $('<li>' + txt + '<span>Remove filter</span></li>');
          $.data(filterLink, 'myIndex', index);
          alert($.data(filterLink, 'myIndex'));
          $('#filters > ul').append(filterLink);
        } else {
          // remove filter text
          $('#filters > ul').find('li[class=' + index + ']').remove();
        }
      }
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<ul id="parameters">
  <li>
    <label for="premium">
      <input type="checkbox" id="premium" name="filters" value="true" />Premium
    </label>
  </li>
  <li>
    <label for="articles">
      <input type="checkbox" id="articles" name="articles" value="true" />Articles
    </label>
  </li>
  <li>
    <label for="news">
      <input type="checkbox" id="news" name="news" value="true" />News
    </label>
  </li>
  <li>
    <label for="other">
      <input type="checkbox" id="other" name="other" value="true" />Other
    </label>
  </li>
</ul>

<div id="filters">
  <p>Filters applied:</p>
  <ul>
    <!-- Filters applied insert here -->
  </ul>
</div>

我正在显示在动态列表中应用了哪个过滤器,并使用jQuery的 .data()方法将列表过滤器元素上的关联存储起来。

现在,当我取消选中相应的复选框时,我想根据存储在所述元素上的数据删除过滤器li元素。我之前在class属性上做过这个,但是想到使用 .data()是一个更简洁的解决方案。

无法弄清楚如何删除相应的列表元素?

2 个答案:

答案 0 :(得分:2)

在上一个选择器中,使用

li[data-myIndex=...]

而不是

li[class=...]

请参阅我的更新小提琴:http://jsfiddle.net/sgGY3/

答案 1 :(得分:1)

  1. 您为什么使用class?你从未定义过类名。

  2. $(this).data无缝地运作:http://jsfiddle.net/s9FjY/7/

  3. 0复选复选框不需要单独的代码。

  4. 代码:

    $('#parameters input[type="checkbox"]:enabled').bind('change', function(e){
        var $this = $(this),
            $checkedBoxes = $('#parameters').find('input:checkbox').filter(':checked').length,
            index = $('#parameters input:checkbox').index($this),
            txt = jQuery.trim($this.parent().text());
        if ($this.is(':checked')) {
            // add filter text
            var filterLink = $('<li>' + txt + '<span>Remove filter</span></li>');
            $(filterLink).data('myIndex', index);
            alert($(filterLink).data('myIndex'));                
            $('#filters > ul').append(filterLink);
        } else {
            // remove filter text
            $('#filters > ul').find('li').filter(function() {
                return $.data(this, 'myIndex') === index;
            }).remove();
        }  
    });