Saya tahu bahwa di Safari pada iPhone Anda dapat mendeteksi orientasi layar dan mengubah orientasi dengan mendengarkan onorientationchange
acara dan menanyakan window.orientation
sudutnya.
Apakah ini dimungkinkan di browser di ponsel Android?
Agar lebih jelas, saya bertanya apakah rotasi perangkat Android dapat dideteksi oleh JavaScript yang berjalan pada halaman web standar. Itu mungkin pada iPhone, dan saya bertanya-tanya apakah itu bisa dilakukan untuk ponsel Android.
sumber
Perilaku aktual di berbagai perangkat berbeda tidak konsisten . Acara pengubahan ukuran dan orientasi dapat menyala dalam urutan yang berbeda dengan frekuensi yang bervariasi. Juga, beberapa nilai (mis., Screen.width dan window.orientation) tidak selalu berubah ketika Anda mengharapkannya. Hindari screen.width - tidak berubah saat diputar di iOS.
Pendekatan yang andal adalah mendengarkan acara perubahan ukuran dan orientasi (dengan beberapa polling sebagai tangkapan keselamatan), dan Anda akhirnya akan mendapatkan nilai yang valid untuk orientasi. Dalam pengujian saya, perangkat Android kadang-kadang gagal memecat acara ketika memutar 180 derajat penuh, jadi saya juga menyertakan setInterval untuk polling orientasi.
Berikut adalah hasil dari empat perangkat yang telah saya uji (maaf untuk tabel ASCII, tetapi sepertinya cara termudah untuk menyajikan hasilnya). Selain dari konsistensi antara perangkat iOS, ada banyak variasi antar perangkat. CATATAN: Peristiwa terdaftar dalam urutan yang dipecat.
sumber
previousOrientation
harus diinisialisasi dengan orientasi saat itu:var previousOrientation = window.orientation;
Jika Anda ingin mengabaikan rotasi 180 derajat, yaitu, Anda tidak perlu membedakan antara lanskap kiri atau kanan dan varian terbalik atau tidak, tambahkan yang berikut sebagai baris pertama kecheckOrientation()
:if (0 === (previousOrientation + window.orientation) % 180) return;
Namun, tanpasetTimeout
tipu daya tambahan , Anda hanya akan mendapat manfaat dari ini di iOS, di mana rotasi 180 derajat yang cepat hanya menciptakan satuorientationchange
peristiwa.jawaban dua-bit-bodoh yang sangat baik memberikan semua latar belakang, tetapi biarkan saya mencoba ringkasan, pragmatis singkat tentang bagaimana menangani perubahan orientasi di iOS dan Android :
resize
acara saja.window.innerWidth
dan lakukanwindow.InnerHeight
saja.window.orientation
- ini tidak akan saat ini di iOS.resize
acara pada Android, dan hanya satuorientationchange
acara di iOS.window.orientation
(danwindow.innerWidth
danwindow.InnerHeight
)Pendekatan ini menawarkan sedikit manfaat daripada mengingat orientasi sebelumnya dan membandingkan:
window.orientation
tidak tersedia di browser desktop).sumber
Anda selalu dapat mendengarkan acara pengubahan ukuran jendela. Jika, pada kejadian itu, jendelanya berubah dari lebih tinggi daripada lebar menjadi lebih lebar daripada tinggi (atau sebaliknya), Anda dapat yakin orientasi telepon baru saja diubah.
sumber
Itu mungkin dalam HTML5.
Anda dapat membaca lebih lanjut (dan coba demo langsung) di sini: http://slides.html5rocks.com/#slide-orientation .
Ini juga mendukung browser deskop tetapi akan selalu mengembalikan nilai yang sama.
sumber
Saya memiliki masalah yang sama. Saya menggunakan Phonegap dan Jquery mobile, untuk perangkat Adroid. Untuk mengubah ukuran dengan benar, saya harus mengatur batas waktu:
sumber
Ini solusinya:
sumber
Gotcha lain - beberapa tablet Android (Motorola Xoom yang saya percaya dan Elonex low-end yang saya coba beberapa pengujian, mungkin juga yang lain) memasang accelerometer sehingga window.orientation == 0 dalam mode LANDSCAPE, bukan potret !
sumber
Anda dapat mencoba solusinya, kompatibel dengan semua browser.
Berikut ini adalah
orientationchange
gambar kompatibilitas: oleh karena itu, saya membuatorientaionchange
polyfill, ini berdasarkan pada atribut @media untuk memperbaiki pustaka orientasichangechange—— orientasichange-fixsumber
Perlu dicatat bahwa pada Epic 4G Touch saya, saya harus mengatur tampilan web untuk menggunakan WebChromeClient sebelum salah satu panggilan android javascript bekerja.
sumber
Cara lintas browser
sumber
Sedikit kontribusi untuk jawaban dua-bit-bodoh:
Seperti yang dijelaskan pada tabel pada ponsel "acara perubahan orientasi" dipecat lebih awal dari peristiwa "mengubah ukuran" sehingga memblokir panggilan perubahan ukuran berikutnya (karena pernyataan if). Properti lebar masih belum ditetapkan.
Sebuah solusi meskipun mungkin bukan yang sempurna bisa dengan tidak memecat acara "orientasi perubahan". Itu bisa diarsipkan dengan membungkus acara "orientasi perubahan" yang mengikat pernyataan "jika":
Semoga ini bisa membantu
(tes dilakukan pada Nexus S)
sumber