Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Индивидуальные переменные в each (https://javascript.ru/forum/jquery/33723-individualnye-peremennye-v-each.html)

Spamol 05.12.2012 16:11

Индивидуальные переменные в each
 
Итак, есть такой код:
$('.game').each(function(i){
       			 $(this).children("a").click(function(){
       			 	
					iFinish = new Date().setTime(new Date().getTime() + 120 * 1000);
					iStart = new Date();
					iDuration = iFinish - iStart;
					
					$(this).everyTime(100, function() {
						iLeftTime = iFinish - new Date(); /* время оставшиеся */
						iRightTime = new Date() - iStart; /*время прощедщие */
						var	iDays = parseInt(iLeftTime / iDms);
                		var iHours = parseInt((iLeftTime - (iDays * iDms)) / iHms);
                        var iMin = parseInt((iLeftTime - (iDays * iDms) - (iHours * iHms)) / iMms);
                        var iSec = parseInt((iLeftTime - (iDays * iDms) - (iMin * iMms) - (iHours * iHms)) / iCms);
                        
                        iPerc = (iRightTime > 0) ? iRightTime / iDuration * 100 : 0;
                        if(Math.round(iPerc) >= 101){
                        
                        }else{
                        $(this).parent().parent().children(".load").html(Math.round(iPerc) + "%");
                        }
                        
                        if(Math.round(iPerc) >= 101){
                        
                        }else{
                        $(this).parent().parent().children(".load").children(".statusBar").width(Math.round(iPerc) + "%");
                        }
                        
                        if(Math.round(iPerc) >= 101){
                        	$(this).parent().parent().children(".time").html('Загружено');
                        }else{
							$(this).parent().parent().children(".time").html(iMin+' мин. '+iSec+' сек.</b>');}
					});
					
					
				 });

				});

На странице много div с классом .game, внутри ссылка, по нажатию на ссылку идет время + бегут проценты и соответственно заполняется шкала загрузки, так вот этих контейнеров несколько, поэтому использую each, нужно чтобы одна функция обслуживала эти контейнеры и время не пересекалось, т.е. переменные куда заносится время iFinish и iStart не переназначались, если я нажму ссылку в нескольких контейнерах, сейчас у них время бежит индентично, потому что эти переменные обновляются при каждом нажатии на новые и первоначальное время сбивается, как создать эти переменные индивидуальные для каждого элемента .game например так то так
$('.game').each(function(i){
       			 $(this).children("a").click(function(){
       			 	var iFinish[i];
       			 	var iStart[i];
       			 	var iDuration[i];
					iFinish[i] = new Date().setTime(new Date().getTime() + 120 * 1000);
					iStart[i] = new Date();
					iDuration[i] = iFinish[i] - iStart[i];
					
				 });
				});

но создать такие переменные с квадратными скобками нельзя, есть какие-то еще выходы?

cmd 05.12.2012 17:47

Я бы поменял html структуру. Например, навесил бы 2 класса типа
<div class="game game_id_16" my_id="16">, где 16 будет конкретным id. Так проще будет работать с конкретным блоком...

Spamol 05.12.2012 18:17

Не пойдет, у меня может быть 3 блока, а может 23 и к каждому руками классы прописывать?

Я могу навесить классы прям в each с уникальным номером класс будет и обращаться к конкретному блоку,
$('.game').each(function(i){
				$(this).addClass("hay" + i)
});

а смысл, как дальше для индивидуального блока свой таймер или свою переменную со временем сделать

cmd 05.12.2012 22:45

Цитата:

Не пойдет, у меня может быть 3 блока, а может 23 и к каждому руками классы прописывать?
Нет, конечно, это было бы глупо. Вы же, наверняка, из базы берете данные. В базе есть PRIMARY KEY - его и используйте в качестве идентификатора.
Цитата:

а смысл, как дальше для индивидуального блока свой таймер или свою переменную со временем сделать
Не уверен, что понял вопрос. А разве так не будет работать
function my_start_timer_function(id) {
 var myObject = $('.myclass'+id); // получили наш объект
 myObject.css('color', 'red'); // и код самого бегунка или что там у Вас
}
$('a').click(function() {
  var this_identifikator = $(this).attr('my_id');
  my_start_timer_function(this_identifikator);
});


Посмотрел код в первом посте. Нет... что-то не так. Вы в цикле each пытаетесь навесить событие click... Нет, я думаю, нет. И селектор .children() я не понимаю зачем. Показывайте HTML структуру.

danik.js 06.12.2012 08:11

Цитата:

Сообщение от Spamol
но создать такие переменные с квадратными скобками нельзя, есть какие-то еще выходы?

var iFinish = [];
var iStart = [];
var iDuration [];

$('.game').each(function(i){
                 $(this).children("a").click(function(){
                    iFinish[i] = new Date().setTime(new Date().getTime() + 120 * 1000);
                    iStart[i] = new Date();
                    iDuration[i] = iFinish[i] - iStart[i];
                     
                 });
                });


То есть заранее создаем сначала массивы, а потом просто добавляем элементы в уже созданные массивы.

ОлегА 07.12.2012 11:22

а чем тебе не устраивать сделать просто вот так ?

$('.game a').live('click', function(){
// тут твой код загрузчика
});

Spamol 08.12.2012 14:34

Цитата:

Сообщение от danik.js (Сообщение 219833)
var iFinish = [];
var iStart = [];
var iDuration [];

$('.game').each(function(i){
                 $(this).children("a").click(function(){
                    iFinish[i] = new Date().setTime(new Date().getTime() + 120 * 1000);
                    iStart[i] = new Date();
                    iDuration[i] = iFinish[i] - iStart[i];
                     
                 });
                });


То есть заранее создаем сначала массивы, а потом просто добавляем элементы в уже созданные массивы.

Вот прям то что надо, спасиб


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