2011-10-27 3 views
0

J'utilise un contrôle tiers (Aspose.Cells.GridWeb). Il s'agit essentiellement d'un contrôle Excel basé sur le Web. Lorsqu'un utilisateur sélectionne une cellule, l'événement onCellSelected est déclenché par le contrôle. Le fait est que j'ai besoin de savoir quelle touche a été pressée par l'utilisateur pour provoquer l'élévation de cet évènement. J'ai besoin de cette information pour déterminer comment gérer l'événement. J'utilise l'événement keydown de JQuery pour capturer le bouton cliqué.Quand l'événement JQuery keydown est-il levé?

$(document).keydown(function(event) { 
     isKeyLastClicked = true; 
     keyLastClickedId = event.which; 
     isMouseButtonLastClicked = false; 
     mouseButtonLastClickedId = null; 
    }); 

Le problème est que l'événement onCellSelected du contrôle est déclenché AVANT que l'événement keydown ne soit déclenché. Est-ce que ce comportement est attendu?

Est-il possible d'obtenir l'ID de la clé avant que l'événement du contrôle ne soit déclenché?

Merci d'avance.

Répondre

1

Après une longue discussion au SO de chat ...
Depuis liant l'événement keydown ne produit pas les résultats escomptés, vous devez modifier la fonction onCellSelected. Il devrait suivre le motif suivant:

  1. Lorsque onCellSelected est déclenché pour la première fois, le premier argument (cell) est affecté à une variable (temporaire).
  2. Ensuite, lorsqu'un événement keydown se produit, le code de la clé est vérifiée:
    • Si la touche pressée (ev.which ou ev.keyCode) est égale à une certaine touche, la fonction onCellSelected est appelée à nouveau, en passant la valeur de la variable temporaire un premier argument.
    • Sinon, la variable temporaire est effacée, car cela n'a aucun sens de s'en souvenir.

Le code aurait la structure suivante.Modifier en fonction de votre application:

var lastCell = null; 
function onCellSelected (cell) { 
    if(lastCell == null) { 
     lastCell = cell; 
     return; //Wait for the next listener 
    } 
    ... //Rest of code 
} 

$(document).keydown(function(e){ 
    if(lastCell == null) return; //No need to do unnecessary calculations 
    //Whatever you want, example: 
    if(e.keyCode == 32) { 
     onCellSelected(lastCell); 
     lastCell = null; //Reset 
    } 
    ... //Rest of code 
}); 

Note: keyCode, charCode et which, voir aussi: http://asquare.net/javascript/tests/KeyCode.html

0

Je ne suis toujours pas sûr de savoir comment déclencher l'événement keydown en premier (ou même si c'est possible). Mais, j'ai découvert que vous pouvez accéder au dernier événement Windows à tout moment. Donc, au lieu de compter sur l'événement pour définir les variables comme indiqué dans ma question initiale ci-dessus, j'accède simplement window.event.type.

Voici quelques exemples de code: montrant comment utiliser window.event:

if (window.event.type == "keydown") { //keyboard click 
    if (IsKeyNextType(window.event.which)) { //checks which key was pressed. In this case a key qualifying as "Next" (ie: Enter, Tab, etc) 
      //PERFORM NEXT ACTIONS 
    } 
    else { //"Previous" keys (ie: Up arrow, Left arrow) 
      //PERFORM PREVIOUS ACTIONS 
    } 
} 
else if (window.event.type == "click") { //mouse click 
    //PERFORM MOUSE CLICK ACTIONS 
} 
+0

'window.event' est une caractéristique non standard IE uniquement. –

+0

@RobW: Etes-vous sûr? Cela fonctionne très bien dans Chrome. Quels sont les événements équivalents dans d'autres navigateurs? –

+0

L'objet événement a du sens dans le contexte d'un écouteur d'événement. Lorsqu'un écouteur d'événement est déclenché, le premier argument de la fonction est l'objet événement. 'window.event' est au moins pas pris en charge dans Firefox. –

0

Ajouter dépend de l'ordre de votre code.

Le premier élément du code sera exécuté en premier.

Il est également préférable d'utiliser des rappels au lieu de deux fonctions distinctes (qui peuvent être volatiles).