4 votes

Empêcher le comportement par défaut des Key Listeners dans YUI

J'ai une page web sur laquelle j'aimerais modifier le comportement de Ctrl+N. J'ai suivi l'exemple de YUI d'enregistrer des Key Listeners et ma fonction est appelée mais Firefox crée toujours une nouvelle fenêtre de navigation. Les choses semblent fonctionner correctement sur IE7. Comment empêcher la nouvelle fenêtre de s'afficher ?

Exemple :

var kl2 = new YAHOO.util.KeyListener(document, { ctrl:true, keys:78 },
             {fn:function(event) {
                     YAHOO.util.Event.stopEvent(event); // Doesn't help
                     alert('Click');}});
kl2.enable();

Il est possible de supprimer le comportement par défaut. Google Docs utilise Ctrl+S pour enregistrer votre document au lieu de faire apparaître la boîte de dialogue d'enregistrement de Firefox. J'ai essayé l'exemple ci-dessus avec Ctrl+S mais la boîte de dialogue d'enregistrement de Firefox apparaît toujours. Puisque Google peut empêcher l'apparition de la boîte de dialogue d'enregistrement, je suis sûr qu'il existe un moyen d'empêcher la plupart des raccourcis clavier par défaut.

7voto

Tac-Tics Points 1558

Le problème, c'est que la fonction "fn" est mal foutue.

Expérimentalement, vous pouvez constater que le type de fonction pour fn prend deux paramètres. Le premier paramètre contient en fait le TYPE d'événement. Le second paramètre contient... et c'est bizarre : un tableau contenant le point de code à l'index 0 et l'objet événement réel à l'index 1.

En modifiant un peu votre code, vous obtenez devrait ressemble à ceci :

function callback(type, args)
{
    var event = args[1]; // the actual event object
    alert('Click');

    // like stopEvent, but the event still propogates to other YUI handlers
    YAHOO.util.Event.preventDefault(event);
}
var kl2 = new YAHOO.util.KeyListener(document, { ctrl:true, keys:78 }, {fn:callback});
kl2.enable();

De plus, pour l'amour de Lisp, n'utilisez pas de points de code bruts dans votre code. Utilisez 'N'.charCodeAt(0) au lieu de "78". Ou bien intégrez-le dans une fonction

function ord(char)
{
    return char.charCodeAt(0);
}

0voto

Gene Points 1222

Je ne fais que deviner, mais je ne pense pas que ce soit possible.

Si c'est possible, cela ne devrait certainement pas être le cas. Les raccourcis clavier génériques sont une chose avec laquelle il ne faut pas jouer. Que faire ensuite ? Accrocher le bouton de fermeture de la fenêtre pour ouvrir une nouvelle fenêtre...

0voto

Stuart Grimshaw Points 590

En utilisant l'utilitaire d'événements de YUI, vous pourriez essayer d'utiliser la fonction stopEvent méthode :

Cependant, comme la plupart des utilisateurs sont habitués à ce que ces touches fassent une chose particulière dans le navigateur (nouvelle fenêtre dans votre exemple), j'évite toujours les collisions, ce qui signifie en fait que je n'utilise aucune des touches méta ou de contrôle.

J'utilise simplement les lettres, seules, ce qui est très bien jusqu'à ce que vous ayez des zones de saisie de texte, de sorte que ce conseil pourrait vous être moins utile.

0voto

Bien qu'il ne soit pas trivial de remplacer les raccourcis par défaut du navigateur, dans certains cas, cela vaut la peine de le faire car cela donne un aspect plus professionnel à l'application. Jetez un coup d'œil à ce script :

http://www.openjs.com/scripts/events/keyboard_shortcuts/index.php#disable_in_input

Il s'avère que cela fonctionne bien pour moi

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X