Проверка вхождения подстроки в строку
На странице имеется список названий и поле ввода:
<form action=""> <input type="text" value="" /> </form> <p>name a</a> <p>name b</a> <p>name c</a> Задача сделать так чтобы при вводе отображались только те из списка внутри которых содержится текст из поля ввода. Написал скрипт: $("input:text").keyup(function(){ var $value = $(this).val().toLowerCase(); var $length = $(this).val().length; if($length > 0) { $("p").each(function() { var $text = $(this).text().toLowerCase(); if($text.indexOf($value) + 1) { $(this).addClass("ok"); } }); $("p:not(.ok)").hide(); $("p").removeClass("ok"); } else { $("p").removeClass("ok"); $("p").show(); } }); Он работает исправно при наборе символов, но при нажатии кнопки Backspace он перестает срабатывать. То есть работает только в одну сторону. Подскажите где ошибка? |
Задача решена
$(function() { $("input:text").keyup(function(){ var $value = $(this).val().toLowerCase(); var $length = $(this).val().length; if($length > 0) { $("p").each(function() { var $text = $(this).text().toLowerCase(); if($text.indexOf($value) + 1) { $(this).removeClass("no").show(); } else { $(this).addClass("no"); } }); $("p.no").hide(); } else { $("p").show(); } }); }); |
Продолжение темы:
Проверяю содержит ли каждый элемент массива определенное значение: $(function() { var $text = "a ab b bc c"; var $value = "a"; var $arr = $text.split(/[ ]/); console.log("Было: "+$arr); console.log("Удаляем все элементы которые содержат: "+$value); for(var i = 0; i < $arr.length; i++) { if(!$arr[i].indexOf($value) + 1) { $arr.splice($arr[i], 1); } } console.log("Стало: "+$arr); }); Получаю неверный результат. Почему? |
Работает верно если исправить:
if(!$arr[i].indexOf($value) + 1) { на: if(($arr[i].indexOf($value)+1) == 0) { |
или на
if(!($arr[i].indexOf($value) + 1)) { прошу прощения, что вмешиваюсь в эту беседу :) |
Так как в цикле мы используем счетчик, а внутри цикла мы удаляем элементы, тем самым влияя на счетчик, то данный способ не верный.
Прошу подсказать верный способ, удаления элементов массива внутри цикла. |
spo,
безболезненно удалять элементы массива можна начиная с конца массива |
var value = 'a'; var arr = 'a ab b bc c'.split(' '); console.log('Было: ' + arr); console.log('Удаляем все элементы которые содержат: ' + value); for(var i = 0; i < arr.length; i++) { console.log(arr[i] + ' - ' + !!(arr[i].indexOf(value) + 1)); if(arr[i].indexOf(value) + 1) { arr.splice(arr[i], 1); i--; } } console.log("Стало: " + arr); |
Часовой пояс GMT +3, время: 21:32. |