Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Помогите улучшить код (https://javascript.ru/forum/events/50936-pomogite-uluchshit-kod.html)

Mitrandir 17.10.2014 15:22

Помогите улучшить код
 
Приветствую всех!
Давненько я тут не бывал.

Итак, словесное описание задачи:
есть условная схема клавиатуры, сделанная с помощью HTML.
При нажатии на определенную клавишу должен меняться цвет рамки вокруг "клавиши" с синего на красный. Кусок разметки

<div class="keyboard">
<div class="keyboardRow"><span class="key" id="q">Q<sub>Й</sub></span>
    <span class="key" id="w">W<sub>Ц</sub></span>
    <span class="key" id="e">E<sub>У</sub></span>
    </div></div>


Говнокод на js, реализующий задачу в нулевом приближении
function checkKeyPress(e)
{ var KeyID = e.charCode;
  switch (KeyID){
  case 113: pkey = document.getElementById("q");
	        pkey.style.borderColor = "red";
 		    break; 
   case 119: pkey = document.getElementById("w");
             pkey.style.borderColor = "red";
                    break; }


Вопрос, как его улучшить и избавиться от развесистого кейса?

Использовать объекты? :blink:

ksa 17.10.2014 15:35

Цитата:

Сообщение от Mitrandir
как его улучшить и избавиться от развесистого кейса?

Например поменять ИДшники на

id='key_code_<его_код>'


Тогда можно сразу обратиться к элементу

pkey = document.getElementById('key_code_113');

Arramis 17.10.2014 15:38

Цитата:

Сообщение от Mitrandir (Сообщение 336219)
Вопрос, как его улучшить и избавиться от развесистого кейса?

Удобнее всего с помощью делегирования события.
Тоесть как то так:
document.querySelector('.keyboard').onkeypress = function(e) {
	var target = !e.target ? window.event.srcElement : e.target;

	if (target.className.indexOf('key') > -1) {
		target.style.borderColor = 'red';
	} else {
		//	some code
	}
}

Mitrandir 17.10.2014 17:57

Попробую так. Простота — это хорошо.

Mitrandir 17.10.2014 18:07

Немного не уловил идею.
Можно полный код :)

Mitrandir 17.10.2014 18:57

Уже додумал. Вопрос снимается.

Arramis 17.10.2014 19:06

Цитата:

Сообщение от Mitrandir (Сообщение 336247)
Немного не уловил идею.
Можно полный код :)

я прошу прощения, делегирование тут не нужно было

<div class="keyboard">
		<div class="keyboardRow">
			<span class="key" id="keycode_113">Q<sub>Й</sub></span>
			<span class="key" id="keycode_119">W<sub>Ц</sub></span>
			<span class="key" id="keycode_101">E<sub>У</sub></span>
		</div>
	</div>

	<script type='text/javascript'>
	document.onkeypress = function(e) {
		e = e || event;
		
		var keys = this.querySelectorAll('.key'),
				i = 0,
				keyCode = e.keyCode ? e.keyCode : e.charCode
		
		for ( ;i < keys.length; ++i ) {
			if (keys[i].id.indexOf(keyCode) > -1) {
				keys[i].style.border = '1px solid red';
				break;
			}
		}
	}
	</script>

Mitrandir 17.10.2014 20:14

Вот такой получился код

function checkKeyPress(e) { 
  var KeyID = String.fromCharCode(e.charCode).toLowerCase();
  document.getElementById(KeyID).style.backgroundColor = "red";
  }
  document.onkeypress = checkKeyPress;

function checkKeyReleased(e)
{ var KeyID = String.fromCharCode(e.keyCode).toLowerCase();
  document.getElementById(KeyID).style.backgroundColor = "white";
}
  document.onkeyup = checkKeyReleased;


Как его можно доработать так, чтобы обрабатывать хотя бы квадратные скобки и знаки препинания на английской раскладке?

Mitrandir 17.10.2014 20:16

Спасибо. Завтра покручу.
А то я пошел другим путём ;)

Mitrandir 17.10.2014 20:47

Скажите, а как возможно обработать onkeyup, чтобы при отпускании клавиши возвращался прежний ( или же заданный) цвет рамки/фона?


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