iOS9: mismo problema.
TLDR - fuente del problema. Para la solución, desplácese hacia abajo
Tenía un formulario en un position:fixed
iframe con id = 'subscribe-popup-frame'
Según la pregunta original, en el enfoque de entrada, el iframe iría a la parte superior del documento en lugar de a la parte superior de la pantalla.
El mismo problema no ocurrió en el modo de desarrollo de safari con el agente de usuario establecido en un idevice. Por lo tanto, parece que el problema es causado por el teclado virtual iOS cuando aparece.
Obtuve cierta visibilidad de lo que estaba sucediendo al registrar la posición del iframe en la consola (por ejemplo $('#subscribe-popup-frame', window.parent.document).position()
) y desde allí pude ver que iOS parecía estar configurando la posición del elemento{top: -x, left: 0}
cuando apareció el teclado virtual (es decir, enfocado en el elemento de entrada).
Entonces, mi solución fue tomar esa molestia -x
, revertir el signo y luego usar jQuery para agregar esa top
posición nuevamente al iframe. Si hay una solución mejor, me encantaría escucharla, pero después de probar una docena de enfoques diferentes, fue la única que funcionó para mí.
Inconveniente: necesitaba establecer un tiempo de espera de 500 ms (tal vez menos funcionaría, pero quería estar seguro) para asegurarme de capturar el x
valor final después de que iOS había hecho mal con la posición del elemento. Como resultado, la experiencia es muy desigual. . . Pero al menos funciona
Solución
var mobileInputReposition = function(){
//if statement is optional, I wanted to restrict this script to mobile devices where the problem arose
if(screen.width < 769){
setTimeout(function(){
var parentFrame = $('#subscribe-popup-frame',window.parent.document);
var parentFramePosFull = parentFrame.position();
var parentFramePosFlip = parentFramePosFull['top'] * -1;
parentFrame.css({'position' : 'fixed', 'top' : parentFramePosFlip + 'px'});
},500);
}
}
Entonces solo llame mobileInputReposition
a algo como $('your-input-field).focus(function(){})
y$('your-input-field).blur(function(){})