2011-01-25 2 views
1

Я написал фрагмент кода для клавиш «key key» и keyup для mozilla, но он не работает так, как я ожидаю. Код:Как работают addEventListener и attachEvent? Keydown и Keyup работают некорректно

<html> 
<head> 
<title>Testing Page</title> 
<script type="text/javascript"> 
var key_capslock = 0; 
var key_shift = 0; 

function print1(){ window.alert("shift status" + key_shift);} 
function print2(){ window.alert("shift status" + key_shift);} 
function keyset(evt){ 
    evt.preventDefault(); 
    if(evt.keyCode == 16){ 
    if(key_shift == 0){key_shift = 1; evt.stopPropagation();} 
    else {key_shift = 0; evt.stopPropagation();} 
    } 
print1(); 
return; 
} 
function keyrelease(evt){ 
    evt.preventDefault(); 
    if(evt.keyCode == 16){ 
     if(key_shift == 0){key_shift = 1; evt.stopPropagation();} 
     else {key_shift = 0; evt.stopPropagation();} 
    } 
print2(); 
return; 
} 

function init(){ 
document.body.setAttribute("contentEditable", true); 
document.body.addEventListener("keydown", keyset, false); 
document.body.addEventListener("keyup", keyrelease, false); 
} 
</script> 
</head> 
<body onload="init()"> 
<br> 
<body> 
</html> 

шаги: 1. Нажмите клавишу переключения (KeyDown и KeyUp события происходят). 2. Предупреждение поставляется со статусом переключения (запуск функции print1). Я нажимаю это. Ожидаемое: предупреждение должно иметь статус сдвига (функция print2 должна запускаться). Актуально: функция print2 не запускается.

Если я нажимаю клавишу сдвига второй раз, то функция print2 запускается. Я не понимаю, как работает функция addEventListener в mozilla. Может ли кто-нибудь помочь мне решить эту проблему? Я не хочу использовать стороннюю структуру для решения этой проблемы (jquery, dojo и т. Д.).

Благодаря

ответ

3

Ваш код на самом деле хорошо, но предупредительное сообщение принимает фокус из браузера, предотвращая его обнаружения keyup.

Если изменить функции записи в DIV, например, вы увидите, что обе функции работают:

http://jsfiddle.net/jtbowden/VqNvG/

Хотя я не понимаю, этот код:

if(key_shift == 0){key_shift = 1; evt.stopPropagation();} 
else {key_shift = 0; evt.stopPropagation();} 

Если вы в keyset, Key_Shift должен всегда быть 1, кажется, а не переключаясь:

function keyset(evt){ 
    evt.preventDefault(); 
    if(evt.keyCode == 16){ 
    key_shift = 1; 
    evt.stopPropagation(); 
    } 
    print1(); 
    return; 
} 
function keyrelease(evt){ 
    evt.preventDefault(); 
    if(evt.keyCode == 16){ 
     key_shift = 0; 
     evt.stopPropagation(); 
    } 
    print2(); 
    return; 
} 
Смежные вопросы