Проверка вхождения подстроки в строку
На странице имеется список названий и поле ввода:
<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, время: 06:07. |