2010-12-07 37 views
3

J'essaie d'écrire un petit script greasemonkey/bookmarklet/qu'avez-vous pour Google Docs. La fonctionnalité que j'aimerais ajouter nécessite un gestionnaire d'événement keypress/keyup/keydown (l'un de ces trois). Malheureusement, Javascript n'est pas mon forté, et je n'arrive pas à capturer (?) Un événement keypress dans le volet d'édition. En dernier recours, je l'ai essayé ce qui suit:Capturer la touche en Javascript (Google Docs)

javascript:(function(){ 
    els = document.getElementsByTagName("*"); 
    for(i=0;i<els.length;i++){ 
    els[i].onkeypress=function(){alert("hello!");}; 
    els[i].onkeyup=function(){alert("hello2!");}; 
    els[i].onkeydown=function(){alert("hello3!");}; 
    } 
})(); 

Cependant, cela ne fonctionne toujours pas capturer dans le volet appui sur les touches d'édition - aucune alerte agaçants (bien qu'il semble fonctionner pour la plupart d'autres sites ...) . J'ai vérifié dans Chrome et Firefox tous les deux (je ne peux pas l'obtenir pour travailler dans l'un ou l'autre).

J'ai essayé "Log Events" dans Firebug (et vérifié tous les événements enregistrés via une petite extension de Firebug, Eventbug); il ne semblait pas que ces événements tiraient sur les touches.

Edit:
Pour clarifier [Tim], je fait ce screenshot avec quelques annotations ... screenshot

Le je parle "panneau d'édition" au sujet semble être un tas de divs Javascripted-up afficher ce que je tape.

Des idées? Merci!

+0

Que voulez-vous dire par « volet d'édition »? Est-ce un iframe? Une zone de texte? –

+0

@Jacob veuillez vérifier votre compte email de profil. – Will

Répondre

3

La modification dans Google Documents utilise une iframe. Vous devez attacher un écouteur au document iframe. Il semble faire quelque chose de compliqué avec le iframe, je ne l'ai pas encore été en mesure de travailler pleinement, mais ce qui suit semble fonctionner pour Firefox:

var iframe = document.getElementsByTagName("iframe")[0]; 
if (iframe) { 
    iframe.contentDocument.addEventListener("keypress", function(evt) { 
     console.log("iframe keypress: " + evt.which); 
    }, false); 
} 
+0

Ah, je n'y avais pas pensé et c'est exactement ce que je voulais - merci! – Jacob

0

Cela semble fonctionner pour moi ... mais j'utilise jQuery $ (document) .ready() pour m'assurer que ma page est chargée avant d'attacher n'importe quel événement. Je pense que vous pouvez le faire en javascript nu avec:

window.onload = function() 
{ 
    els = document.getElementsByTagName("*"); 
    for(i=0;i<els.length;i++) { 
    els[i].onkeypress=function(){alert("hello!");}; 
    } 
} 

D'ailleurs vous ne pouvez pas attacher plus d'une fonction à l'événement:

for(i=0;i<els.length;i++){ 
    els[i].onkeypress=function(){alert("hello!");}; 
    els[i].onkeypress=function(){alert("hello2!");}; 
    els[i].onkeypress=function(){alert("hello3!");}; 
} 

L'élément n'enregistre que le dernier (il remplace la fonction précédente), dans ce cas "alert (" hello3! ");"

+0

Oups, c'était une faute de frappe (je vais le réparer ci-dessus), merci! J'ai essayé tous les trois de "onkeypress", "onkeyup" et "onkeydown" en vain. – Jacob

0

Vous n'avez pas besoin d'attacher l'écouteur à tous les éléments de la page. Pour l'attacher au document est suffisant.

window.addEventListener('load', function() { 
    document.addEventListener('keypress', function() { alert("hello!"); }); 
} 

Comme il est un script Greasemonkey vous n'avez pas à vous soucier de IE et peut utiliser la méthode addEventListener.

+0

Oui, c'est ce que j'ai essayé en premier ... Mon problème semble spécifique à Google Docs. Le code ci-dessus fonctionne correctement sur tout autre site, mais pas sur Google Docs lors de la modification d'un document. Est-ce que cela fonctionne pour vous dans ce cas? – Jacob

+0

Je pense qu'ils arrêtent l'événement pour l'exécution ultérieure de leur gestionnaire d'événements. Je n'ai pas réussi à le faire fonctionner moi-même. Je pense que vous devez supprimer leur écouteur d'événement et l'appeler manuellement. Vous pouvez essayer de jeter un oeil à la bibliothèque de fermeture js qu'ils utilisent. –