Editar: documentada por Apple, aunque en realidad no podía conseguir que funcione: Behavior with Keyboard Displays WKWebView: "En el IOS 10, WKWebView objetos comportamiento nativo partido de Safari mediante la actualización de su propiedad window.innerHeight cuando se muestra el teclado, y no llame eventos de cambio de tamaño "(tal vez puede usar el enfoque o el enfoque más el retraso para detectar el teclado en lugar de usar el tamaño).
Edición: el código presume el teclado en pantalla, no el teclado externo. Dejarlo porque la información puede ser útil para otros que solo se preocupan por los teclados en pantalla. Use http://jsbin.com/AbimiQup/4 para ver los parámetros de la página.
nos prueba para ver si el document.activeElement
es un elemento que muestra el teclado (input type = text, textarea, etc). Probado funciona en iOS5, Chrome Mobile (Beta mayo de 2012) y Android (ICS) y Opera (no funciona porque Opera mantiene el foco en el elemento después del teclado cerrado).
creo que falla en algunas circunstancias (IOS dan enfoque a la entrada, van a la pantalla de inicio, y luego volver a la página?) Pero funciona bastante bien para lo que hacemos.
El siguiente código modifica las cosas para nuestros propósitos (aunque generalmente no es correcto).
function getViewport() { // Note viewport sizing broken in Android 2.x see http://stackoverflow.com/questions/6601881/problem-with-meta-viewport-and-android
var viewport = {
left: window.pageXOffset, // http://www.quirksmode.org/mobile/tableViewport.html
top: window.pageYOffset,
width: window.innerWidth || documentElement.clientWidth,
height: window.innerHeight || documentElement.clientHeight
};
if (isTouchDevice && isInput(getActiveElement())) { // iOS *lies* about viewport size when keyboard is visible. See http://stackoverflow.com/questions/2593139/ipad-web-app-detect-virtual-keyboard-using-javascript-in-safari Input focus/blur can indicate, also scrollTop:
return {
left: viewport.left,
top: viewport.top,
width: viewport.width,
height: viewport.height * (viewport.height > viewport.width ? 0.66 : 0.45) // Fudge factor to allow for keyboard on iPad
};
}
return viewport;
}
function isInput(el) {
var tagName = el && el.tagName && el.tagName.toLowerCase();
return (tagName == 'input' && el.type != 'button' && el.type != 'radio' && el.type != 'checkbox') || (tagName == 'textarea');
};
function getActiveElement() {
try {
return document.activeElement; // can get exeption in IE8
} catch(e) {
}
};
El código de arriba es solo aproximado: es incorrecto para teclado dividido, teclado desacoplado, teclado físico. Según el comentario en la parte superior, es posible que pueda hacer un mejor trabajo que el código dado en Safari (desde iOS8?) O WKWebView (desde iOS10) usando la propiedad window.innerHeight
.
Sin embargo la respuesta etiquetado (cambiando scrollTop para medir la altura) tiene efectos secundarios desagradables si IU visor con zoom (o fuerza-zoom habilitado en las preferencias). No utilizo la otra solución sugerida (cambio de desplazamiento) porque en iOS, cuando la vista es ampliable y se desplaza a la entrada enfocada, hay interacciones erróneas entre desplazamiento & zoom & foco (que puede dejar una entrada solo enfocada fuera de la ventana gráfica - no visible).
Hm, un problema interesante. Intenta iterar sobre los objetos de "ventana" en Safari del iPad para ver si hay algún objeto especial relacionado con el soporte del teclado. –
@David que no funcionará, el teclado no es una "ventana" de Javascript. – kennytm
@KennyTM. Duh. Pero puede haber un indicador relacionado con la visualización del teclado en pantalla en cualquiera de los objetos de la ventana. Vale la pena intentarlo. –