Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   подгрузка в разные контенты одной функцией (https://javascript.ru/forum/dom-window/40031-podgruzka-v-raznye-kontenty-odnojj-funkciejj.html)

JustCrazy 22.07.2013 12:20

подгрузка в разные контенты одной функцией
 
День добрый. есть у меня код, который функцией 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>

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

mta88 22.07.2013 12:48

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


но совершенно непонятен смысл двух 'setTimeout'
для солидности?

JustCrazy 22.07.2013 12:51

Цитата:

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

спасибо, попробую - отпишусь.
Цитата:

Сообщение от mta88 (Сообщение 263558)
но совершенно непонятен смысл двух 'setTimeout'
для солидности?

это в случае страховки, можно конечно через setInterval, но хочу исключить наложения, в случае, если ответ от сервера не придет раньше чем через 2 секунды.

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

JustCrazy 23.07.2013 05:51

Теперь столкнулся с такой проблемой: оказывается (!), если я несколько раз чекаю, то таймер запускается по новой (при этом старый остается в памяти :yes: ), в итоге имеется неограниченное количество таймеров. Подскажите как решить это?
может нужна какая-то хитрая переменная для таймера ?

mta88 23.07.2013 06:10

Цитата:

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

Цитата:

может нужна какая-то хитрая переменная для таймера ?
в абсолютном большинстве поременных на этой планете нет ничего хитрого
а почему вы боитесь самому что-то сделать? у вас что ли наставник, который бъет вас палкой, если ему что-то в коде не нравится?
сделайте какой-нибудь массив булевых переменных для инпутов с запущенными таймерами или еще что-нибудь

JustCrazy 23.07.2013 06:44

Цитата:

Сообщение от 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:23

собственно даже когда через консоль пытаюсь грохнуть таймер через 'clearTimeout', мне выползает сообщение 'undefined'

mta88 23.07.2013 07:24

Цитата:

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

но в вашем коде я разбираться не буду
потому что во вложенных 'setTimeout', запускающих одну и ту же функцию, есть что-то фундаментально неправильное
большинству людей хватает одного '$.ajax'
function startshow(id) {
  $.ajax({...})
}

JustCrazy 23.07.2013 12:12

Цитата:

Сообщение от mta88
потому что во вложенных 'setTimeout', запускающих одну и ту же функцию, есть что-то фундаментально неправильное
большинству людей хватает одного '$.ajax'

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


Часовой пояс GMT +3, время: 02:44.