Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Проверка вхождения подстроки в строку (https://javascript.ru/forum/jquery/42261-proverka-vkhozhdeniya-podstroki-v-stroku.html)

spo 19.10.2013 14:07

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

Подскажите где ошибка?

spo 19.10.2013 14:21

Задача решена

$(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();
		}
	});

});

spo 20.10.2013 19:05

Продолжение темы:

Проверяю содержит ли каждый элемент массива определенное значение:

$(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);

});


Получаю неверный результат. Почему?

spo 20.10.2013 19:15

Работает верно если исправить:
if(!$arr[i].indexOf($value) + 1) {

на:
if(($arr[i].indexOf($value)+1) == 0) {

BETEPAH 20.10.2013 19:20

или на
if(!($arr[i].indexOf($value) + 1)) {

прошу прощения, что вмешиваюсь в эту беседу :)

spo 20.10.2013 19:27

Так как в цикле мы используем счетчик, а внутри цикла мы удаляем элементы, тем самым влияя на счетчик, то данный способ не верный.
Прошу подсказать верный способ, удаления элементов массива внутри цикла.

рони 20.10.2013 19:31

spo,
безболезненно удалять элементы массива можна начиная с конца массива

BETEPAH 20.10.2013 19:41

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.