Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.07.2013, 12:20
Аспирант
Отправить личное сообщение для JustCrazy Посмотреть профиль Найти все сообщения от JustCrazy
 
Регистрация: 20.07.2012
Сообщений: 64

подгрузка в разные контенты одной функцией
День добрый. есть у меня код, который функцией startshow по введенному id с сервера подгружает информацию в контент, так же есть есть функция, которая добавляет поля ввода. Но столкнулся я с такой проблемой: когда у меня одно поле ввода - все нормально, данные тянутся, но когда я добавляю второе и начинаю для него подгружать информацию, моя функция startshow забывает про первое и делает 2 одинаковых запроса со второго поля.
вот сам код
<body onLoad='addplace();'>
<input type='button' onClick='addplace();' value='+'>
<div id='ins_body'></div>
<div id='cont_body'></div>
<script>
function addplace(){
	n=$('.user_cont').length + 1;
	$('#ins_body').append("<input id='id"+n+"' type='text' size='5' title='Введите идентификатор персонажа'><input type='checkbox' id='started"+n+"' onClick='startshow(this.id);'><br>");
	$('#cont_body').append("<div id='content"+n+"' class='user_cont'></div>");
}
function startshow(id){
	regexp=/\d+/;
	s=id.match(regexp);
	setTimeout(function showuser(){
		if ($('#started'+s).prop('checked')) {
			$('#content'+s).css('display','block');
			$.ajax({ 
				url: 'sled_1.php',  
				cache: false,
				data: 'id='+$('#id'+s).val(),  
				success: function(html){
					$('#content'+s).html(html);
					setTimeout(function(){showuser(s);},2000);
				}  
			});
		} else {
			$('#content'+s).css('display','none');
		}
	},100);
}
</script> 
</body>

Подскажите пожалуйста как же мне реализовать задуманное? Чтобы для нескольких полей подгружалась разная информация.

Последний раз редактировалось JustCrazy, 23.07.2013 в 05:42.
Ответить с цитированием
  #2 (permalink)  
Старый 22.07.2013, 12:48
Профессор
Отправить личное сообщение для mta88 Посмотреть профиль Найти все сообщения от mta88
 
Регистрация: 16.05.2013
Сообщений: 229

код вроде выглядит нормально
за исключением конечно же глобальных переменных 'regexp' и 's' в функции 'startshow', особенно 's'
может для начала попробовать вот так?
var s = id.match(regexp);


но совершенно непонятен смысл двух 'setTimeout'
для солидности?
Ответить с цитированием
  #3 (permalink)  
Старый 22.07.2013, 12:51
Аспирант
Отправить личное сообщение для JustCrazy Посмотреть профиль Найти все сообщения от JustCrazy
 
Регистрация: 20.07.2012
Сообщений: 64

Сообщение от mta88 Посмотреть сообщение
код вроде выглядит нормально
за исключением конечно же глобальных переменных 'regexp' и 's' в функции 'startshow', особенно 's'
может для начала попробовать вот так?
var s = id.match(regexp);
спасибо, попробую - отпишусь.
Сообщение от mta88 Посмотреть сообщение
но совершенно непонятен смысл двух 'setTimeout'
для солидности?
это в случае страховки, можно конечно через setInterval, но хочу исключить наложения, в случае, если ответ от сервера не придет раньше чем через 2 секунды.

upd: спасибо, все отлично, и что я сразу с глобальными переменными то не сообразил)

Последний раз редактировалось JustCrazy, 22.07.2013 в 12:55.
Ответить с цитированием
  #4 (permalink)  
Старый 23.07.2013, 05:51
Аспирант
Отправить личное сообщение для JustCrazy Посмотреть профиль Найти все сообщения от JustCrazy
 
Регистрация: 20.07.2012
Сообщений: 64

Теперь столкнулся с такой проблемой: оказывается (!), если я несколько раз чекаю, то таймер запускается по новой (при этом старый остается в памяти ), в итоге имеется неограниченное количество таймеров. Подскажите как решить это?
может нужна какая-то хитрая переменная для таймера ?
Ответить с цитированием
  #5 (permalink)  
Старый 23.07.2013, 06:10
Профессор
Отправить личное сообщение для mta88 Посмотреть профиль Найти все сообщения от mta88
 
Регистрация: 16.05.2013
Сообщений: 229

Цитата:
то таймер запускается по новой (при этом старый остается в памяти)
а что, есть другие варианты?

Цитата:
может нужна какая-то хитрая переменная для таймера ?
в абсолютном большинстве поременных на этой планете нет ничего хитрого
а почему вы боитесь самому что-то сделать? у вас что ли наставник, который бъет вас палкой, если ему что-то в коде не нравится?
сделайте какой-нибудь массив булевых переменных для инпутов с запущенными таймерами или еще что-нибудь
Ответить с цитированием
  #6 (permalink)  
Старый 23.07.2013, 06:44
Аспирант
Отправить личное сообщение для JustCrazy Посмотреть профиль Найти все сообщения от JustCrazy
 
Регистрация: 20.07.2012
Сообщений: 64

Сообщение от mta88
а почему вы боитесь самому что-то сделать?
я решил записывать идентификатор таймера в куки, затем перед запуском нового проверять его наличие и если существует - то грохать таймер через 'clearTimeout', но почему-то 'clearTimeout' не срабатывает
function startshow(id){
	var regexp=/\d+/;
	var s=id.match(regexp);
	var cook=getCookie('timer'+s); 
	if(cook!=undefined){
		alert(cook); // правильно выдает мне значение моего таймера
		var clear_cookie=clearTimeout(cook);
		alert(clear_cookie); // выдает мне undefined
	}
	if ($('#started'+s).prop('checked')) {
		var timerID = setTimeout(function showuser(){
			$('#content'+s).css('display','block');
			$.ajax({ 
				url: 'sled_1.php',  
				cache: false,
				data: 'id='+$('#id'+s).val(),  
				success: function(html){
					$('#content'+s).html(html);
					if ($('#started'+s).prop('checked')) {
						setTimeout(function(){showuser(s);},5000);
					}
				}
			});
		},100); 
		document.cookie="timer"+s+"="+timerID;
	} 
}

Последний раз редактировалось JustCrazy, 23.07.2013 в 07:16.
Ответить с цитированием
  #7 (permalink)  
Старый 23.07.2013, 07:23
Аспирант
Отправить личное сообщение для JustCrazy Посмотреть профиль Найти все сообщения от JustCrazy
 
Регистрация: 20.07.2012
Сообщений: 64

собственно даже когда через консоль пытаюсь грохнуть таймер через 'clearTimeout', мне выползает сообщение 'undefined'
Ответить с цитированием
  #8 (permalink)  
Старый 23.07.2013, 07:24
Профессор
Отправить личное сообщение для mta88 Посмотреть профиль Найти все сообщения от mta88
 
Регистрация: 16.05.2013
Сообщений: 229

Цитата:
я решил записывать идентификатор таймера в куки
сурово

но в вашем коде я разбираться не буду
потому что во вложенных 'setTimeout', запускающих одну и ту же функцию, есть что-то фундаментально неправильное
большинству людей хватает одного '$.ajax'
function startshow(id) {
  $.ajax({...})
}
Ответить с цитированием
  #9 (permalink)  
Старый 23.07.2013, 12:12
Аспирант
Отправить личное сообщение для JustCrazy Посмотреть профиль Найти все сообщения от JustCrazy
 
Регистрация: 20.07.2012
Сообщений: 64

Сообщение от mta88
потому что во вложенных 'setTimeout', запускающих одну и ту же функцию, есть что-то фундаментально неправильное
большинству людей хватает одного '$.ajax'
большинству, но!
скриптом я тяну страницу с сервера, на которой в свою очередь парсится другая страница с (имя домена), допустим вы Петя из далекой глубинки, из провайдеров у вас только мелофон или тому подобный оператор с зоной покрытия 2g (и такое бывает,да). так вот контент, тянущийся меняется с завидной периодичностью, для этого используется 'setInterval', но как я уже говорил вы Петя из глубинки и страница у вас грузится дольше, чем таймер в 'setInterval', вот тут то и происходят наложения, дабы это избежать я использую вложенные таймауты - в этом их плюс.
и кстати да, с таймерами я разобрался, потратил пол дня, но разобрался - повысил свой Экспириенс.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обработка одной функцией нескольких элементов Valen_x Общие вопросы Javascript 2 28.04.2013 16:01
Несколько сценариев одной функцией Marker Events/DOM/Window 19 19.01.2013 00:40