Lo que llamas "comportamiento por defecto", o sea: los aceleradores básicos de la UI del browser *no se pueden capturar* con JS. Algunas combinaciones de teclas son "propiedad" del browser - Ctrl+S (o Ctrl+G), para guardar, Ctrl+O para abrir, Ctrl+D para marcar la página, etc. Cada browser tiene combinaciones -posiblemente distintas- para algunas acciones de UI y estas combinaciones nunca se envían como mensajes de keystrokes al código JS. En resumen: puedes capturar la combinación de teclas que quieras, excepto las usadas por el browser. Y el problema es *peor aún*: algunos addons (plugins o extensiones del browser) pueden registrar aceleradores (así se llaman las combinaciones de teclas) para sí mismos. Por ejemplo, Firebug usa F10, F12, F11, y algunas más. Esos keystrokes no se pueden capturar desde JS. Sorry, tendrás que usar otras teclas para lo que deseas.

Una respuesta más completa: http://stackoverflow.com/questions/7295508/javascript-capture-browser-shortcuts-ctrlt-n-w

                                                Saludos
                                                           Lian

PS: Lo de más arriba es cierto "entre comillas": con Google Chrome se pueden abrir páginas en "application mode" - sin bordes, ni menú del browser, etc, de manera que parezcan apps nativas de escritorio. Esto lo usan mucho para las apps del Google Store, sobre todo para juegos. En este modo *sí* se puede capturar cualquier combinación de teclas. Nunca lo he probado, solo he leído que es posible.


El 10/12/13 14:13, juan.mej...@reduc.edu.cu escribió:
Hola. Tengo un problemilla con JavaScript y me preguntaba si alguien podia ayudarme con él. Estoy tratando de detectar eventos del teclado y ejecutar funciones para ellos. Por ejemplo, Control + S = guardar(), Control + N = nuevo(), etc. Hasta ahora logré detectar los eventos sin problema (evento onkeydown), pero necesito que si decido "escuchar" la combinación "Control + S" no ejecute el comportamiento por defecto, que es guardar la página. Probé a poner preventDefault(), pero nada de nada. Con jQuery sería fácil, pero pesa +50kb que no utilizo, por lo que incluirlo sería un lujo, es por eso que quiero usar JavaScript puro. Este es mi código:
<script type = "text/javascript">
    var keystrokes = [];

    var keystroke = function (key, callback) {
        this.key = key;
        this.callback = callback;
    }

    function handleKeyDown (e) {
        for (i in keystrokes) {
if(e.keyCode == keystrokes[i].key.charCodeAt(0) && e.ctrlKey) {
                keystrokes[i].callback.apply();
                if (e.stopPropagation) e.stopPropagation();
                if (e.preventDefault) e.preventDefault();
            }
        }
    }

    function listenEvent(eventTarget, eventType, eventHandler) {
        if (eventTarget.addEventListener) {
            eventTarget.addEventListener(eventType, eventHandler,false);
        } else if (eventTarget.attachEvent) {
            eventType = "on" + eventType;
            eventTarget.attachEvent(eventType, eventHandler);
        } else {
            eventTarget["on" + eventType] = eventHandler;
        }
    }

    function bind(key, callback) {
        keystrokes.push(new keystroke(key, callback));
    }

    listenEvent(document, "keydown", handleKeyDown);

    bind ("S", function () {alert("Se presionó S");});
    bind ("N", function () {alert("Se presionó N");});
</script>



______________________________________________________________________
Lista de correos del Grupo de Usuarios de Tecnologías Libres de Cuba.
Gutl-l@jovenclub.cu
https://listas.jovenclub.cu/cgi-bin/mailman/listinfo/gutl-l


--
Este mensaje ha sido analizado por MailScanner
en busca de virus y otros contenidos peligrosos,
y se considera que está limpio.

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: 
<http://listas.jovenclub.cu/pipermail/gutl-l/attachments/20131210/e8ebdf04/attachment.html>
______________________________________________________________________
Lista de correos del Grupo de Usuarios de Tecnologías Libres de Cuba.
Gutl-l@jovenclub.cu
https://listas.jovenclub.cu/cgi-bin/mailman/listinfo/gutl-l

Responder a