iOS9 - ปัญหาเดียวกัน
TLDR - แหล่งที่มาของปัญหา สำหรับวิธีการแก้ปัญหาเลื่อนไปด้านล่าง
ฉันมีแบบฟอร์มใน position:fixed
iframe ที่มี id = 'Subscribe-popup-frame'
ตามคำถามเดิมอินพุตโฟกัส iframe จะไปที่ด้านบนของเอกสารตรงข้ามกับด้านบนของหน้าจอ
ปัญหาเดียวกันไม่ได้เกิดขึ้นในโหมดซาฟารี dev ที่มีตัวแทนผู้ใช้ที่ตั้งค่าเป็นอุปกรณ์ ดังนั้นดูเหมือนว่าปัญหาเกิดจากคีย์บอร์ดเสมือน iOS เมื่อมันปรากฏขึ้น
ฉันมองเห็นสิ่งที่เกิดขึ้นโดยการบันทึกคอนโซลตำแหน่งของ iframe (เช่น$('#subscribe-popup-frame', window.parent.document).position()
) และจากนั้นฉันเห็น iOS ดูเหมือนจะตั้งตำแหน่งขององค์ประกอบ{top: -x, left: 0}
เมื่อแป้นพิมพ์เสมือนโผล่ขึ้นมา (เช่นเพ่งความสนใจไปที่องค์ประกอบอินพุต)
ดังนั้นวิธีการแก้ปัญหาของฉันคือการใช้สิ่งที่น่ารำคาญ-x
กลับเครื่องหมายและใช้ jQuery เพื่อเพิ่มtop
ตำแหน่งนั้นกลับไปที่ iframe หากมีวิธีการแก้ปัญหาที่ดีกว่าฉันชอบที่จะได้ยินมัน แต่หลังจากลองใช้แนวทางที่แตกต่างกันหลายสิบครั้งมันก็เป็นวิธีเดียวที่เหมาะกับฉัน
ข้อเสียเปรียบ:ฉันจำเป็นต้องตั้งค่าการหมดเวลาของ 500ms (อาจจะทำงานได้น้อยลง แต่ฉันต้องการที่จะปลอดภัย) เพื่อให้แน่ใจว่าฉันได้รับx
ค่าสุดท้ายหลังจาก iOS ได้ทำอันตรายกับตำแหน่งขององค์ประกอบ เป็นผลให้ประสบการณ์นั้นกระตุกมาก . . แต่อย่างน้อยก็ใช้งานได้
สารละลาย
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);
}
}
จากนั้นเพียงแค่โทรหาmobileInputReposition
สิ่งที่ชอบ$('your-input-field).focus(function(){})
และ$('your-input-field).blur(function(){})