2009-03-10 7 views
3

Ce qui suit fonctionne bien sur IE6, IE7 et chrome. Ne fonctionne pas sur ff 3.0.7.prototype/javascript - firefox ne déclenche pas l'événement keypress/keydown sauf si le focus est dans la zone de texte

<html><head> 
<script src="prototype.js" type="text/javascript" ></script> 
<script type="text/javascript"> 
Event.observe(window, 'load', 
    function(){ 
     Event.observe(document.body, 'keydown', myEventHandler); 
     alert('window load'); 
    }); 
function myEventHandler(evt) { 
    alert(evt); 
} 
</script> 
</head> 
<body > 
<input type="text" /><br><br> 
</body></html> 

EDIT: Par "ne fonctionne pas" je veux dire myEventHandler ne tire pas dans firefox.

EDIT2: En outre, il fonctionne correctement lorsque le focus est sur l'élément d'entrée. Je veux le feu pour tous les keydowns. Essayez d'envelopper l'entrée avec un élément de formulaire.

Répondre

7

Je ne sais pas pourquoi votre code ne fonctionne pas, mais il est trop compliqué - cela devrait faire l'affaire:

document.observe('keydown', myEventHandler); 

Il n'y a pas besoin d'attendre load comme document est disponible immédiatement.


Votre code ne fonctionne pas car tous les événements clés ne proviennent pas de l'élément de corps d'un document. Opera a des problèmes similaires à ceux de Firefox, mais l'élément d'origine semble également dépendre du placement du curseur de la souris. Quoi qu'il en soit, le correctif consiste simplement à attraper les événements au niveau document, car tant que personne ne les arrête, tous les événements DOM vont finalement atteindre document.

+0

Merci, je ne savais pas que vous pouviez le faire de cette façon. Je viens de $ ('id'). Observer ('keypress', fonction (t) {if (e.keyCode == 13) {getTypes()}}); faire pousser en entrant exécuter une fonction sur ma zone de texte. – hamstar

0

Si cela ne vous aide pas, déformez-le dans une div et attachez votre gestionnaire à la div.

+0

Emballage sous une forme non modifiée. Envelopper dans un div et attacher le gestionnaire à la div a brisé IE et Chrome sans fixation FF. Notez que je souhaite que le gestionnaire d'événements se déclenche, que l'élément d'entrée soit actif ou non. – Chloraphil

3

J'ai également constaté que mes événements de keydown ne tiraient pas dans Firefox pour le code semblable. Dans mon cas, je n'ai pas besoin d'utiliser autre chose que Safari et Firefox, donc je n'ai pas testé cela sur IE. Néanmoins, l'observation 'document' plutôt que 'document.body' semblait fonctionner:

document.observe('dom:loaded', function() { 
    Event.observe(document, 'keypress', function(evt) { 
     alert("In Keypress Function"); 
    }); 
}); 

Maintenant, je me rends compte ce observe keypress, pas KEYDOWN. AFAIK, keypress est généré juste après le clavier.

0

btw, pour tabulation, esc et similaire, vous devez utiliser le bouton, pas appuyer sur une touche. Au moins pour Safari, il m'a fallu du temps pour m'en rendre compte.

Voyez par vous-même en ajoutant cette ligne: alert ("Key :" + evt.keyCode); dans l'anon. fonction. Seuls les glyphes répondent.

--Dave

Questions connexes