2011-11-23 17 views
10

Tengo una aplicación HTML5/Javascript (Sencha) que he empaquetado en PhoneGap para iOS en XCode. De una forma u otra, quiero poder escuchar los eventos de apertura/cierre del teclado y hacer algo en consecuencia. ¿Hay alguna manera de hacer esto?¿Cómo se escucha el teclado abrir/cerrar en Javascript/Sencha?

+0

El teclado se invocará automáticamente mientras se está enfocando el campo de texto, textareafield .... Entonces puede crear oyente para el evento de enfoque en javascript. – heyjii

+0

Entonces, también quiero escuchar cuándo los campos de texto, etc. pierden enfoque, ¿hay algún evento para eso? – Groppe

+0

Creo que puedes usar el desenfoque – heyjii

Respuesta

8

El teclado se invocará automáticamente mientras se está enfocando el campo de texto, textareafield .... Por lo tanto, puede crear un detector para el evento focus en javascript que es similar a escuchar el evento abierto de teclado. También puede usar el oyente de desenfoque para manejar el teclado cerca.

Gracias.

+0

Estoy usando esto para setfocus. inpMessage.fieldEl.dom.focus(); funciona bien en Chrome, no en el dispositivo. –

+0

tenga en cuenta que esto se disparará antes de que el teclado se haya abierto, por lo que puede ser demasiado pronto si necesita hacer ajustes de posicionamiento/diseño –

+5

Necesita hacer más pruebas antes de publicar sus respuestas. Cuando toca el botón Atrás del teclado del dispositivo Android, se ocultará, pero no activará el desenfoque. – filipvkovic

1

Por lo que puedo ver, esto solo es posible en las versiones de Android para PhoneGap, consulte la solicitud de extracción aquí: https://github.com/phonegap/phonegap-android/issues/94.

Los eventos se llaman hidekeyboard y showkeyboard. Puede comprobar si también se activan en iOS.

10

que he encontrado el mismo problema, y ​​creo que la mejor solución en su caso es utilizar un plugin PhoneGap que se unirá a los eventos nativos, como éste:

https://github.com/driftyco/ionic-plugins-keyboard/tree/60b803617af49a10aff831099db90340e5bb654c

Funciona muy bien en Android y el iOS de la misma manera, simplemente enlazar esos eventos:

window.addEventListener('native.showkeyboard', keyboardShowHandler); 

window.addEventListener('native.hidekeyboard', keyboardHideHandler); 
+0

Esto es lo único que funcionó. Gracias. –

2

Activación estado abierto es fácil usando onclick o evento onfocus, pero en el cierre de teclado onBlur evento no se dispara (porque cursor permanece en la entrada/área de texto) . Así que encontré la solución detectando la altura de la ventana que se modificó significativamente en el teclado de abrir/cerrar.

Está funcionando en los navegadores modernos en Android y iOS también. Demostración: http://jsfiddle.net/qu1ssabq/3/

Si es necesario, puede mejorar mi código para dispositivos que no son compatibles con addEventListener o innerHeight: hay alternativas disponibles en Internet.

<!doctype html> 
<html> 
<head> 
<meta charset="utf-8"> 
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0, minimal-ui"> 
<title>Detect keyboard opened/closed event</title> 
</head> 
<body> 

<textarea id="txta" onclick="xfocus()" onblur="xblur()"></textarea><br> 

<span id="status" style="background: yellow; width: auto;">closed</span> 

<script type="text/javascript"> 
    function xfocus() { 
    setTimeout(function() { 
     height_old = window.innerHeight; 
     window.addEventListener('resize', xresize); 
     document.getElementById('status').innerHTML = 'opened'; // do something instead this 
    }, 500); 
    } 
    function xresize() { 
    height_new = window.innerHeight; 
    var diff = Math.abs(height_old - height_new); 
    var perc = Math.round((diff/height_old) * 100); 
    if (perc > 50) 
     xblur(); 
    } 
    function xblur() { 
    window.removeEventListener('resize', xresize); 
    document.getElementById('status').innerHTML = 'closed'; // do something instead this 
    } 
</script> 

</body> 
</html> 
Cuestiones relacionadas