iOS9 - mesmo problema.
TLDR - fonte do problema. Para solução, role para baixo
Eu tinha um formulário em um position:fixed
iframe com id = 'subscribe-popup-frame'
Conforme a pergunta original, no foco da entrada, o iframe iria para a parte superior do documento, em vez da parte superior da tela.
O mesmo problema não ocorreu no modo safari dev com o agente do usuário definido como um dispositivo de identificação. Parece que o problema é causado pelo teclado virtual do iOS quando ele aparece.
Eu obtive alguma visibilidade do que estava acontecendo registrando a posição do iframe (por exemplo $('#subscribe-popup-frame', window.parent.document).position()
) e a partir daí pude ver que o iOS parecia estar definindo a posição do elemento para {top: -x, left: 0}
quando o teclado virtual apareceu (ou seja, focado no elemento de entrada).
Então, minha solução foi pegar essa traquina -x
, reverter o sinal e usar o jQuery para adicionar essa top
posição de volta ao iframe. Se houver uma solução melhor, eu adoraria ouvi-la, mas depois de tentar uma dúzia de abordagens diferentes, foi a única que funcionou para mim.
Desvantagem: eu precisava definir um tempo limite de 500ms (talvez menos funcionasse, mas eu queria estar seguro) para garantir que eu capturasse o x
valor final depois que o iOS fizesse seu mal com a posição do elemento. Como resultado, a experiência é muito instável. . . mas pelo menos funciona
Solução
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);
}
}
Em seguida, basta chamar mobileInputReposition
algo como $('your-input-field).focus(function(){})
e$('your-input-field).blur(function(){})