Фильтр Jquery, показывающий ошибочные результаты

#javascript #filter

#javascript #Фильтр

Вопрос:

Я пытаюсь настроить фильтр с помощью jQuery. У меня будет определенное количество divs, каждое с числовым значением (скажем, цена).

Приведенный ниже код работает нормально, пока вы не введете значение меньше 10. Затем вы получаете результаты, которых там быть не должно. (введите 4, например)

Любая помощь по исправлению этого была бы отличной! Спасибо!

http://jsfiddle.net/SUWxn/

 <script>
function sortmebaby()
{
    var divList = $('#containerMonkey div[id^="monkey_"]');  

$.each(divList, function(index, value)
{
    console.log($(value).attr('xprice'));
    if ( $(value).attr('xprice') > $('#mankipower').val())
        $(value).hide();
    else
        $(value).show();
    //alert(index   ': '   value);
});

}
</script>

<div id="containerMonkey">
    <div id="monkey_1" xprice="10">10</div>
    <div id="monkey_2" xprice="20">20</div>
    <div id="monkey_3" xprice="30">30</div>
    <div id="monkey_4" xprice="40">40</div>
    <div id="monkey_5" xprice="50">50</div>
</div>
<input type="text" name="mankipower" id="mankipower">
<input type="button" value="PUSH" onclick="sortmebaby()">
  

Спасибо!

Ответ №1:

Условием в вашем if заявлении является сравнение строк, а не целых чисел, как вы ожидаете. Вы можете использовать parseInt для преобразования строк в числа:

 var val1 = parseInt($(value).attr('xprice'), 10),
    val2 = parseInt($('#mankipower').val(), 10);
if(val1 > val2)
    $(value).hide();
else
    $(value).show();
  

Вот обновленный пример.

Комментарии:

1. Кроме того, я бы кэшировал $ (значение) вместо того, чтобы повторно выбирать его снова и снова. И когда вы «скрываете» элемент, он все еще находится в DOM. Используйте .remove(), чтобы буквально удалить его.

2. Согласен, кэширование value было бы хорошей идеей. Что касается вашего другого предложения, элементы могут быть скрыты и показаны снова, так hide что в этом случае намного лучше, если вы не хотите каждый раз воссоздавать элементы и добавлять их обратно в DOM.