22.07.2013, 12:20
|
Аспирант
|
|
Регистрация: 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.
|
|
22.07.2013, 12:48
|
Профессор
|
|
Регистрация: 16.05.2013
Сообщений: 229
|
|
код вроде выглядит нормально
за исключением конечно же глобальных переменных 'regexp' и 's' в функции 'startshow', особенно 's'
может для начала попробовать вот так?
var s = id.match(regexp);
но совершенно непонятен смысл двух 'setTimeout'
для солидности?
|
|
22.07.2013, 12:51
|
Аспирант
|
|
Регистрация: 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.
|
|
23.07.2013, 05:51
|
Аспирант
|
|
Регистрация: 20.07.2012
Сообщений: 64
|
|
Теперь столкнулся с такой проблемой: оказывается (!), если я несколько раз чекаю, то таймер запускается по новой (при этом старый остается в памяти ), в итоге имеется неограниченное количество таймеров. Подскажите как решить это?
может нужна какая-то хитрая переменная для таймера ?
|
|
23.07.2013, 06:10
|
Профессор
|
|
Регистрация: 16.05.2013
Сообщений: 229
|
|
Цитата:
|
то таймер запускается по новой (при этом старый остается в памяти)
|
а что, есть другие варианты?
Цитата:
|
может нужна какая-то хитрая переменная для таймера ?
|
в абсолютном большинстве поременных на этой планете нет ничего хитрого
а почему вы боитесь самому что-то сделать? у вас что ли наставник, который бъет вас палкой, если ему что-то в коде не нравится?
сделайте какой-нибудь массив булевых переменных для инпутов с запущенными таймерами или еще что-нибудь
|
|
23.07.2013, 06:44
|
Аспирант
|
|
Регистрация: 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.
|
|
23.07.2013, 07:23
|
Аспирант
|
|
Регистрация: 20.07.2012
Сообщений: 64
|
|
собственно даже когда через консоль пытаюсь грохнуть таймер через 'clearTimeout', мне выползает сообщение 'undefined'
|
|
23.07.2013, 07:24
|
Профессор
|
|
Регистрация: 16.05.2013
Сообщений: 229
|
|
Цитата:
|
я решил записывать идентификатор таймера в куки
|
сурово
но в вашем коде я разбираться не буду
потому что во вложенных 'setTimeout', запускающих одну и ту же функцию, есть что-то фундаментально неправильное
большинству людей хватает одного '$.ajax'
function startshow(id) {
$.ajax({...})
}
|
|
23.07.2013, 12:12
|
Аспирант
|
|
Регистрация: 20.07.2012
Сообщений: 64
|
|
Сообщение от mta88
|
потому что во вложенных 'setTimeout', запускающих одну и ту же функцию, есть что-то фундаментально неправильное
большинству людей хватает одного '$.ajax'
|
большинству, но!
скриптом я тяну страницу с сервера, на которой в свою очередь парсится другая страница с (имя домена), допустим вы Петя из далекой глубинки, из провайдеров у вас только мелофон или тому подобный оператор с зоной покрытия 2g (и такое бывает,да). так вот контент, тянущийся меняется с завидной периодичностью, для этого используется 'setInterval', но как я уже говорил вы Петя из глубинки и страница у вас грузится дольше, чем таймер в 'setInterval', вот тут то и происходят наложения, дабы это избежать я использую вложенные таймауты - в этом их плюс.
и кстати да, с таймерами я разобрался, потратил пол дня, но разобрался - повысил свой Экспириенс.
|
|
|
|