Pengantar
Sebagai developer Web, kita cenderung tertarik dengan teknologi baru yang memungkinkan kita membuat halaman Web yang lebih menarik dan interaktif. Grafis 3D dengan WebGL? Tentu saja. Kemampuan audio lanjutan dengan WebAudio? Tentu saja. Aplikasi kolaborasi real-time yang menggunakan kamera dan mikrofon Web? Daftarkan saya.
Yang kurang menarik, meskipun sama pentingnya, adalah teknologi yang memungkinkan kita membangun aplikasi yang berjalan lebih efisien dan memberikan pengalaman pengguna yang lebih baik secara keseluruhan. Di sinilah API seperti PageVisibility berperan.
Page Visibility API menjalankan fungsi sederhana tetapi penting – API ini memungkinkan aplikasi Anda mengetahui kapan halaman dapat dilihat oleh pengguna. Informasi dasar ini memungkinkan pembuatan halaman Web yang berperilaku berbeda saat tidak dilihat. Pertimbangkan beberapa contoh:
- Laman web yang mengambil informasi dari server dapat memperlambat siklus pembaruan saat tidak dilihat secara aktif
- Halaman yang menampilkan carousel gambar atau konten video/audio yang berputar dapat dijeda hingga pengguna menampilkan halaman lagi
- Aplikasi dapat memutuskan untuk menampilkan notifikasi kepada pengguna hanya jika notifikasi tersebut disembunyikan dari tampilan
Pada awalnya, API ini mungkin tidak terlihat terlalu berguna di luar kenyamanan pengguna, tetapi mengingat peningkatan besar dalam penjelajahan Web seluler, hal apa pun yang membantu menghemat daya baterai perangkat menjadi sangat penting. Dengan menggunakan PageVisibility API, situs Anda dapat membantu perangkat pengguna menggunakan lebih sedikit daya dan lebih tahan lama.
Spesifikasi API, yang saat penulisan ini berada dalam tahap Rekomendasi Calon, menyediakan properti untuk mendeteksi status visibilitas dokumen serta peristiwa untuk merespons perubahan visibilitas.
Dalam tutorial ini, saya akan membahas dasar-dasar API dan menunjukkan cara menerapkannya ke beberapa contoh praktis (jangan ragu untuk langsung melihatnya jika Anda tidak sabar).
Properti Visibilitas Dokumen
Spesifikasi PageVisibilityAPI versi saat ini menentukan dua properti dokumen: boolean hidden
dan enumerasi visibilityState
. Properti visibilityState saat ini memiliki empat kemungkinan nilai: hidden
, visible
, prerender
, dan unloaded
.
Seperti yang Anda duga, atribut tersembunyi menampilkan true jika dokumen tidak terlihat sama sekali. Biasanya, ini berarti dokumen diperkecil, berada di tab latar belakang, layar kunci OS aktif, dll. Atribut ditetapkan ke salah jika ada bagian dokumen yang setidaknya terlihat sebagian di setidaknya satu layar. Selain itu, untuk mengakomodasi alat aksesibilitas, atribut tersembunyi dapat disetel ke salah jika alat seperti kaca pembesar layar sepenuhnya mengaburkan dokumen, tetapi menampilkan tampilannya.
Menangani awalan vendor
Agar tetap berfokus pada kode, bukan semua awalan khusus vendor, saya akan menggunakan beberapa fungsi bantuan untuk mengisolasi khusus browser. Segera setelah Anda menghentikan dukungan untuk Browser Android 4.4, Anda dapat menghapus bagian ini dan tetap menggunakan nama standar.
function getHiddenProp(){
var prefixes = ['webkit','moz','ms','o'];
// if 'hidden' is natively supported just return it
if ('hidden' in document) return 'hidden';
// otherwise loop over all the known prefixes until we find one
for (var i = 0; i < prefixes.length; i++){
if ((prefixes[i] + 'Hidden') in document)
return prefixes[i] + 'Hidden';
}
// otherwise it's not supported
return null;
}
Contoh Properti Dokumen
Sekarang kita dapat menulis fungsi lintas browser, isHidden()
, untuk melihat apakah dokumen terlihat.
function isHidden() {
var prop = getHiddenProp();
if (!prop) return false;
return document[prop];
}
Untuk tampilan visibilitas dokumen yang lebih terperinci, Anda dapat menggunakan properti visibilityState. Properti ini menampilkan salah satu dari empat nilai:
hidden
: dokumen sepenuhnya disembunyikan dari tampilanvisible
: dokumen setidaknya terlihat sebagian di setidaknya satu perangkat layarprerender
: dokumen dimuat di luar layar dan tidak terlihat (nilai ini bersifat opsional; tidak semua browser akan mendukungnya)unloaded
: jika dokumen akan di-unload, nilai ini akan ditampilkan (nilai ini bersifat opsional; tidak semua browser akan mendukungnya)
Peristiwa VisibilityChange
Selain properti visibilitas, ada peristiwa visibilitychange yang diaktifkan setiap kali status visibilitas dokumen berubah. Anda dapat mendaftarkan pemroses peristiwa untuk peristiwa ini langsung di objek dokumen:
Contoh Peristiwa
// use the property name to generate the prefixed event name
var visProp = getHiddenProp();
if (visProp) {
var evtname = visProp.replace(/[H|h]idden/,'') + 'visibilitychange';
document.addEventListener(evtname, visChange);
}
function visChange() {
var txtFld = document.getElementById('visChangeText');
if (txtFld) {
if (isHidden())
txtFld.value += "Tab Hidden!\n";
else
txtFld.value += "Tab Visible!\n";
}
}
Ringkasan
Membangun aplikasi Web yang hebat melibatkan lebih dari sekadar menggunakan beragam fitur menarik yang dapat dilihat dan berinteraksi dengan pengguna. Aplikasi yang benar-benar hebat menggunakan resource dan perhatian pengguna dengan cermat, dan Page Visibility API adalah bagian penting dari teka-teki tersebut. Untuk mempelajari lebih lanjut cara membuat aplikasi Web sadar resource, lihat artikel lain terkait performa.