Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.06.2014, 11:54
Интересующийся
Отправить личное сообщение для yura29 Посмотреть профиль Найти все сообщения от yura29
 
Регистрация: 17.08.2013
Сообщений: 17

Click не работает после выполнения скрипта
Привет форумчане

Снова к вам за помощью))
У меня есть страница со списком и инпут фильтра, который скрывает несовпадающие элементы списка
Трудно представить как я уже промучался с этим долбаным плагином фильтра, но менять его не хочется(слишком много времени потратил на него)
Проблема в том, что элементы списка должны быть кликабельны, и всё работает нормально, до того как начал вводить что-нибудь в фильтр
Видимо, этот говнюк что-то делает с кодом, что он уже не подходит под селектор клика
Вобщем, после ввода значения в фильтр элементы списка становятся некликабельными. В консоли хрома ошибок нет и я даже не могу понять что надо делать и куда идти
Заметил только, что если убрать из скрипта код подкрашивания совпадающей части(52, 54 строки), то все работает нормально, но подкрашиванием пожертвовать не могу или если селектор клика вести только до li, но мне нужен сделать кликабельными 1 див и 1 спан

Вот сам код
<!DOCTYPE HTML>

<html>

<head>
  <title>Title</title>
  <meta charset="utf-8">
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> 
<script>
/**
 * fastLiveFilter jQuery plugin 1.0.3
 * 
 * Copyright (c) 2011, Anthony Bush
 * License: <http://www.opensource.org/licenses/bsd-license.php>
 * Project Website: http://anthonybush.com/projects/jquery_fast_live_filter/
 **/

jQuery.fn.fastLiveFilter = function(list, options) {
	// Options: input, list, timeout, callback
	options = options || {};
	list = jQuery(list);
	var input = this;
	var lastFilter = '';
	var timeout = options.timeout || 0;
	var callback = options.callback || function() {};
	
	var keyTimeout;
	
	// NOTE: because we cache lis & len here, users would need to re-init the plugin
	// if they modify the list in the DOM later.  This doesn't give us that much speed
	// boost, so perhaps it's not worth putting it here.
	var lis = list.children();
	var len = lis.length;
	var oldDisplay = len > 0 ? lis[0].style.display : "block";
	callback(len); // do a one-time callback on initialization to make sure everything's in sync
	
	input.change(function() {
		// var startTime = new Date().getTime();
		var filter = input.val().toLowerCase();
		var li, innertext, old;
		var numShown = 0;
		var num = "\\s?\\)?\\-?\\(?"		
		for(i = 0; i<filter.length; i++){
			num += filter.substring(i,i+1) + "\\s?\\)?\\-?\\(?";
		}
		for (var i = 0; i < len; i++) {
			li = lis[i];
			innertext = !options.selector ? 
				(li.textContent || li.innertext || "") : 
				$(li).find(options.selector).text();

				li.innerHTML = li.innerHTML.replace(/<span style\=\"background-color\: \#E66A57\">/g ,"").replace(/\<\/span \>/);
			if (innertext.match(RegExp(num))) {
				li.innerHTML = li.innerHTML.replace(innertext.match(RegExp(num)), "<span style\=\"background-color: #E66A57\">" + innertext.match(RegExp(num)) + "</span c>");		
				if (li.style.display == "none") {
					li.style.display = oldDisplay;
				}
				numShown++;
			} else {			
				if (li.style.display != "none") {
					li.style.display = "none";
				}
			}
		}	
		callback(numShown);
		// var endTime = new Date().getTime();
		// console.log('Search for ' + filter + ' took: ' + (endTime - startTime) + ' (' + numShown + ' results)');
		return false;
	}).keydown(function() {
		clearTimeout(keyTimeout);
		keyTimeout = setTimeout(function() {
			if( input.val() === lastFilter ) return;
			lastFilter = input.val();
			input.change();
		}, timeout);
	});
	return this; // maintain jQuery chainability
}
  
$(document).ready(function(){
	$('#list').fastLiveFilter("#aza");

	$("#aza li div").click(function(){alert("lol");});
	$("#aza li span").click(function(){alert("alalalala");});
});
</script>
</head>

<body>
	<input id="list">
	<ul id="aza">
		<li><div>899999999</div><span>gggggg</span></li>
		<li><div>877777777</div></li>
		<li><div>866666666</div></li>
		<li>855555555</li>
	</ul>
</body>

</html>

Последний раз редактировалось yura29, 24.06.2014 в 12:15.
Ответить с цитированием
  #2 (permalink)  
Старый 24.06.2014, 12:29
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

yura29,
если у вас в строке 54 идёт перезапись innerHTML зачем ставить клик на то что уничтожается!!!
$("#aza").on("click", "div", function(){alert("lol");});
	$("#aza").on("click", "span", function(){alert("alalalala");});

на всякий случай если клик по спану нужен индивидуальный -- отмените всплытие иначе сработает и клик на див внутри которого спан .
Ответить с цитированием
  #3 (permalink)  
Старый 24.06.2014, 12:34
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

yura29,
в 54 строке
Сообщение от yura29
"</span c>");
Ответить с цитированием
  #4 (permalink)  
Старый 24.06.2014, 12:37
Интересующийся
Отправить личное сообщение для yura29 Посмотреть профиль Найти все сообщения от yura29
 
Регистрация: 17.08.2013
Сообщений: 17

Сообщение от рони Посмотреть сообщение
yura29,
если у вас в строке 54 идёт перезапись innerHTML зачем ставить клик на то что уничтожается!!!
$("#aza").on("click", "div", function(){alert("lol");});
	$("#aza").on("click", "span", function(){alert("alalalala");});

на всякий случай если клик по спану нужен индивидуальный -- отмените всплытие иначе сработает и клик на див внутри которого спан .
Спасибо
Думал, что иннер не уничтожает, а просто редактирует
Ваш код помог, но почему-то теперь клик работает только после снятия фокуса с инпута, то есть почему-то нужен дабл клик
Ответить с цитированием
  #5 (permalink)  
Старый 24.06.2014, 12:44
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

yura29,
фокус на инпуте - первый клик переключение фокуса на див
Ответить с цитированием
  #6 (permalink)  
Старый 24.06.2014, 12:48
Интересующийся
Отправить личное сообщение для yura29 Посмотреть профиль Найти все сообщения от yura29
 
Регистрация: 17.08.2013
Сообщений: 17

рони,
Не знал, что фокус можно переключить на див
Так получается клик должен и переключить фокус, и потом уже функцию вызывать?

Да и раньше, когда был просто li без дивов и спанов, все работало с одного клика
А фокус с инпута нужно снять один раз после каждого редактирования, потом если просто поставить на него фокус, но не менять значение все работает по одному клику

Последний раз редактировалось yura29, 24.06.2014 в 12:54.
Ответить с цитированием
  #7 (permalink)  
Старый 24.06.2014, 12:51
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

yura29, убрал немного лишнего из плагина - сейчас клик по диву должен сразу срабатывать
<!DOCTYPE HTML>

<html>

<head>
  <title>Title</title>
  <meta charset="utf-8">
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script>
/**
 * fastLiveFilter jQuery plugin 1.0.3
 *
 * Copyright (c) 2011, Anthony Bush
 * License: <http://www.opensource.org/licenses/bsd-license.php>
 * Project Website: http://anthonybush.com/projects/jquery_fast_live_filter/
 **/

jQuery.fn.fastLiveFilter = function(list, options) {
	// Options: input, list, timeout, callback
	options = options || {};
	list = jQuery(list);
	var input = this;
	var lastFilter = '';
	var timeout = options.timeout || 0;
	var callback = options.callback || function() {};



	// NOTE: because we cache lis & len here, users would need to re-init the plugin
	// if they modify the list in the DOM later.  This doesn't give us that much speed
	// boost, so perhaps it's not worth putting it here.
	var lis = list.children();
	var len = lis.length;
	var oldDisplay = len > 0 ? lis[0].style.display : "block";
	callback(len); // do a one-time callback on initialization to make sure everything's in sync

	input.on("input",function() {
		// var startTime = new Date().getTime();
		var filter = input.val().toLowerCase();
		var li, innertext, old;
		var numShown = 0;
		var num = "\\s?\\)?\\-?\\(?"
		for(i = 0; i<filter.length; i++){
			num += filter.substring(i,i+1) + "\\s?\\)?\\-?\\(?";
		}
		for (var i = 0; i < len; i++) {
			li = lis[i];
			innertext = !options.selector ?
				(li.textContent || li.innertext || "") :
				$(li).find(options.selector).text();

				li.innerHTML = li.innerHTML.replace(/<span style\=\"background-color\: \#E66A57\">/g ,"").replace(/\<\/span \>/);
			if (innertext.match(RegExp(num))) {
				li.innerHTML = li.innerHTML.replace(innertext.match(RegExp(num)), "<span style\=\"background-color: #E66A57\">" + innertext.match(RegExp(num)) + "</span c>");
				if (li.style.display == "none") {
					li.style.display = oldDisplay;
				}
				numShown++;
			} else {
				if (li.style.display != "none") {
					li.style.display = "none";
				}
			}
		}
		callback(numShown);
		// var endTime = new Date().getTime();
		// console.log('Search for ' + filter + ' took: ' + (endTime - startTime) + ' (' + numShown + ' results)');
		return false;
	})
	return this; // maintain jQuery chainability
}

$(document).ready(function(){
	$('#list').fastLiveFilter("#aza");
    $("#aza").on("click", "div", function(){alert("lol");});
   //	$("#aza").on("click", "span", function(){alert("alalalala");});
});
</script>
</head>

<body>
	<input id="list">
	<ul id="aza">
		<li><div>899999999</div><span>gggggg</span></li>
		<li><div>877777777</div></li>
		<li><div>866666666</div></li>
		<li>855555555</li>
	</ul>
</body>

</html>
Ответить с цитированием
  #8 (permalink)  
Старый 24.06.2014, 12:55
Интересующийся
Отправить личное сообщение для yura29 Посмотреть профиль Найти все сообщения от yura29
 
Регистрация: 17.08.2013
Сообщений: 17

рони,
Да, все работает с одного раза
Благодарю
Теперь буду смотреть изменения и вникать))
Ответить с цитированием
  #9 (permalink)  
Старый 24.06.2014, 13:01
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

yura29,
у плагина недочёт нельзя использовать background-color: #E66A57
надо просто span
и в сss #aza span{нужные параметры подсветки}
Ответить с цитированием
  #10 (permalink)  
Старый 24.06.2014, 13:08
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

yura29,
<!DOCTYPE HTML>

<html>

<head>
  <title>Title</title>
  <meta charset="utf-8">
  <style type="text/css">
  #aza span{background-color: #E66A57;}
  </style>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script>
/**
 * fastLiveFilter jQuery plugin 1.0.3
 *
 * Copyright (c) 2011, Anthony Bush
 * License: <http://www.opensource.org/licenses/bsd-license.php>
 * Project Website: http://anthonybush.com/projects/jquery_fast_live_filter/
 **/

jQuery.fn.fastLiveFilter = function(list, options) {
	// Options: input, list, timeout, callback
	options = options || {};
	list = jQuery(list);
	var input = this;
	var lastFilter = '';
	var timeout = options.timeout || 0;
	var callback = options.callback || function() {};



	// NOTE: because we cache lis & len here, users would need to re-init the plugin
	// if they modify the list in the DOM later.  This doesn't give us that much speed
	// boost, so perhaps it's not worth putting it here.
	var lis = list.children();
	var len = lis.length;
	var oldDisplay = len > 0 ? lis[0].style.display : "block";
	callback(len); // do a one-time callback on initialization to make sure everything's in sync

	input.on("input",function() {
		// var startTime = new Date().getTime();
		var filter = input.val().toLowerCase();
		var li, innertext, old;
		var numShown = 0;
		var num = "\\s?\\)?\\-?\\(?"
		for(i = 0; i<filter.length; i++){
			num += filter.substring(i,i+1) + "\\s?\\)?\\-?\\(?";
		}
		for (var i = 0; i < len; i++) {
			li = lis[i];
			innertext = !options.selector ?
				(li.textContent || li.innertext || "") :
				$(li).find(options.selector).text();

				li.innerHTML = li.innerHTML.replace(/<span>/g ,"").replace(/<\/span>/g,"");
			if (innertext.match(RegExp(num))) {
				li.innerHTML = li.innerHTML.replace(innertext.match(RegExp(num)), "<span>" + innertext.match(RegExp(num)) + "</span>");
				if (li.style.display == "none") {
					li.style.display = oldDisplay;
				}
				numShown++;
			} else {
				if (li.style.display != "none") {
					li.style.display = "none";
				}
			}
		}
		callback(numShown);
		// var endTime = new Date().getTime();
		// console.log('Search for ' + filter + ' took: ' + (endTime - startTime) + ' (' + numShown + ' results)');
		return false;
	})
	return this; // maintain jQuery chainability
}

$(document).ready(function(){
	$('#list').fastLiveFilter("#aza");
    $("#aza").on("click", "div", function(){alert("lol");});
});
</script>
</head>

<body>
	<input id="list">
	<ul id="aza">
		<li><div>899999999</div></li>
		<li><div>877777777</div></li>
		<li><div>866666666</div></li>
		<li>855555555</li>
	</ul>
</body>

</html>
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает 2 скрипта одновременно YuraP Ваши сайты и скрипты 2 09.06.2014 10:47
Форма обратной связи. Ошибка выполнения скрипта Fandor Элементы интерфейса 1 01.12.2013 15:39
после ajax запроса не работает перемещение. Scotti AJAX и COMET 3 31.10.2013 14:26
добавить к после отработки скрипта показ модалпопапа roman2 Работа 0 09.08.2009 22:48
Не срабатывает bind(и click) после load (или get) dijah jQuery 3 27.01.2009 20:05