Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Работа с data-атрибутами. (https://javascript.ru/forum/events/63628-rabota-s-data-atributami.html)

pechkin551 19.06.2016 12:50

Работа с data-атрибутами.
 
Здравствуйте все!

Подскажите как выбрать элементы, в моем случае div-ы, по значениям атрибутов data- ?

Например, есть у меня на странице 5 div-ов с разными data-атрибутами и два input-а для ввода желаемых значений:

<input oninput="filter()" onkeyup="filter()" type="text" id="filter-price">
<input oninput="filter()" onkeyup="filter()" type="text" id="filter-space">

<div data-price="1000" data-space="10">DIV 1</div>
<div data-price="1500" data-space="20">DIV 2</div>
<div data-price="2000" data-space="30">DIV 3</div>
<div data-price="3500" data-space="40">DIV 4</div>
<div data-price="5000" data-space="50">DIV 5</div>


Суть: Мне нужны «товары» со стоимостью (data-price) <= 3000 и размером (data-space) >= 20

То есть, при вводе в input-ы значений 3000 и 20, должны остаться DIV 2 и 3.

Вопрос: Как организовать сей процесс?

Пока получается только выводить div-ы «точным попаданием», т.е. ввожу 2000 и 30, получаю DIV 3.

P.S.: Убираю лишнее так:
$('div').css('display', 'none');


Буду признателен!

Rasy 19.06.2016 16:03

<body>

<style>

body {
  font-family: 'Roboto', sans-serif;
  font-size: 1rem;
}

input[type="text"] {
  font-size: 1rem;
  
  display: inline-block;
  
  width: 49.7%;
  height: 35px;
  
  text-indent: 10px;
  
  color: #393939;
  border: 1px solid #cccccc;
  background: aliceblue;
}

.selection {
  margin: 8px 0;
  
  padding: 10px;
  
  border: 1px solid #dadada;
  background-color: azure;
}
</style>

<input type="text" class="filter" id="filter-price" />
<input type="text" class="filter" id="filter-space" />
<div data-price="1000" data-space="10" class="selection">DIV 1</div>
<div data-price="1500" data-space="20" class="selection">DIV 2</div>
<div data-price="2000" data-space="30" class="selection">DIV 3</div>
<div data-price="3500" data-space="40" class="selection">DIV 4</div>
<div data-price="5000" data-space="50" class="selection">DIV 5</div>

<script data-require="jquery@3.0.0" data-semver="3.0.0" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.js"></script>
<script>
$(function () {
  
  $('.filter').on('input', function() {
    
    var filters = validate(this),
        selection = $('.selection');
    
    if (filters) {
      sort(filters, selection);
    }
    
  });
  
  function sort(filters, selection) {
  
    var filterPrice = Number(filters[0]),
        filterSpace = Number(filters[1]),
        sortPriceMax = 3000;
        sortSpaceMin = 20;

    $(selection).each(function(indx, elem) {
      var dataPrice = $(elem).data('price'),
          dataSpace = $(elem).data('space'),
          isPriceMore = isPrice(dataPrice),
          isSpaceLess = isSpace(dataSpace);


      if (isPriceMore === true && isSpaceLess === false) {
        $(elem).show().css('background', 'coral');
      } else {
        $(elem).hide();
      }

      function isPrice(price) {
        if (price < filterPrice && price < sortPriceMax) {
          return true;
        }
        return false;
      }
      
      function isSpace(space) {
        if (space <= filterSpace && space < sortSpaceMin) {
          return true;
        }
        return false;
      }
    });

  }
  
  function validate(elem) {
    var symbol = $(elem).val(),
        filters = [];

    $('.filter').each(function(indx, elem) {
      filters[indx] = isFinite($(elem).val()) ? $(elem).val() : '';
    });
  
    if (isNaN(symbol) || symbol.length < 2 || filters.indexOf('') >= 0) {
      return false;
    }
    
    return filters;
  }
});
</script>

рони 19.06.2016 17:38

Rasy,
меньше нуля price и больше 2000 space и есть результат , это как?

Rasy 19.06.2016 18:55

рони,
Вроде подправил, все-таки не правильную логику построил, по ходу дел.

рони 19.06.2016 19:27

Rasy,
алгоритм 'input' div.hude().filter().show() всё

Rasy 19.06.2016 19:40

рони,
где код маэстро?)

рони 19.06.2016 20:09

Rasy,
строка 71 лишняя, сделана только для вывода сообщения
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  </head>

<body>

<style>

body {
  font-family: 'Roboto', sans-serif;
  font-size: 1rem;
}

input[type="text"] {
  font-size: 1rem;

  float: left;

  width: 45%;
  height: 35px;

  text-indent: 10px;

  color: #393939;
  border: 1px solid #cccccc;
  background: aliceblue;
}

.selection {
  margin: 8px 0;

  padding: 10px;

  border: 1px solid #dadada;
  background-color: azure;
}
.mes.ok{
    color: rgb(0, 0, 205);
}
.mes{
  color: rgb(255, 0, 0);
}

</style>

<input type="text" class="filter" id="filter-price" />
<input type="text" class="filter" id="filter-space" /><br>
<p class="mes ok">All</p>
<div data-price="1000" data-space="10" class="selection">DIV 1</div>
<div data-price="1500" data-space="20" class="selection">DIV 2</div>
<div data-price="2000" data-space="30" class="selection">DIV 3</div>
<div data-price="3500" data-space="40" class="selection">DIV 4</div>
<div data-price="5000" data-space="50" class="selection">DIV 5</div>

<script data-require="jquery@3.0.0" data-semver="3.0.0" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.js"></script>
<script>
$(function() {
    var c = $(".filter"),
        a = $(".selection"),
        d = $(".mes");
    c.on("input", function() {
        var b = +c[0].value || 0,
            e = +c[1].value || 0,
            b = a.filter(function(c, a) {
                return +$(a).data("price") <= b && +$(a).data("space") >= e
            });
        b.length ? (a.hide(), b.show(), d.text(b.length + " kol"),d.addClass("ok")) : (a.show(), d.text("no"),d.removeClass("ok"));
        ;
    })
});
</script>



</body>
</html>

Rasy 19.06.2016 20:32

рони,
Вы так везде переменные именуете, или только на форуме?

рони 19.06.2016 20:55

Цитата:

Сообщение от Rasy
Вы так везде переменные именуете, или только на форуме?

у меня список для переменных очень короткий.

<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  </head>

<body>

<style>

body {
  font-family: 'Roboto', sans-serif;
  font-size: 1rem;
}

input[type="text"] {
  font-size: 1rem;

  width: 48%;
  height: 35px;

  text-indent: 10px;

  color: #393939;
  border: 1px solid #cccccc;
  background: aliceblue;
}

.selection {
  margin: 8px 0;

  padding: 10px;

  border: 1px solid #dadada;
  background-color: azure;
}
</style>

<input type="text" class="filter" id="filter-price" />
<input type="text" class="filter" id="filter-space" />

<div data-price="1000" data-space="10" class="selection">DIV 1</div>
<div data-price="1500" data-space="20" class="selection">DIV 2</div>
<div data-price="2000" data-space="30" class="selection">DIV 3</div>
<div data-price="3500" data-space="40" class="selection">DIV 4</div>
<div data-price="5000" data-space="50" class="selection">DIV 5</div>

<script data-require="jquery@3.0.0" data-semver="3.0.0" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.js"></script>
<script>
$(function() {
    var input = $(".filter"),
        div = $(".selection");
    input.on("input", function() {
        var price = +input[0].value || 0,
            space = +input[1].value || 0;
            div.hide().filter(function(c, elem) {
                return (!price||+$(elem).data("price") <= price) && (!space||+$(elem).data("space") >= space )
            }).show();
    })
});
</script>



</body>
</html>

Rasy 19.06.2016 21:04

Цитата:

Сообщение от рони
у меня список для переменных очень короткий.

Представляю код в таком стиле на нативном js, сплошной мозговой штурм


Часовой пояс GMT +3, время: 20:33.