iOS9 - masalah yang sama.
TLDR - sumber masalahnya. Untuk solusi, gulir ke bawah
Saya memiliki formulir dalam position:fixed
iframe dengan id = 'subscribe-popup-frame'
Sesuai pertanyaan awal, pada fokus input, iframe akan ditempatkan di bagian atas dokumen, bukan di bagian atas layar.
Masalah yang sama tidak terjadi dalam mode pengembang safari dengan agen pengguna disetel ke idevice. Jadi sepertinya masalahnya disebabkan oleh keyboard virtual iOS saat muncul.
Saya mendapat beberapa visibilitas tentang apa yang terjadi dengan konsol mencatat posisi iframe (misalnya $('#subscribe-popup-frame', window.parent.document).position()
) dan dari sana saya dapat melihat iOS tampaknya mengatur posisi elemen ke {top: -x, left: 0}
saat keyboard virtual muncul (yaitu difokuskan pada elemen input).
Jadi solusi saya adalah mengambil sial itu -x
, membalikkan tandanya dan kemudian menggunakan jQuery untuk menambahkan top
posisi itu kembali ke iframe. Jika ada solusi yang lebih baik, saya akan senang mendengarnya tetapi setelah mencoba lusinan pendekatan berbeda, hanya itu yang berhasil untuk saya.
Kekurangan: Saya perlu menetapkan batas waktu 500ms (mungkin lebih sedikit akan berfungsi tetapi saya ingin aman) untuk memastikan saya menangkap nilai akhir x
setelah iOS melakukan kerusakannya dengan posisi elemen. Akibatnya, pengalaman itu sangat tersentak-sentak. . . tapi setidaknya itu berhasil
Larutan
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);
}
}
Kemudian panggil saja mobileInputReposition
sesuatu seperti $('your-input-field).focus(function(){})
dan$('your-input-field).blur(function(){})