Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.11.2018, 02:51
Новичок на форуме
Отправить личное сообщение для Puzikov_Oleg Посмотреть профиль Найти все сообщения от Puzikov_Oleg
 
Регистрация: 06.11.2018
Сообщений: 3

Составная команда из переменной и текста
Задача: Создать цикл, в котором свойства большого количества графических элементов будут меняться.

В теле объявляю объект <svg>, состоящий с нескольких элементов <circle> с id от circle001 до circle100, например.

Далее скрипт с анимацией, работающий по наведению на элемент:
animate(function(timePassed) {
   circle001.setAttributeNS(null, "cx" , X0 - timePassed*(X0 - X001)/1000);
   circle001.setAttributeNS(null, "cy" , Y0 - timePassed*(Y0 - Y001)/1000);
   circle001.setAttributeNS(null, "r" , 1 + timePassed*0.003);
}, 1000);

Пытаюсь сделать цикл с переменной i:
animate(function(timePassed) {
   var stringx = [];
   var stringy = [];
   var stringr = [];
   var i = 1;
   while (i<5) {
      stringx[i]='circle00'+i+'.setAttributeNS(null, "cx" , X0 - timePassed*(X0 - X00'+i+')/1000)';
      stringy[i]='circle00'+i+'.setAttributeNS(null, "cy" , Y0 - timePassed*(Y0 - Y00'+i+')/1000)';
      stringr[i]='circle00'+i+'.setAttributeNS(null, "r" , 1 + timePassed*0.003)';
      stringx[i];
      stringy[i];
      stringr[i];
      i++;
      }
}, 1000);


Без цикла всё работает, а с циклом нет.
Что я делаю не так?
Ответить с цитированием
  #2 (permalink)  
Старый 06.11.2018, 06:17
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

animate(function(timePassed) {
   var stringx = [];
   var stringy = [];
   var stringr = [];
   var i = 1;
   while (i<5) {
      stringx[i]=window['circle00'+i].setAttributeNS(null, "cx" , X0 - timePassed*(X0 - window['X00'+i])/1000);
      stringy[i]=window['circle00'+i].setAttributeNS(null, "cy" , Y0 - timePassed*(Y0 - window['Y00'+i])/1000);
      stringr[i]=window['circle00'+i].setAttributeNS(null, "r" , 1 + timePassed*0.003);
      stringx[i];
      stringy[i];
      stringr[i];
      i++;
      }
}, 1000);


если у вас переменные глобальные, попробуйте так.
а лучше создайте объект со свойствами вместо переменных.
Ответить с цитированием
  #3 (permalink)  
Старый 06.11.2018, 13:15
Новичок на форуме
Отправить личное сообщение для Puzikov_Oleg Посмотреть профиль Найти все сообщения от Puzikov_Oleg
 
Регистрация: 06.11.2018
Сообщений: 3

Спасибо, что ответили!
Так почему-то у меня не работает.
Эти элементы просто не отображаются.
Для проверки запустил:
alert(stringx[3]);

после цикла. Значение stringx[3] выдаёт undefined.
Если использовать мой вариант
stringx[i]='circle00'+i+'.setAttributeNS(null, "cx" , X0 - timePassed*(X0 - X00'+i+')/1000)';

,то знаечение stringx[3] выводиться как
circle003.setAttributeNS(null, "cx" , X0 - timePassed*(X0 - X003)/1000)
Но как не работала, так и не работает.

Цитата:
а лучше создайте объект со свойствами вместо переменных.
А вот это предложение могли бы чуть-чуть раскрыть.
Объектом что будет являться?
Ответить с цитированием
  #4 (permalink)  
Старый 06.11.2018, 16:48
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

там где у вас объявлены circle001 и X001 вместо них нужен объект
var circle = {
'1':'какое то ваше значение',
'2':'какое то ваше значение'
...
};

точно так же с X.
тогда к из свойствам можно будет удобно обращаться динамически circle[i] и все будет работать.
Ответить с цитированием
  #5 (permalink)  
Старый 06.11.2018, 16:52
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

animate(function(timePassed) {
   var stringx = [];
   var stringy = [];
   var stringr = [];
   var i = 1;
   while (i<5) {
      stringx[i]=eval('circle00'+i).setAttributeNS(null, "cx" , X0 - timePassed*(X0 - eval('X00'+i))/1000);
      stringy[i]=eval('circle00'+i).setAttributeNS(null, "cy" , Y0 - timePassed*(Y0 - eval('Y00'+i))/1000);
      stringr[i]=eval('circle00'+i).setAttributeNS(null, "r" , 1 + timePassed*0.003);
      stringx[i];
      stringy[i];
      stringr[i];
      i++;
      }
}, 1000);

можно вот так сделать, работать должно, но это не гуд.
Ответить с цитированием
  #6 (permalink)  
Старый 08.11.2018, 00:08
Новичок на форуме
Отправить личное сообщение для Puzikov_Oleg Посмотреть профиль Найти все сообщения от Puzikov_Oleg
 
Регистрация: 06.11.2018
Сообщений: 3

Да, так работает. Спасибо!!!

Сообщение от j0hnik Посмотреть сообщение
animate(function(timePassed) {
   var stringx = [];
   var stringy = [];
   var stringr = [];
   var i = 1;
   while (i<5) {
      stringx[i]=eval('circle00'+i).setAttributeNS(null, "cx" , X0 - timePassed*(X0 - eval('X00'+i))/1000);
      stringy[i]=eval('circle00'+i).setAttributeNS(null, "cy" , Y0 - timePassed*(Y0 - eval('Y00'+i))/1000);
      stringr[i]=eval('circle00'+i).setAttributeNS(null, "r" , 1 + timePassed*0.003);
      stringx[i];
      stringy[i];
      stringr[i];
      i++;
      }
}, 1000);

можно вот так сделать, работать должно, но это не гуд.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как с помощью скрипта высчитать ширину полосы прокрутки? LADYX Элементы интерфейса 35 13.11.2017 12:50
Вывод текста из переменной sergofedor06 Javascript под браузер 4 12.08.2016 00:22
Передача текста и переменной из цикла по нажатию Enter Pirat Элементы интерфейса 6 14.04.2014 23:00
Поиск и замена текста в переменной nikolayseo jQuery 1 03.12.2012 22:39
пытаюсь заменить часть текста в html который вроде как в переменной. mitiya Общие вопросы Javascript 4 22.03.2012 18:16