Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.08.2012, 21:37
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

Перебираем массив
Хотел бы, чтоб посмотрели и сказали что правильно, а что нет (я новичок).

Нужно было перебрать массив с элементами и при событии нажатия клавиши открывать один из них и скрывать все остальные.

Вот что получилось:


<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>скрипт</title>
<script>
function openElement(id) {
	var idE = document.getElementById(id);
	var clE = document.getElementsByClassName("options");
	var elem, activeElement;
	
	for(var i = 0, len = clE.length; i < len; i += 1) {
		elem = clE[i].style.display;
		activeElement = clE[i];
		if ( elem == "block" ) break;
	}
	
	if ( elem == "block" ) {
		if ( idE.style.display == "block" ) {
			idE.style.display = "none";
		}
		else {
			activeElement.style.display = "none";
			idE.style.display = "block";
		}
	}
	else {
		idE.style.display = "block";
	}
}

function keyControl(event) {
	if (event.keyCode == 81) openElement("d1");       // Функция при нажатии q
	if (event.keyCode == 87) openElement("d2");       // Функция при нажатии w
	if (event.keyCode == 69) openElement("d3");       // Функция при нажатии e
	if (event.keyCode == 82) openElement("d4");       // Функция при нажатии r
}

window.addEventListener("keydown", keyControl, false);

</script>
</head>
<body>
<div class="options" id="d1" style="display:none; width:50px; height:50px; position:absolute; left:0px; background:red;"></div>
<div class="options" id="d2" style="display:none; width:50px; height:50px; position:absolute; left:50px; background:green;"></div>
<div class="options" id="d3" style="display:none; width:50px; height:50px; position:absolute; left:100px; background:blue;"></div>
<div class="options" id="d4" style="display:none; width:50px; height:50px; position:absolute; left:150px; background:black;"></div>
<span style="position:absolute; top:60px;">Нажми Q, W, E или R</span>
</body>
</html>

Последний раз редактировалось dmitry111, 22.08.2012 в 09:29.
Ответить с цитированием
  #2 (permalink)  
Старый 21.08.2012, 21:42
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

чтобы заработало, сделайте окно просмотра активным
Ответить с цитированием
  #3 (permalink)  
Старый 21.08.2012, 21:58
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

Дзен-трансгуманист,
по идее да - посмотри на строки
8
13
18 - 20
Ответить с цитированием
  #4 (permalink)  
Старый 21.08.2012, 22:16
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Можно через запоминание предыдущего элемента (впрочем Дзен-трансгуманист об этом упомянул)
<div class="options" id="q" style="display:none; width:50px; height:50px; position:absolute; left:0px; background:red;"></div>
<div class="options" id="w" style="display:none; width:50px; height:50px; position:absolute; left:50px; background:green;"></div>
<div class="options" id="e" style="display:none; width:50px; height:50px; position:absolute; left:100px; background:blue;"></div>
<div class="options" id="r" style="display:none; width:50px; height:50px; position:absolute; left:150px; background:black;"></div>
<span style="position:absolute; top:60px;">Нажми Q, W, E или R</span>

<script>
window.onload = function () {

	function hide(id) {
		document.getElementById(id).style.display = 'none';
	}
	
	function show(id) {
		document.getElementById(id).style.display = 'block';
	}
	
	var curId = 'q';
	
	document.body.onkeyup = function (e) {
		e = e || event;
		switch (e.keyCode) {
			case 81: {
				hide(curId);
				show('q');
				curId = 'q';
				break;
			}
			case 87: {
				hide(curId);
				show('w');
				curId = 'w';
				break;
			}
			case 69: {
				hide(curId);
				show('e');
				curId = 'e';
				break;
			}
			case 82: {
				hide(curId);
				show('r');
				curId = 'r';
				break;
			}
		}
	}

}
</script>


PS:
Сообщение от Дзен-трансгуманист
При том функция addEventListener некроссбраузерная.
как и getElementsByClassName

Последний раз редактировалось bes, 21.08.2012 в 22:21.
Ответить с цитированием
  #5 (permalink)  
Старый 21.08.2012, 23:06
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

Спасибо..

Про кроссбраузерность - учту.

А вот еще такой вопрос:

Есть элементы, доступные только по тегу

var a = document.getElementsByTagName("div");
a[0].style.display = "block";
a[1].style.display = "block";
a[2].style.display = "block";
a[3].style.display = "block";


Возможно ли совершить над ними действие, не обращаясь к каждому индивидуально?

В jQuery возможно сделать так:

$("div").css("display", "block");


А на чистом js?
Ответить с цитированием
  #6 (permalink)  
Старый 21.08.2012, 23:27
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

или только через for возможно?

var div = document.getElementByTagName("div");
for(var i = 0, len = div.length; i < len; i += 1) {
    div[i].style.display = "block";
Ответить с цитированием
  #7 (permalink)  
Старый 21.08.2012, 23:35
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

dmitry111,
Проще делать через css
добавляя класс active к активному ( для которого которого указание в css стиле - display:block!important;
всем элементам присваиваем класс - elem - который по умолчанию
display:none;

тогда переставляя класс - достаточно просто скрывать все кроме текущего, т.е активный элемент будет с двумя классами .elem.active
Ответить с цитированием
  #8 (permalink)  
Старый 21.08.2012, 23:42
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

Deff,

это тоже вариант!
Спасибо!
Ответить с цитированием
  #9 (permalink)  
Старый 22.08.2012, 09:28
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

В самом верхнем коде обнаружил ошибку в 18-ой строчке.
Из-за нее конструкция через некоторое время не срабатывала в firefox, opera.
Вместо:
if ( elem ) {

Надо
if ( elem == "block" ) {
Ответить с цитированием
  #10 (permalink)  
Старый 22.08.2012, 10:36
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

А для чего вот это:
this.state = false;


это как-то связано с историей?
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возможно ли как-то структурировать массив match? dump Общие вопросы Javascript 1 29.07.2012 12:19
Создать массив не содержащие данные другого масива KamalovRadik Общие вопросы Javascript 1 05.09.2011 03:30
Массив объектов или объект объектов vladlen Общие вопросы Javascript 19 30.10.2010 03:10
Как создать многомерный массив FRIE Общие вопросы Javascript 29 02.06.2010 19:14
Подскажите, как вернуть js-скрипт массив Polkan AJAX и COMET 18 30.04.2010 23:30