Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Как будет правильнее, два варинта обработки массива. (https://javascript.ru/forum/events/36433-kak-budet-pravilnee-dva-varinta-obrabotki-massiva.html)

MininAS 15.03.2013 00:10

Как будет правильнее, два варинта обработки массива.
 
Здравствуйте!
Допустим имеем массив: поле в всем знакомой игре Сапер.
Данное поле состоит из элементов <img />. Необходимо, что бы при нажатии на пустую клетку - клетки стоящие рядом то же открывались если они пустые.
Вопрос: Как правильнее и где быстрее будет работать браузер
1. Представить массив игрового поля, в виде двумерного массива
for (x=0; x<=XxX; x++)
	{
		for (y=0; y<=YyY; y++)
		{
			var myElem = document.createElement('img');
			document.getElementById('game').appendChild(myElem);
			myElem.src = '......';
			myElem.onclick = f_keyPress;
			a_block[x][y] = myElem;
		}
	}

с таким соответственно легче работать и проще проверить, что бы при проверке не вылететь за края поля и не проверить несуществующего элемента.
2. Или одномерного
for (i=1; i<=(XxX * YyY); i++)
	{
		var myElem = document.createElement('img');
		document.getElementById('game').appendChild(myElem);
		myElem.src = '......';
		myElem.onclick = f_keyPress;
	}
	myElem = document.getElementById('game')
	a_block = myElem.getElementsByTagName('img');

Здесь что бы не мудрить с расчетами по проверке не выходит ли элемент за приделы поля я применил проверку на существование данного объекта:
if (typeof a_block[i-XxX-1] == 'object') {.......}

danik.js 15.03.2013 09:21

Думаю второй вариант быстрее, но первый удобнее.
Но это все экономия на спичках. Тормоза если и появятся, то не от таких мелочей, а от более грубых недочетов.

MininAS 15.03.2013 23:12

Я так же думаю, просто бывали случаи с CSS или например построение HTML по поводу в таблицах или в блоках....
Вообщем вопрос как правильнее с точки зрения программного кода.

devote 15.03.2013 23:41

Оба варианта полное Г. Никогда не суйте в DOM, элементы в цикле. Сначала нужно подготовить данные, а уж потом выставлять их в DOM.

var container = document.createDocumentFragment();
for(var i = 0; i < XxX; i++) {
    var img = container.appendChild(document.createElement('img');
    img.src = '....';
    img.onclick = f_keyPress;
}
document.getElementById('game').appendChild(container);

danik.js 15.03.2013 23:48

Да и вобще, тут канвас нужен а не гора картинок. И если уж и на DOM делать, то почему картинки? Тут же налицо таблица.
Эффективней обработчик навешать на контейнер (делегировать обрабоку события)

MininAS 16.03.2013 23:15

Цитата:

Сообщение от devote (Сообщение 241049)
Оба варианта полное Г. Никогда не суйте в DOM, элементы в цикле. Сначала нужно подготовить данные, а уж потом выставлять их в DOM.

Хорошо буду делать так, раннее такого метода не знал. Соображаю, что данный код будет работать быстрее.
1. А, это общепринятое правило?
2. С какой версии JS работает метод по созданию целого куска кода?

MininAS 16.03.2013 23:22

Цитата:

Сообщение от danik.js (Сообщение 241050)
Да и вобще, тут канвас нужен а не гора картинок. И если уж и на DOM делать, то почему картинки? Тут же налицо таблица.
Эффективней обработчик навешать на контейнер (делегировать обработку события)

1. С канвас еще не пробовал работать.
2. С таблицей получится слишком грамостко и как без картинок если же все что мы видим на экране это и есть картинки??
3. А обработчик будет обрабатывать каждый элемент отдельно если его повесить на контейнер?

danik.js 17.03.2013 08:55

Цитата:

Сообщение от MininAS
С таблицей получится слишком грамостко

Да ладно. Дополнительный контейнер <tbody> + элементы <tr> на каждую строку.Хотя может таблица - и не лучший вариант.
Цитата:

Сообщение от MininAS
все что мы видим на экране это и есть картинки

Откройте для себя css.
Цитата:

Сообщение от MininAS
3. А обработчик будет обрабатывать каждый элемент отдельно если его повесить на контейнер?

В свойстве event.target будет ссылка на объект, на котором возникло событие.

rgl 18.03.2013 09:59

Цитата:

Сообщение от MininAS (Сообщение 241175)
2. С какой версии JS работает метод по созданию целого куска кода?

Попробовал, в IE6 работает.

MininAS 19.03.2013 00:30

Цитата:

Сообщение от danik.js (Сообщение 241201)
Да ладно. Дополнительный контейнер <tbody> + элементы <tr> на каждую строку.Хотя может таблица - и не лучший вариант.
Откройте для себя css.

Не могу понять ваше намерение применения таблицы, поясните подробнее.
CSS открыл как три года назад.


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