Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Получить доступ к стилю объекта (https://javascript.ru/forum/css-html/70491-poluchit-dostup-k-stilyu-obekta.html)

evgeniyfill82 09.09.2017 14:01

Получить доступ к стилю объекта
 
var tr1 = {
	name: '1a',
	obj: pole.innerHTML = "<img src='1a.png' class='obj'>",
	x: 100,
	y: 200
}
tr1.obj.style.top = 300 +'px';

( .obj { position: absolute; } )

Не могу сдвинуть картинку. Говорит, что нет такого объекта.
Не факт, что так должно работать, просто пытаюсь вспомнить проект, исходники которого утеряны.
Как сделать, чтобы можно было обращаться к объекту tr1 с его картинкой на экране?

рони 09.09.2017 14:09

evgeniyfill82,
pole.innerHTML = "<img src='1a.png' class='obj'>"
 var tr1 = {
  name: '1a',
  obj: pole.querySelector('.obj'),
  x: 100,
  y: 200
}
tr1.obj.style.top = 300 +'px';

evgeniyfill82 09.09.2017 14:52

Блин, я в .hta все это вояю. Там говорит, что не поддерживает такой метод. Переименовал в html, там работает. Видимо надо под какой-то старый IE чтобы шло. (уже сталкивался, что в hta не все проканывает что должно)

И второй вопрос. Цель в том, чтобы можно было создать например 100 tr1 объектов, управлять ими интервале, удалять и снова добавлять. Нельзя сделать, чтобы innerHTML был где-то прямо в объекте? Для удобства.
Навроде того:
var obs = [];
var tr1 = { ... }
obs.push(tr1 = {name: '2a'});
obs.push(tr1 = {name: '3a'});
obs.push(tr1 = {name: '4a'});
alert(obs[2].name);
delete glb.obs[1];
if (obs[1]) alert(obs[1].name);

evgeniyfill82 09.09.2017 18:24

Вроде бы вспомнил как примерно я это раньше на jquery исполнял. Но хотелось бы сделать все на яве для экономии ресурсов, потому как от 50и объектов в обработке начинаются притормаживания, может быть это бы помогло.
var glb = {};
glb.obs = [];
glb.sss = 0;

function getTr(prm){
	var tr = {
		obj: $("<img src='1a.png' style='position:absolute;'>").appendTo("#pole"),
		x: prm.x,
		y: prm.y,
		u: prm.u,
		vid: 'none',
		liv: 20
	}
	return tr;
}

var vrm = setInterval(function(){ gmm(); }, 100);

function gmm(){
	if (glb.sss == 5) glb.sss = 0;
	if (glb.sss == 0) 
	glb.obs.push(getTr({x:100, y:200, u:1}));
	for(i=0;glb.obs.length>i;i++) if (glb.obs[i]) {
		glb.obs[i].x += 10;
		glb.obs[i].y += 10;
		glb.obs[i].u += 10;
		glb.obs[i].liv--;
		glb.obs[i].vid = 'block';
		
		glb.obs[i].obj.css({ 
			'transform': 'rotate('+ glb.obs[i].u +'deg)', 
			'top': glb.obs[i].x +'px', 
			'left': glb.obs[i].y +'px',
			'display': glb.obs[i].vid
		});
		if (glb.obs[i].liv == 0) {
			glb.obs[i].obj.remove();
			delete glb.obs[i];
		}
	}
	glb.sss++;
}

Однако с rotate в .hta похоже будут непреодолимые сложности. А так хотелось запилить игруху чтобы с компа работала, безо всяких хостингов. Можно и так конечно html-ку запускать, но данные никакие не сохранишь.

рони 09.09.2017 19:32

evgeniyfill82,
в вашем браузере нет querySelector
тогда можно так childNodes
pole.innerHTML = "<img src='1a.png' class='obj'>"
 var tr1 = {
  name: '1a',
  obj: pole.childNodes[0],
  x: 100,
  y: 200
}
tr1.obj.style.top = 300 +'px';

или создавайте картинку
var img = new Image();
 img.src = '1a.png'
 img.className = 'obj';
 pole.appendChild(img);
 var tr1 = {
  name: '1a',
  obj: img,
  x: 100,
  y: 200
}
tr1.obj.style.top = 300 +'px';

evgeniyfill82 09.09.2017 19:45

рони,
я не совсем понимаю как именно использовать ваш пример в моем, описанном в последнем сообщении.

рони 09.09.2017 19:54

evgeniyfill82,
:-?
function getTr(prm){
  var img = new Image();
 img.src = '1a.png'
 img.className = 'obj';
 img.style.position ='absolute'
 pole.appendChild(img);
  var tr = {
    obj: img,
    x: prm.x,
    y: prm.y,
    u: prm.u,
    vid: 'none',
    liv: 20
  }
  return tr;
}

evgeniyfill82 09.09.2017 20:02

рони,
пардон, я ответил раньше вашего дополнения к сообщению. с дополнением да, все работает без jquery. Спасибо.

var glb = {};
glb.obs = [];
glb.sss = 0;

function getTr(prm){
	var img = new Image();
	img.src = '1a.png'
	img.className = 'obj';
	pole.appendChild(img);
	var tr1 = {
		name: '1a',
		obj: img,
		x: prm.x,
		y: prm.y,
		u: prm.u,
		vid: 'none',
		liv: 20
	}
	return tr1;
}

var vrm = setInterval(function(){ gmm(); }, 100);

function gmm(){
	if (glb.sss == 3) glb.sss = 0;
	if (glb.sss == 0) 
	glb.obs.push(getTr({x:10, y:10, u:1}));
	for(i=0;glb.obs.length>i;i++) if (glb.obs[i]) {
		glb.obs[i].x += 10;
		glb.obs[i].y += 10;
		glb.obs[i].u += 10;
		glb.obs[i].liv--;
		glb.obs[i].vid = 'block';
		
		glb.obs[i].obj.style.top = glb.obs[i].x +'px';
		glb.obs[i].obj.style.left = glb.obs[i].y +'px';
		glb.obs[i].obj.style.display =glb.obs[i].vid;
		if (glb.obs[i].liv == 0) {
			glb.obs[i].obj.parentNode.removeChild(glb.obs[i].obj);
			delete glb.obs[i];
		}
	}
	glb.sss++;
}

рони 09.09.2017 20:06

evgeniyfill82,
Object.keys возможно опять нет -- тогда for in
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">

</head>

<body>
<div id="pole"></div>
 <script>
var glb = {};
glb.obs = [];
glb.sss = 0;

function getTr(prm){
  var img = new Image();
 img.src = 'http://paar.com.au/images/star95x72.png'
 img.className = 'obj';
 img.style.position ='absolute'
 pole.appendChild(img);
  var tr = {
    obj: img,
    x: prm.x,
    y: prm.y,
    u: prm.u,
    vid: 'none',
    liv: 20,
    css : function(data) {
    Object.keys(data).forEach(function (key) {
 img.style[key] = data[key]

});

}
  }
  return tr;
}

var vrm = setInterval(function(){ gmm(); }, 100);

function gmm(){
  if (glb.sss == 5) glb.sss = 0;
  if (glb.sss == 0)
  glb.obs.push(getTr({x:100, y:200, u:1}));
  for(i=0;glb.obs.length>i;i++) if (glb.obs[i]) {
    glb.obs[i].x += 10;
    glb.obs[i].y += 10;
    glb.obs[i].u += 10;
    glb.obs[i].liv--;
    glb.obs[i].vid = 'block';

    glb.obs[i].css({
      'transform': 'rotate('+ glb.obs[i].u +'deg)',
      'top': glb.obs[i].x +'px',
      'left': glb.obs[i].y +'px',
      'display': glb.obs[i].vid
    });
    if (glb.obs[i].liv == 0) {
      glb.obs[i].obj.remove();
      delete glb.obs[i];
    }
  }
  glb.sss++;
}

 </script>
</body>
</html>

рони 09.09.2017 20:41

evgeniyfill82,
удаление не корректировал!

evgeniyfill82 24.09.2017 22:12

рони, оживлю немного тему, чтобы зря не плодить. Только вопрос уже немного в другом.
Как удалить объект из массива, и надо ли это?
arr = [];
arr.push({ ... });
arr.push({ ... });
arr.push({ ... });
console.log(arr.length); // 3
for(var k in arr) {
 if (...) delete arr[k];
}
console.log(arr.length); // 3

То есть, если удалить объект из массива, длина массива не изменится. Считает ли цикл каждые, даже не существующие уже значения? Повлияет ли это на производительность, если массивы будут безмерно долго расти, при том, что не удаленными в них будет оставаться примерно одно и тоже количество объектов. (если это еще и будет делаться каждые 50 мс).
console.log(arr.length); // 300000
var i = 0;
for(var k in arr) {
 i++;
}
console.log(i) // 1000

рони 24.09.2017 22:29

Цитата:

Сообщение от evgeniyfill82
Как удалить объект из массива

Цитата:

для удаления используются специальные методы: из начала – shift, с конца – pop, а из середины – splice
splice

рони 24.09.2017 22:31

evgeniyfill82,
удалить всё
arr.length = 0

evgeniyfill82 24.09.2017 22:57

рони, да, спасибо, удалить что мне надо - splice.
У меня же массив-то обычный, хоть и объекты в нем. Запутался немного.


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