iOS9 - ten sam problem.
TLDR - źródło problemu. Aby znaleźć rozwiązanie, przewiń do dołu
Miałem formularz w position:fixed
ramce iframe z id = 'subscribe-popup-frame'
Zgodnie z pierwotnym pytaniem, przy fokusie wejścia element iframe byłby na górze dokumentu, a nie na górze ekranu.
Ten sam problem nie wystąpił w trybie deweloperskim safari z agentem użytkownika ustawionym na idevice. Wygląda więc na to, że problem jest spowodowany przez wirtualną klawiaturę iOS, gdy się pojawia.
Uzyskałem pewien wgląd w to, co się dzieje, rejestrując przez konsolę pozycję elementu iframe (np. $('#subscribe-popup-frame', window.parent.document).position()
) I stamtąd mogłem zobaczyć, jak iOS ustawia pozycję elementu, {top: -x, left: 0}
gdy pojawiła się wirtualna klawiatura (tj. Skupiła się na elemencie wejściowym).
Więc moim rozwiązaniem było skorzystanie z tego nieznośnego -x
, odwrócenie znaku, a następnie użycie jQuery, aby dodać tę top
pozycję z powrotem do iframe. Jeśli istnieje lepsze rozwiązanie, bardzo bym to usłyszał, ale po wypróbowaniu kilkunastu różnych podejść to jedyne, które mi się udało.
Wada: musiałem ustawić limit czasu na 500 ms (może mniej by działało, ale chciałem być bezpieczny), aby upewnić się, że uchwyciłem ostateczną x
wartość po tym, jak iOS zrobił psikusa z pozycją elementu. W rezultacie doświadczenie jest bardzo gwałtowne. . . ale przynajmniej działa
Rozwiązanie
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);
}
}
Następnie zadzwoń mobileInputReposition
na przykład $('your-input-field).focus(function(){})
i$('your-input-field).blur(function(){})