Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.10.2013, 14:07
Аватар для spo
spo spo вне форума
Профессор
Отправить личное сообщение для spo Посмотреть профиль Найти все сообщения от spo
 
Регистрация: 11.05.2011
Сообщений: 213

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

Подскажите где ошибка?
Ответить с цитированием
  #2 (permalink)  
Старый 19.10.2013, 14:21
Аватар для spo
spo spo вне форума
Профессор
Отправить личное сообщение для spo Посмотреть профиль Найти все сообщения от spo
 
Регистрация: 11.05.2011
Сообщений: 213

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

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

});
Ответить с цитированием
  #3 (permalink)  
Старый 20.10.2013, 19:05
Аватар для spo
spo spo вне форума
Профессор
Отправить личное сообщение для spo Посмотреть профиль Найти все сообщения от spo
 
Регистрация: 11.05.2011
Сообщений: 213

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

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

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

});


Получаю неверный результат. Почему?
Ответить с цитированием
  #4 (permalink)  
Старый 20.10.2013, 19:15
Аватар для spo
spo spo вне форума
Профессор
Отправить личное сообщение для spo Посмотреть профиль Найти все сообщения от spo
 
Регистрация: 11.05.2011
Сообщений: 213

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

на:
if(($arr[i].indexOf($value)+1) == 0) {
Ответить с цитированием
  #5 (permalink)  
Старый 20.10.2013, 19:20
Аватар для BETEPAH
Профессор
Отправить личное сообщение для BETEPAH Посмотреть профиль Найти все сообщения от BETEPAH
 
Регистрация: 23.06.2011
Сообщений: 1,165

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

прошу прощения, что вмешиваюсь в эту беседу
Ответить с цитированием
  #6 (permalink)  
Старый 20.10.2013, 19:27
Аватар для spo
spo spo вне форума
Профессор
Отправить личное сообщение для spo Посмотреть профиль Найти все сообщения от spo
 
Регистрация: 11.05.2011
Сообщений: 213

Так как в цикле мы используем счетчик, а внутри цикла мы удаляем элементы, тем самым влияя на счетчик, то данный способ не верный.
Прошу подсказать верный способ, удаления элементов массива внутри цикла.
Ответить с цитированием
  #7 (permalink)  
Старый 20.10.2013, 19:31
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

spo,
безболезненно удалять элементы массива можна начиная с конца массива
Ответить с цитированием
  #8 (permalink)  
Старый 20.10.2013, 19:41
Аватар для BETEPAH
Профессор
Отправить личное сообщение для BETEPAH Посмотреть профиль Найти все сообщения от BETEPAH
 
Регистрация: 23.06.2011
Сообщений: 1,165

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);
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проверка формы не работает в ie begelme Javascript под браузер 6 13.08.2013 01:00
Проверка строки на соответствие регулярному выражению Telnet Общие вопросы Javascript 9 17.07.2011 22:33
Поиск вхождения подстроки в массиве строк. FINoM Общие вопросы Javascript 8 27.02.2011 11:53
Проверка полей отправляемой формы. denisOgr jQuery 6 18.10.2010 19:40
Вставка подстроки в строку в текстовом поле на позицию курсора mastajedi Элементы интерфейса 3 10.11.2009 15:16