Detectar el teclado virtual vs teclado de hardware


He estado pensando en esto desde hace un tiempo, y no puedo encontrar una manera de lidiar con ello. ¿Hay alguna forma de detectar si el usuario utiliza un teclado virtual (software) o un teclado tradicional (hardware)?

La nueva superficie de Windows tiene su propio teclado en la cubierta, y para Android / iPad hay un montón de diferentes teclados bluetooth.

Entonces, ¿alguno de ustedes tiene alguna opinión sobre esto?
Estoy apuntando a Android, IOS y Windows Tablet/Teléfono.


Motivación: (muy subjetivo)

Al desarrollar aplicaciones web para tabletas/teléfonos inteligentes, he llegado a la comprensión de que es más fácil, en muchas situaciones, usar un teclado JavaScript en lugar del teclado de software del sistema operativo.

Digamos que desea ingresar un código PIN. En lugar de tener un teclado llenando la mitad de la pantalla:

Teclado de software (OS):

|----------------|
|    [ input]    |
|                |
|----------------|
|  1  2  3  4  5 |
|  6  7  8  9  0 |
|----------------|

Teclado JavaScript:

|----------------|
|    [ input]    |
|    | 1 2 3|    |
|    | 4 5 6|    |
|    |_7_8_9|    |
|                |
|                |
|----------------|

Si es necesario manejar una gran cantidad de entradas, tal vez desee hacer una superposición div con las entradas y utilizar el teclado del software:

|----------------|
| P1 P2    P3 P4 |
| [inp 1][inp 2] |
|----------------|
|    KEYBOARD    |
|                |
|----------------|

Pero si el usuario tiene su propio teclado de hardware, queremos hacer la edición en línea en su lugar.


He estado mirando a su alrededor y encontré este post: Aplicación Web para iPad: ¿Detectar el teclado virtual usando JavaScript en Safari? ... pero esto parece que solo funciona en IOS, no estoy seguro sobre el navegador.

Author: Community, 2012-11-07

6 answers

No creo que reemplazar el teclado en pantalla predeterminado sea una buena idea, y recomendaría ir con lo que Jani sugirió: los teclados virtuales también se adaptan.

Pero estoy seguro de que es posible detectar la mayoría de los teclados con el evento resize emparejado con focus on the field o monitorizando window.innerHeight (o algún otro [a-z]*Height) y comparando el valor antes y después del field focus.

Este es un caso extraño de detección de características, por lo que necesitará mucha experimentación. No lo haría si estuviera usted.

 7
Author: naugtur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-15 21:48:50

Creo que el mejor enfoque sería combinar atributos de formulario HTML5 con un enlace opcional de teclado virtual.

Los atributos de formulario HTML5 se pueden usar para activar diferentes tipos de teclados. Por ejemplo, <input type="email">, <input type="number"> y <input type="tel"> activará los tipos de teclado apropiados en iOS (no estoy seguro sobre Android/WinPho/otros, pero me imagino que hace lo mismo), lo que permite al usuario ingresar los datos más fácilmente.

Si lo desea, también puede ofrecer un botón para activar una costumbre teclado numérico en el campo de texto para navegadores móviles antiguos que no cumplen con HTML5. Estos mostrarán los nuevos campos HTML5 como campos de texto estándar.

Puede usar el sniffing del navegador para detectar navegadores móviles, pero no olvide que todavía pueden soportar cosas como teclados bluetooth. Olfatear, además, tiene el problema de que es casi seguro que se pierda algunos navegadores, y detectar incorrectamente otros, por lo que no debe confiar en él únicamente.

 19
Author: Jani Hartikainen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-12 08:02:13

Puede que no esté detectando el teclado. Pero intentaría detectar si el usuario está en un navegador móvil. Dado que los dispositivos que tienen teclados virtuales nativos se ejecutan casi unánimemente en los navegadores móviles.

Aquí hay un pequeño script que utiliza jquery

Si no son móviles, presenta tu campo de entrada estándar.

Si son móviles no muestran el campo de entrada (por lo que no obtienen el teclado virtual), en su lugar tienen un campo oculto o una lista que se actualiza con jquery cuando hacen clic en los botones de su pinpad.

 1
Author: Malkus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-12 01:07:13

WURFL es un framework de servidor que te ofrece mucha información sobre las capacidades del dispositivo solicitante. Con wurfel en su lugar, su aplicación podrá servir a los diversos dispositivos / grupos de dispositivos con salida/marcado optimizado.

Uno de los escenarios más simples sería distiguish entre escritorios, mesas y teléfonos inteligentes.

La base de datos (archivo xml) se actualiza regularmente y las api oficiales están disponibles para java, php y. net

 1
Author: Lukas Winzenried,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-18 12:52:39

Me encontré con una nueva pregunta el otro día y una gran respuesta que puede ayudar con su problema de teclado.

Tiempo de espera en jquery hover (touch)

Esencialmente utiliza una función jQuery que devuelve un booleano si fue capaz de crear un evento táctil.

$(document).ready(function() {

    function hasTouch() {
        try {
           document.createEvent("TouchEvent");
           return true;
        } catch (e) {
           return false;
        }    
    }

    var touchPresent = hasTouch();
});
 1
Author: Malkus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:22

La solución más bullet prof que funciona en Chrome / Safari, etc.. y tanto en Android como en iOS a partir del 20-nov-2017 será detectar un cambio en la altura de un div que tiene un vh unidades de altura (altura de la ventana)

Luego, en cualquier cambio de desenfoque/enfoque de un área de entrada/texto, verifique si ese div ahora tiene una altura de 30% menos (en píxeles) de la que solía tener antes de ese evento de desenfoque/enfoque.

CSS:

#height-div{height: 10vh;}

JQuery:

$(document).ready(function() {
    var initialHeight = $("#height-div").height();//gives current height in pixels! We save it for later comparisons 
}

Ahora, aquí está la magia:

$("input, textarea").focus(function(){
        setTimeout(function(){
            if((initialHeight*0.7) > $("#height-div").height()){//if the current viewport height is smaller than 70% of the original size, it means that the keyboard is up
                //ENTER YOUR LOGIC HERE
            }else if((initialHeight*0.7) < parent.$submit.height()){//if the current viewport height is larger than 70% of the original size, it means that the keyboard is down
            //ENTER YOUR LOGIC HERE
            }
        },500);
});

$("input, textarea").blur(function(){
        setTimeout(function(){
            if((initialHeight*0.7) > $("#height-div").height()){//if the current viewport height is smaller than 70% of the original size, it means that the keyboard is up
                //ENTER YOUR LOGIC HERE
            }else if((initialHeight*0.7) < parent.$submit.height()){//if the current viewport height is larger than 70% of the original size, it means that the keyboard is down
            //ENTER YOUR LOGIC HERE
            }
        },500);
});
 0
Author: TBE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-20 17:09:58