2016-09-01 4 views
0

Я пытаюсь написать сценарий, который перемещает оранжевую рамку внутри синего квадрата с помощью клавиш со стрелками и Javascript eventlistener. Когда я запускаю страницу, ничего не происходит. Я пробовал курить в консоли, но это не дает мне никакого вывода. Я уверен, что мне не хватает чего-то маленького, но я не могу, чтобы жизнь меня поняла. Любые предложения были бы замечательными!Почему не работает javascript addEventListener?

var orange = document.getElementById("orange"); 
 
orange.addEventListener("onkeydown", move, false); 
 
function move(e); 
 
    \t \t \t 
 
e = e || window.event; 
 
    
 
    if(e.keyCode == '38'){ //up 
 
    \t if(parseInt(orange.style.top) > '0'){ 
 
    \t \t orange.style.top = parseInt(orange.style.top) - 5; 
 
    \t } 
 
    } else if (e.keyCode == '40'){ //down 
 
    \t if(parseInt(orange.style.top) < '425'){ 
 
    \t \t orange.style.top = parseInt(orange.style.top) + 5; 
 
    \t } 
 
    } else if (e.keyCode == '37'){ //left 
 
    \t if(parseInt(orange.style.top) > '0'){ 
 
    \t \t orange.style.left = parseInt(orange.style.left) - 5; 
 
    \t } 
 
    } else if (e.keyCode == '39') { //right 
 
    \t if(parseInt(orange.style.left) < '425') { 
 
    \t \t orange.style.left = parseInt(orange.style.left) + 5; 
 
    \t }  
 
    } 
 
} 
 
    \t
#blue{ 
 
    background-color: blue; 
 
    position: relative; 
 
    height: 500px; 
 
    width: 500px 
 
} 
 
#orange{ 
 
    background-color: orange; 
 
    position: absolute; 
 
    width: 75px; 
 
    height: 75px; 
 
};
<div id="blue"> 
 
    <div id ="orange" style="left: 30px; top:30px;"></div> 
 
</div> 
 

+0

FYI, 'е = е || window.event; 'не нужно. Вы используете исправление, которое не имеет смысла внутри обработчика 'addEventListener'. –

ответ

1

У вас есть несколько проблем:

1) событие keydown не onkeydown (если вы не добавляете непосредственно к объекту (например, orange.onkeydown)

2) Верх измеряется в пикселях, а не только в целочисленном размере - вам нужно добавить + 'px' в свои верхние изменения: orange.style.top = parseInt(orange.style.top) + 5 + 'px'

Другие ноты:

  • может работать лучше, чтобы иметь слушателя событий на окне, как это будет иметь фокус, ИДК, хотя - не проверять.
  • e.keyCode это число, а не строка
  • , как @bmceldowney упоминалось, у вас есть ошибка синтаксиса в вашем объявлении функции

Рабочая версия кода: https://jsfiddle.net/kkhkL065/

+1

Да. У div вряд ли будет фокус, поэтому он не получит событие keydown. Элементы пользовательского интерфейса, такие как входные и текстовые поля, могут принимать события блокировки. Прослушивание в документе или окне я предпочитал, потому что событие все равно пузырится, независимо от того, какая часть страницы имеет фокус. – slebetman

+0

Спасибо! Я внес изменения, которые вы и @slebetman предложили, и он работает отлично. – jayShepard

1

Вы должны получить сообщение о синтаксической ошибке в консоли, потому что вы не объявляете о move функции правильно.

function move(e); 

    e = e || window.event; 

должен выглядеть следующим образом:

function move(e) { 

     e = e || window.event; 
+0

Хорошо, я изменил его, но это не помогло. – jayShepard

+0

Это лишь часть его, вы не можете связать его с этим div, если нажатие клавиши не связано с ним. Вот возможное решение: http://stackoverflow.com/questions/2878983/capture-key-press-without-placing-an-input-element-on-the-page –

0

Как указано в this documentation page по Mozilla, Возможные цели keydown Событие (не onkeydown как ошибочно написано в вашем коде)

Сфокусированного элемент обработки ключа события, корневой элемент, если нет подходящего входного элемента не будет сфокусирован

Так в основном только входа (<input> и <textarea>) или корневых элементов (документ или окно) может обрабатывать событие.

Измените код следующим образом:

var orange = document.getElementById("orange"); 
var move = function(e){ 
    orange.classList.add("red"); 
} 
window.addEventListener("keydown", move, false); 

Вот ссылка на JSFiddle: https://jsfiddle.net/nbj0Lujw/

Надеется, что это помогает :)

+0

Я никогда не слышал о JSFiddle, похоже, что это будет действительно полезно! – jayShepard

+0

Это действительно полезно, когда вам нужно что-то проверить, изолируя его от остальной части вашей кодовой базы :) попробуйте также codepen.io;) – Danny