2015-11-18 2 views
0

ОК, это было сложно описать в названии. Что у меня есть поле ввода и три пункта [будет ссылаться на них как «Ps»]фильтровать элементы, не содержащие строку поиска [есть решение, ищет улучшения]

<p>ABCD</p> 
<p>CDEF</p> 
<p>XYZ</p> 

теперь, когда кнопка нажата в поле ввода абзацы, которые не содержат строку поиска отфильтрованы hide(). Совершено следующим:

$("input").keyup(function(){ 
    var x = $(this).val(); 
    $("p:not(:contains('" + x + "'))").hide(); 
}); 

когда забой или удалить нажимается Ps, которые не содержат строку поиска получить снова show() показано, как это:

$("input").keydown(function(){ 
     var x = $(this).val(); 
     var key = event.keyCode || event.charCode; 

     if(key == 8 || key == 46){ 
      $("p:not(:contains('" + x + "'))").show(); 
     } 
}); 

Теперь это вызывает странное поведение. Я очень плохо объясняя это .. Для того, чтобы получить то, что я говорю следующие шаги в этом fiddle result

  1. мыши в поле ввода

  2. типа «ABC» [сразу же после ввода ' а»последние два Ps скрыты]

  3. типа„х“[поэтому вход теперь„abcx“и первый P был скрыт]
  4. нажмите Backspace и уделять пристальное внимание [все Ps показаны для сплит-секунда, и после этого только первый остается в виде inte nded]

Вот full JSFiddle

Итак, что я хотел бы знать, если есть в любом случае, чтобы не было все Ps показано, что на долю секунды, и только что первый P отображается, когда забой нажата.

+0

Итак, когда вы удаляете 'x' из' abcx', что вы ожидаете от своего вывода? – void

+0

oh snap, не знал, что существует. Я подумал, что если вы можете ответить на свои вопросы, чтобы поделиться знаниями, это не будет проблемой здесь. Но я, вероятно, верну его завтра, если на это не назовут ответ. –

+0

@извините, что это такое. первые абзацы, но без двух других, показывающих как 500 мс. Я забыл сказать, что в вопросе я просто добавил его в полужирное. Сожалею. –

ответ

1

Вы просто можете сделать это, как этот

$("input").keyup(function(){ 
     var x = $(this).val(); 
     $("p:not(:contains('" + x + "'))").hide(); 
     $("p:contains('" + x + "')").show(); 
}); 

Fiddle

+0

wooow. Я не знаю, почему я сделал это так тяжело для себя. Я понимаю, что разделение секунд было причиной того, что две функции сортируют его между собой, но теперь я даже не знаю, почему я прошел через решение backspace. это просто так просто и логично .. спасибо. ответит через 5 минут –

+0

Да! Рад, что это помогло. – void

+0

Рассмотрите небольшое изменение, используя 'JSON.stringify()' для цитирования и удаления строки; в противном случае все пойдет не так, если 'input' содержит' ''. Цитата-принимающая версия: http://codepen.io/paulroub/pen/rORpwL –

1

Причиной такого поведения является потому, что на KeyDown у вас есть

$("p:not(:contains('" + x + "'))").show(); 

Который говорит для каждого р, который не содержащий мой текст, показать его.

А потом на KeyUp, за тот же ключ, у вас есть

$("p:not(:contains('" + x + "'))").hide(); 

Который говорит для каждого р, который не содержит мой текст, скрыть.

Я считаю

$("p:not(:contains('" + x + "'))").show(); 

Должен быть ответ

$("p:contains('" + x + "')").show(); 

Void является правильным для объединения вашего кода и делает также устранить проблему, однако это объясняет, где проблема была в коде, публикуемой.

+0

Истинная правда. это две функции, сортирующие ее между собой, вызывая отображение 500 всех Ps .., но когда я удаляю ': not', как вы предположили, что он вообще не работает. –

+0

@Cream [JSFiddle] (http://jsfiddle.net/xfmsvtvf/) это работает для меня. Запущенное событие всегда является одним из ключевых событий, потому что при keydown ключ фактически не был зарегистрирован до конца события, но он не работает _not_. – samuelmr

+0

oooh, мой плохой. Именно поэтому я пошел на решение backspace, я пытался бороться с ключом, который еще не зарегистрирован, полностью забыл об этом ... мой плохой. спасибо :) –

Смежные вопросы