Menerapkan Fitur Infinite Scroll Sederhana pada Blogger
Fitur ini merupakan contoh nyata penerapan dari potongan kode ini yang kemudian diaplikasikan untuk membuat navigasi halaman AJAX tanpa jQuery seperti pada contoh sebelumnya.
Infinite scroll adalah teknik desain web yang mencegah bar gulir peramban menggulir ke bagian bawah halaman, membuat halaman tumbuh dengan konten tambahan sebagai gantinya.
Plugin ini mengharuskan Anda untuk menentukan empat elemen sebagai target JavaScript. Posting, wadah posting, wadah navigasi halaman dan tautan navigasi halaman berikutnya. Untuk Blogger, elemen target yang paling umum dapat digunakan adalah sebagai berikut:
.blog-posts
.date-outer
.blog-pager
.blog-pager-older-link
Anda dapat menyesuaikannya nanti berdasarkan markup HTML pada templat Anda.
Plugin ini pada awalnya merupakan plugin untuk CMS Mecha, tapi sebenarnya ini tetap dapat bekerja pada platform yang lain seperti Blogger, dengan sedikit penyesuaian tentunya.
Untuk menerapkannya pada Blogger, salin kode di bawah ini kemudian letakkan di atas </body>
:
<b:if cond='data:blog.pageType in ["index","archive"]'>
<script src='//cdn.rawgit.com/tovic/infinite-scroll-plugin-for-mecha-cms/v1.1.0/infinite-scroll/assets/sword/infinite-scroll.min.js'></script>
<script>
//<![CDATA[
/*! Simple AJAX infinite scroll by Taufik Nurrohman */
var infinite_scroll = new InfiniteScroll({
type: 2,
target: {
posts: '.blog-posts',
post: '.date-outer',
anchors: '.blog-pager',
anchor: '.blog-pager-older-link'
},
text: {
load: '<a class="js-load" href="javascript:;">Muat Lagi</a>',
loading: '<span class="js-loading" style="cursor:wait;">Memuat\u2026</span>',
loaded: '<span class="js-loaded">Dimuat.</span>',
error: '<a class="js-error" href="javascript:;">Kesalahan.</a>'
}
});
//]]>
</script>
</b:if>
Simpan perubahan.
Konfigurasi
Data | Keterangan |
---|---|
type | Opsi 0 berarti pengguna perlu mengeklik tombol Muat Lagi untuk memuat posting-posting sebelumnya. Opsi 1 berarti pengguna hanya perlu menggulung peramban sampai pada batas akhir halaman untuk memuat posting-posting sebelumnya. Opsi 2 berarti pengguna perlu mengeklik tombol Muat Lagi untuk memuat posting-posting sebelumnya, setelah itu pengguna hanya perlu menggulung peramban sampai pada batas akhir halaman untuk memuat posting-posting sebelumnya. |
Labels: Blogger, Desain, JavaScript
65 Comments:
matur nuhun.. :'D
By Kang Rian, at Tuesday, July 5, 2016 at 10:18:00 PM GMT+7
:)
By Kia Meliala, at Wednesday, July 6, 2016 at 11:33:00 PM GMT+7
Keren lah :-bd
Bisa buat memfungsikan widget lain nih
By BKE, at Saturday, July 9, 2016 at 10:25:00 AM GMT+7
Bagus mas, sudah saya terapkan untuk tampilan mobile mas.
Mas tovic, bisa bantu gak untuk tampilan mobile saya di blog, itu imagenya pecah gitu mas.
Dia misalnya menggunakan gambar berikut :
[img]https://1.bp.blogspot.com/-WUKc-_ROIIE/V0UPNZqGdHI/AAAAAAAAE1U/6CiQap8ce2ouX89DgJkvgmA8FdYrXmCAQCLcB/s1600/CMD%2BTelnet%2B192.168.1.1.gif[/img]
Yang dtampilkan malah gambar berikut mas, dengan hasil yang terbilang kecil :
[img]https://1.bp.blogspot.com/-WUKc-_ROIIE/V0UPNZqGdHI/AAAAAAAAE1U/6CiQap8ce2ouX89DgJkvgmA8FdYrXmCAQCLcB/s280/CMD%2BTelnet%2B192.168.1.1.gif[/img]
Blog saya : [url=http://iwanberbagi.com]IwanBerbagi[/url]
Mohon bantuannya mas, terima kasih. :)
By Iwan Efendi, at Tuesday, July 12, 2016 at 8:53:00 PM GMT+7
Itu sudah sengaja dilakukan oleh Blogger untuk optimasi halaman yang diakses menggunakan perangkat seluler.
By Taufik Nurrohman, at Thursday, July 14, 2016 at 11:13:00 AM GMT+7
Gak bisa kita lakukan perubahan untuk membuatnya tidak terlalu di compress gitu mas..?
By Iwan Efendi, at Thursday, July 14, 2016 at 11:15:00 AM GMT+7
Tampilan seluler dinonaktifkan saja mas, lalu buat versi tampilan seluler sendiri dengan memanfaatkan kondisional data:blog.isMobileRequest → /2013/01/bekerja-dengan-blog-seluler.html
By Taufik Nurrohman, at Thursday, July 14, 2016 at 8:10:00 PM GMT+7
matur nuhun :D
By Imron Fhatoni, at Monday, July 25, 2016 at 12:22:00 AM GMT+7
gan kok saya coba terapkan tumbnails post nggk ikut reload ya ? yg ada malah blank tumbnail postingan ndk ikut ke refresh mohon pencerahannya suhu :'(
By ApkDlMod.com, at Thursday, August 18, 2016 at 12:07:00 AM GMT+7
Mas di blog saya kok gak aktif ya...??
By Ainun Jariah, at Monday, September 12, 2016 at 7:12:00 PM GMT+7
Kalau thumbnail termuat dengan JavaScript efeknya bakal begitu. Harus diproses ulang perintah JavaScript untuk memuat thumbnail setiap kali posting baru dimuat. Bisa pakai hook seperti ini:
infinite_scroll.on('load', function() {
functionToResizeTheThumbnail('.posts img');
});
Referensi: README.md
Alternatif: /2016/06/mengubah-ukuran-thumbnail-tanpa.html
By Taufik Nurrohman, at Saturday, September 24, 2016 at 3:32:00 PM GMT+7
Kok gak work ya?
By Unknown, at Thursday, October 27, 2016 at 10:49:00 PM GMT+7
Kalau ditambah Masonry gimana ?
By Fariz, at Sunday, October 30, 2016 at 9:40:00 AM GMT+7
Kok ngg bisa mas... duhhhh berantakan malah
By jurnalkata.com, at Tuesday, November 29, 2016 at 10:48:00 PM GMT+7
Terima kasih gan, mantap banget dah :"D
By Cuman Android, at Friday, December 23, 2016 at 6:03:00 PM GMT+7
Keren banget gan.. cocok nih buat (contohnya) blog Berita.
By Sekedus, at Wednesday, March 1, 2017 at 5:29:00 PM GMT+7
Berarti ini bisa difungsikan buat plugin isotope juga kang?
By Unknown, at Thursday, March 23, 2017 at 2:09:00 PM GMT+7
Iya bisa.
By Taufik Nurrohman, at Friday, March 24, 2017 at 2:16:00 AM GMT+7
Wah saya baru tau ada Blogspot sekeren ini. Duh telat banget yak.
Templatenya kereeenn bangettttt. Ringan pula.
Maaf komennya nggak relevan. Nggak tahan pengen bilang keren soalnya :)
By Igniel, at Thursday, April 13, 2017 at 3:39:00 PM GMT+7
=D
By Taufik Nurrohman, at Monday, April 24, 2017 at 11:46:00 PM GMT+7
Keren bang :-bd
tapi setelah diterapkan, ada sedikit yang kurang,
URL di browser gak berubah setelah artikel berpindah ke artikel dibawahnya (saat kena scroll).
mudah-mudahan kedepan ada solusinya
By Bungfrangki, at Saturday, July 8, 2017 at 4:07:00 PM GMT+7
Suwun bro. Lanjutkan :D
By Unknown, at Saturday, July 22, 2017 at 11:23:00 AM GMT+7
Gan INFINITE SCROLL Di atas Mirip Dengan Punya Instagram Bukan ?? Makasih
By Giri Diwa Adam, at Thursday, August 3, 2017 at 1:50:00 PM GMT+7
http://kerensive.blogspot.com/search/label/Health?&max-results=7
Kalau sudah batas akhir kenapa nggak mau nampil 'ALL POST SHOW'?
By Libra Yanada Sembiring, at Saturday, August 12, 2017 at 8:05:00 AM GMT+7
Jumlah posting per halaman diset ke 7, tapi jumlah semua posting hanya ada 5. Mungkin bisa diperbaiki kapan-kapan supaya tombol memuat tidak ditampilkan jika jumlah semua posting kurang dari batas maksimal.
By Taufik Nurrohman, at Saturday, August 12, 2017 at 7:16:00 PM GMT+7
kok sewaktu meload satu post terakhir gk bisa ya gan?
By DRCreative, at Sunday, September 3, 2017 at 3:57:00 PM GMT+7
ehh udah bisa deh gan ternyata karena setting jumlah post :D
By DRCreative, at Sunday, September 3, 2017 at 3:59:00 PM GMT+7
Saya pilih opsi 0: pengguna perlu mengeklik tombol Muat Lagi untuk memuat posting-posting sebelumnya. Tapi postingan otomatis keluar dengan sendirinya ketika di-scroll sampai akhir batas halaman.
Postingan home saya set 6 buah, ketika di-scroll langsung muncul 12 buah. Tapi setelah itu kembali normal. Tombol "Muat Lagi" tetap muncul, dan setiap di-klik postingan muncul 6 buah. Jadi yang error hanya proses pertama saja.
By Igniel, at Wednesday, November 29, 2017 at 3:31:00 PM GMT+7
Solusinya gan post baru diload yang nongol malah data.post.body bukan snippetnya
By Denny, at Sunday, December 24, 2017 at 5:55:00 PM GMT+7
Buat posting read-more tanpa JavaScript → /2012/04/posting-auto-read-more-tanpa-javascript.html
By Taufik Nurrohman, at Wednesday, January 10, 2018 at 12:15:00 PM GMT+7
permasalahan kita sama mba
By DRCreative, at Monday, April 9, 2018 at 5:01:00 PM GMT+7
Sebenarnya Saya ada rencana untuk menambahkan API Riwayat supaya URL di address bar bisa berubah, tapi masih dalam tahap belajar sedikit-sedikit. Padahal ini fitur sudah lama sekali populer setelah munculnya event hashchange, Saya-nya saja yang malas :p
By Taufik Nurrohman, at Monday, April 30, 2018 at 9:16:00 PM GMT+7
klo saya menggunakan history.pushState(), untuk penjelasan bisa cek [url=https://bertzzie.com/knowledge/javascript-lanjut/Javascript-History-API.html#fungsi-history-pushstate]di sini[/url] (indonesia)
By Sekedus, at Wednesday, May 2, 2018 at 1:20:00 PM GMT+7
izin pakai plugin ini mas, terimakasih
saya menggunakan sistem komentar facebook, perlu menambahkan kode ini untuk memanggil fb.comment pada posting yang baru muncul setelah proses load.
infinite_scroll.on('load', function() {
FB.XFBML.parse();
});
masalahnya FB.XFBML.parse bahkan mengurai kembali fb.comment dari awal halaman, dari posting paling atas sampai paling bawah halaman berulangkali setiap proses load. apa mas taufik punya solusi supaya setelah proses load halaman selanjutnya FB.XFBML.parse hanya mengeksekusi fb.comment pada posting yang baru muncul saja dan tidak mengurai kembali fb.comment lain yang sudah ada di setiap posting di halaman yang sudah termuat?
By Ayas Yaza, at Sunday, July 22, 2018 at 12:44:00 PM GMT+7
Kalau dari halaman referensi menjelaskan bahwa parameter pertama bisa dipakai untuk memparse elemen yang spesifik:
document.querySelectorAll('.fb-comment-parse-once').forEach(function($) {
FB.XFBML.parse($);
$.classList.remove('fb-comment-parse-once');
});
Nanti di elemen HTML terkait perlu ditambahkan kelas fb-comment-parse-once.
By Taufik Nurrohman, at Sunday, July 22, 2018 at 1:03:00 PM GMT+7
terimaksih mas taufik, apa penerapannya begini?
document.querySelectorAll('.fb-comment-parse-once').forEach(function($) {
FB.XFBML.parse($);
$.classList.remove('fb-comment-parse-once');
});
});
HTML
<div class='fbe fb-comments' data-numposts='5' data-width='100%' expr:data-href='data:post.canonicalUrl' expr:data-xid='data:post.id' expr:title='data:post.title' id='fc'/>
SDK
//fb
function loadAPI() {
var js = document.createElement('script');
js.async=true;
js.src = '//connect.facebook.net/id_ID/sdk.js#xfbml=1&version=v3.0&appId=&autoLogAppEvents=1';
document.body.appendChild(js);
}
window.onscroll = function () {
var rect = document.getElementById("fc").getBoundingClientRect();
if (rect.top < window.innerHeight) {
loadAPI();
window.onscroll = null;
}
}
saya terapkan seperti di atas, justru FB.XFBML.parse tidak mengeksekusi fb.comment di halaman selanjutnya. apa yang salah ya?
By Ayas Yaza, at Sunday, July 22, 2018 at 5:32:00 PM GMT+7
Enggak. Maksud Saya di markup komentar cukup ditambahkan kelas baru seperti ini:
<div class='fbe fb-comments fb-comment-parse-once' …/>
Lalu pada kait diterapkan seperti ini:
infinite_scroll.on('load', function() {
document.querySelectorAll('.fb-comment-parse-once').forEach(function($) {
FB.XFBML.parse($);
$.classList.remove('fb-comment-parse-once');
});
});
Untuk kode SDK tidak perlu dilakukan perubahan apa-apa.
By Taufik Nurrohman, at Sunday, July 22, 2018 at 9:32:00 PM GMT+7
sudah dirubah seperti intruksi mas taufik, tapi tetep ga bias mas.
By Ayas Yaza, at Monday, July 23, 2018 at 5:40:00 PM GMT+7
Untuk fitur pemuatan API berdasarkan event menggulung mungkin lebih baik diganti pakai kait (?:add|remove)EventListener saja supaya tidak merusak sistem penggulung di plugin Saya ini pada bagian window.onscroll = null:
function loadAPI() {
var js = document.createElement('script');
js.async=true;
js.src = '//connect.facebook.net/id_ID/sdk.js#xfbml=1&version=v3.0&appId=&autoLogAppEvents=1';
document.body.appendChild(js);
}
function loadAPI_Hook() {
var rect = document.getElementById('fc').getBoundingClientRect();
if (rect.top < window.innerHeight) {
loadAPI();
window.removeEventListener("scroll", loadAPI_Hook);
}
}
window.addEventListener("scroll", loadAPI_Hook, false);
By Taufik Nurrohman, at Tuesday, July 24, 2018 at 8:07:00 AM GMT+7
oke mas taufik, terimakasih atas bantuannya
By Ayas Yaza, at Tuesday, July 24, 2018 at 8:00:00 PM GMT+7
Mohon maaf pak, saya lagi bingung karena habis belajar edit template evo magz pro setelah selesai perubahan, tiba-tiba komentarnya jadi muncul angka di samping photo avatar dan ada tulisan load more...dibawah kotak komentar. sudah nyari tapi gak nemu-nemu juga. kalau berkenan mohon bantuannya.
terimakasih dan mohon maaf kalau komentar saya tidak sesuai dengan topik pembahasan.
By Rauhun Isnaini, at Sunday, August 12, 2018 at 8:10:00 PM GMT+7
Mungkin akan lebih baik jika ditanyakan ke si pembuat tema secara langsung.
By Taufik Nurrohman, at Monday, August 13, 2018 at 10:16:00 PM GMT+7
sama kaya yang di atas gan, saya pake disqus yang tampil on.clcik, saya ambil [url=https://stackoverflow.com/questions/4963505/several-disqus-threads-on-one-page/11432286#28832944]dari sini[/url] setelah memuat halaman selanjutnya, disqusnya ga tampil setelah di klik. tapi untuk halaman yang muncul pertama bias muncul. solusunya gimana ya? makasih sebelumnya gan
<a class='showDisqus' href="javascript:void(0);" expr:data-id='data:post.id' expr:data-title='data:post.title' expr:data-url='data:post.canonicalUrl'>Komentar</a>
By Pulung, at Tuesday, August 14, 2018 at 1:35:00 AM GMT+7
Sama seperti kasus ini, cukup masukan fungsi ke dalam kait load:
infinite_scroll.on('load', function() {
$('.showDisqus').click(function() { … });
});
By Taufik Nurrohman, at Tuesday, August 14, 2018 at 12:35:00 PM GMT+7
sayakan pake caraousel, setiap kali dimuat, ada tambahan elemen <span class="fi" id="fi:0"/>.
jadinya dia ikut ke caraousel...
cara ngilangin span itu gimana ya mas... atau memasukkannya kedalam blog-pager
saya udah tambahin gini tapi ga bisa juga
infinite_scroll.on("load", function() {
$(".fi").remove();
});
[url=https://sa4x.blogspot.com/]begini dia[/url]
By Putri Rahayu, at Wednesday, December 26, 2018 at 9:44:00 PM GMT+7
Abreviasi fi bagi Mecha sebenarnya memiliki arti fragment identifier. Itu Saya tambahkan agar ketika Saya mengaktifkan URL hash dengan window.location.hash sebagai #fi:0, #fi:1, #fi:2, dan seterusnya, maka halaman akan secara otomatis meloncat ke titik muat tersebut.
Di carousel punyamu kan pakai Flickity… nah, di plugin Flickity itu ada opsi untuk menentukan selektor item. Mungkin kamu bisa coba pakai itu. Misalnya seperti ini:
var carousel = new Flickity(node, {
cellSelector: '.post'
});
By Taufik Nurrohman, at Thursday, December 27, 2018 at 10:37:00 AM GMT+7
wah ternyata ada opsi kayak gitu di flickity, saya gak liat, hehehe... makasih banyak ya mas taufik, mantep lah memang mamas ini
By Putri Rahayu, at Friday, December 28, 2018 at 12:47:00 AM GMT+7
kang, gimana cara mengakali load yang di slide ke samping? post hanya memuat saat di scroll ke bawah, gimana supaya bisa memuat saat slide ke samping?
By Loker Sumatera, at Thursday, June 6, 2019 at 7:20:00 PM GMT+7
Bisa tapi terlalu rumit untuk plugin ini. Saya ingin fokus ke hal-hal yang ringan saja, seperti kata “sederhana” pada judul artikel ini. Website yang bisa di-slide ke samping sudah bukan masuk ke dalam kategori sederhana lagi.
By Taufik Nurrohman, at Monday, June 10, 2019 at 10:37:00 PM GMT+7
gimana cara buat script ini biar di load saat pengunjung men-scrool laman, kaya lazyload adsense gitu atau di muat setelah loading blog selesai. soal nya kalo pengunjung langsung scrool kebawah, langsung nge load 2 halaman.
Agar pas postingan home saya set 8 buah, ketika di-scroll langsung muncul 16 buah. Tapi setelah itu kembali normal. Tombol "Muat Lagi" tetap muncul, dan setiap di-klik postingan muncul 8 buah. Jadi yang error hanya proses pertama saja.
By Lein, at Tuesday, June 18, 2019 at 9:25:00 PM GMT+7
Kalau skrip Saya dilepas dan kamu coba salin URL dari tautan “Halaman Berikutnya” di situ ada parameter max-results=8 apa tidak? Kalau tidak ada mungkin bisa diatasi dengan cara menambahkan parameter tersebut.
Terkait: /2012/03/membatasi-jumlah-posting-pada-halaman.html
By Taufik Nurrohman, at Wednesday, June 19, 2019 at 9:22:00 AM GMT+7
yahh, sangat disayangkan, untuk saat ini saya hanya bisa mengakalinya dengan menekan button untuk memuat halamannya
By Loker Sumatera, at Saturday, June 29, 2019 at 3:26:00 PM GMT+7
Mas Taufik, type infinite-scroll bisa dibuat conditional ga?
misalnya
if(a) {
// InfiniteScroll type 0
}else{
// InfiniteScroll type 1
}
makasih sebelumnya
By Ayas Yaza, at Sunday, July 21, 2019 at 9:13:00 AM GMT+7
→ /2018/09/javascript-tag-kondisional-halaman-blogger.html
By Taufik Nurrohman, at Sunday, July 21, 2019 at 8:23:00 PM GMT+7
kang, lazy load with interception observer gak bekerja saat button load more ditekan. gimana cara mengatasinya kang?
By Yuli Akbar, at Tuesday, September 3, 2019 at 6:46:00 PM GMT+7
var observer = new IntersectionObserver( … ),
container = document.querySelector( … );
infinite_scroll.on('load', function() {
observer.observe(container);
});
By Taufik Nurrohman, at Tuesday, September 3, 2019 at 8:27:00 PM GMT+7
kang, tolong bantu kalau kodenya seperti ini gimana kang?
document.addEventListener("DOMContentLoaded", function() {
var lazyImages = [].slice.call(document.querySelectorAll("img.lazy"));;
if ("IntersectionObserver" in window && "IntersectionObserverEntry" in window && "intersectionRatio" in window.IntersectionObserverEntry.prototype) {
let lazyImageObserver = new IntersectionObserver(function(entries, observer) {
entries.forEach(function(entry) {
if (entry.isIntersecting) {
let lazyImage = entry.target;
lazyImage.src = lazyImage.dataset.src;
lazyImage.srcset = lazyImage.dataset.srcset;
lazyImage.classList.remove("lazy");
lazyImageObserver.unobserve(lazyImage);
}
});
});
lazyImages.forEach(function(lazyImage) {
lazyImageObserver.observe(lazyImage);
});
}
});
apakah on.('load',) nya sebagai pembungkus di lazyImages.forEach(function(lazyImage) {...
By Loker Sumatera, at Wednesday, September 4, 2019 at 10:41:00 AM GMT+7
Ganti document.addEventListener("DOMContentLoaded", jadi infinite_scroll.on("load",
By Taufik Nurrohman, at Wednesday, September 4, 2019 at 10:52:00 AM GMT+7
work kang, cuma ada problem lagi kang. sebelum tombol load ditekan, lazyImage gak jalan di awal [url=https://belajardesignbentar.blogspot.com/]BelajarDesign[/url]
By Loker Sumatera, at Wednesday, September 4, 2019 at 10:57:00 AM GMT+7
Begini:
// Picu di muat berikutnya
infinite_scroll.on('load', function lazyLoad() { … });
// Picu di awal muat
lazyLoad();
By Taufik Nurrohman, at Wednesday, September 4, 2019 at 12:17:00 PM GMT+7
error kang
By Loker Sumatera, at Wednesday, September 4, 2019 at 2:21:00 PM GMT+7
terima kasih kang, udah work. saya buat jadi seperti ini:
infinite_scroll.on('load', lazyLoad=function() {...});
lazyLoad();
terima kasih banyak kang, telah meluangkan waktunya;
By Loker Sumatera, at Wednesday, September 4, 2019 at 3:16:00 PM GMT+7
Salam. Jika ingin memanggil hook di bawah ini, kodenya ditaruh mana ya, Gan? Terima kasih.
infinite_scroll.on('load', function() { ... });
By Umar Qadafi, at Tuesday, November 12, 2019 at 12:49:00 PM GMT+7
kang, ijin tanya. saya punya sebuah function infinite scroll seperti ini.
//Function Infinite Scroll
function LoadMore(){$("#blog-pager").click((function(event){event.preventDefault(),$("#blog-pager a").html("Loading...");var link=$("#Blog1_blog-pager-older-link").attr("href");$.get(link,(function(data){var source=$(data).find(".blog-posts").length?$(data):$("<div></div>");$(".blog-posts").append(source.find(".blog-posts").html()),$("#blog-pager").html(source.find("#Blog1_blog-pager-older-link").clone()),initialLink()}),"html")}))}LoadMore();
saya gabungin dengan observer image. saat di load, observer image dari hasil memuat infinite scroll dengan kode tersebut tidak bekerja. saya ingat kode yg saya dapat dari penjelasan infinite scroll kang taufiq.
//Kode ini
// Picu di muat berikutnya
infinite_scroll.on('load', function lazyLoad() { … });
// Picu di awal muat
lazyLoad();
cara membuat variable infinite_scroll dari sebuah function diatas gimana ya kang?
saat saya ubah function tersebut menjadi seperti variable infinite_scroll, error hasil yang saya dapat. mohon bantuannya kang. plisss
By Loker Sumatera, at Monday, January 6, 2020 at 2:18:00 AM GMT+7
Wah terimakasih bang, sangat bermanfaat, work it banget. Salut saya skripnta tidak di enkripsi seperti punya si hijau 🙂
By Jurnalis, at Saturday, July 4, 2020 at 11:12:00 AM GMT+7
Post a Comment
<< Home