Mecha versi 2.6.4 sudah dirilis!

Menerapkan Fitur Infinite Scroll Sederhana pada Blogger

Tabel Konten
  1. Konfigurasi 
Blogger Infinite Scroll

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 [&quot;index&quot;,&quot;archive&quot;]'>
<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 

DataKeterangan
typeOpsi 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.

68 Komentar

BKE

Keren lah :-bd
Bisa buat memfungsikan widget lain nih

Iwan Efendi

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 :

Yang dtampilkan malah gambar berikut mas, dengan hasil yang terbilang kecil :

Blog saya : IwanBerbagi

Mohon bantuannya mas, terima kasih. :)

Taufik Nurrohman

Itu sudah sengaja dilakukan oleh Blogger untuk optimasi halaman yang diakses menggunakan perangkat seluler.

ApkDlMod.com

gan kok saya coba terapkan tumbnails post nggk ikut reload ya ? yg ada malah blank tumbnail postingan ndk ikut ke refresh mohon pencerahannya suhu :'(

Taufik Nurrohman

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

Ainun Jariah

Mas di blog saya kok gak aktif ya...??

Unknown

Kok gak work ya?

Fariz

Kalau ditambah Masonry gimana ?

jurnalkata.com

Kok ngg bisa mas... duhhhh berantakan malah

Cuman Android

Terima kasih gan, mantap banget dah :"D

Sekedus

Keren banget gan.. cocok nih buat (contohnya) blog Berita.

Igniel

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 :)

Bungfrangki

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

Taufik Nurrohman

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

Sekedus

klo saya menggunakan history.pushState(), untuk penjelasan bisa cek di sini (indonesia)

Unknown

Suwun bro. Lanjutkan :D

Giri Diwa Adam

Gan INFINITE SCROLL Di atas Mirip Dengan Punya Instagram Bukan ?? Makasih

Libra Yanada Sembiring

http://kerensive.blogspot.com/search/label/Health?&max-results=7

Kalau sudah batas akhir kenapa nggak mau nampil 'ALL POST SHOW'?

Taufik Nurrohman

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.

DRCreative

kok sewaktu meload satu post terakhir gk bisa ya gan?

DRCreative

ehh udah bisa deh gan ternyata karena setting jumlah post :D

Igniel

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.

Unknown

punya saya saat discroll gambar tidak ikut diload jadi blank, masalahnya dimana yah mas?

Unknown

solved mas, ternyata kesalah ambil thumbnail dari js heeh

Ayas Yaza

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?

Taufik Nurrohman

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.

Ayas Yaza

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?

Taufik Nurrohman

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.

Ayas Yaza

sudah dirubah seperti intruksi mas taufik, tapi tetep ga bias mas.

Taufik Nurrohman

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);

Ayas Yaza

oke mas taufik, terimakasih atas bantuannya

Rauhun Isnaini

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.

Taufik Nurrohman

Mungkin akan lebih baik jika ditanyakan ke si pembuat tema secara langsung.

Pulung

sama kaya yang di atas gan, saya pake disqus yang tampil on.clcik, saya ambil dari sini 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>

Taufik Nurrohman

Sama seperti kasus ini, cukup masukan fungsi ke dalam kait load:

infinite_scroll.on('load', function() {
$('.showDisqus').click(function() { … });
});

Putri Rahayu

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();
});

begini dia

Taufik Nurrohman

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'
});

Putri Rahayu

wah ternyata ada opsi kayak gitu di flickity, saya gak liat, hehehe... makasih banyak ya mas taufik, mantep lah memang mamas ini

Loker Sumatera

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?

Taufik Nurrohman

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.

Loker Sumatera

yahh, sangat disayangkan, untuk saat ini saya hanya bisa mengakalinya dengan menekan button untuk memuat halamannya

Lein

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.

Yuli Akbar

kang, lazy load with interception observer gak bekerja saat button load more ditekan. gimana cara mengatasinya kang?

Taufik Nurrohman

var observer = new IntersectionObserver( … ),
container = document.querySelector( … );
infinite_scroll.on('load', function() {
observer.observe(container);
});

Loker Sumatera

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) {...

Taufik Nurrohman

Ganti document.addEventListener("DOMContentLoaded", jadi infinite_scroll.on("load",

Loker Sumatera

work kang, cuma ada problem lagi kang. sebelum tombol load ditekan, lazyImage gak jalan di awal BelajarDesign

Taufik Nurrohman

Begini:

// Picu di muat berikutnya
infinite_scroll.on('load', function lazyLoad() { … });
// Picu di awal muat
lazyLoad();

Loker Sumatera

terima kasih kang, udah work. saya buat jadi seperti ini:
infinite_scroll.on('load', lazyLoad=function() {...});
lazyLoad();

terima kasih banyak kang, telah meluangkan waktunya;

Umar Qadafi

Salam. Jika ingin memanggil hook di bawah ini, kodenya ditaruh mana ya, Gan? Terima kasih.

infinite_scroll.on('load', function() { ... });

Loker Sumatera

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

Ryan Jauhari

Wah terimakasih bang, sangat bermanfaat, work it banget. Salut saya skripnta tidak di enkripsi seperti punya si hijau 🙂

Taufik Nurrohman

Berikut ini cara menerapkan fitur infinite scroll pada beberapa bagian sekaligus.

<div class="blog-posts" id="audio-posts">
  <article class="post"> … </article>
  …
  <nav class="blog-pager" id="audio-pager">
    <a class="blog-pager-newer-link" id="audio-pager-newer-link"> … </a>
    <a class="blog-pager-older-link" id="audio-pager-newer-link"> … </a>
  </nav>
</div>

<div class="blog-posts" id="story-posts">
  <article class="post"> … </article>
  …
  <nav class="blog-pager" id="story-pager">
    <a class="blog-pager-newer-link" id="story-pager-newer-link"> … </a>
    <a class="blog-pager-older-link" id="story-pager-newer-link"> … </a>
  </nav>
</div>

<div class="blog-posts" id="video-posts">
  <article class="post"> … </article>
  …
  <nav class="blog-pager" id="video-pager">
    <a class="blog-pager-newer-link" id="video-pager-newer-link"> … </a>
    <a class="blog-pager-older-link" id="video-pager-newer-link"> … </a>
  </nav>
</div>
const audioInfiniteScroll = new InfiniteScroll({
    target: {
        posts: '#audio-posts',
        post: '#audio-posts > .post',
        anchors: '#audio-pager',
        anchor: '#audio-pager-older-link'
    }
});

const storyInfiniteScroll = new InfiniteScroll({
    target: {
        posts: '#story-posts',
        post: '#story-posts > .post',
        anchors: '#story-pager',
        anchor: '#story-pager-older-link'
    }
});


const videoInfiniteScroll = new InfiniteScroll({
    target: {
        posts: '#video-posts',
        post: '#video-posts > .post',
        anchors: '#video-pager',
        anchor: '#video-pager-older-link'
    }
});

Komentar telah ditutup.