Showing posts with label JSON. Show all posts
Showing posts with label JSON. Show all posts

Eksperimen Infinite Scroll dengan JSON Blogger

Blogger Infinite Scroll Experiment
Blogger Infinite Scroll Experiment

Eksperimen membuat infinite scroll dengan JSON Blogger. Sebuah sistem yang akan memperbaharui jumlah item posting setiap kali pengguna mencapai batas akhir layar ketika pengguna sedang menggulung halaman. Metode ini sebenarnya sudah pernah Saya tuliskan di sini. Saya mengganti kondisional batas akhir yang tadinya berupa perbandingan antara tinggi kontainer dengan batas akhir gulungan area seperti ini:

container.onscroll = function() {
if ((this.scrollTop + this.offsetHeight) == inner.offsetHeight) {
myFunction();
}
};

Menjadi berdasarkan perbandingan antara tinggi layar dengan batas akhir gulungan layar seperti ini:

window.onscroll = function() {
if (navigator.userAgent.toLowerCase().indexOf("chrome") > -1 || navigator.userAgent.toLowerCase().indexOf("safari") > -1) {
if (document.documentElement.scrollHeight == (document.body.scrollTop + document.documentElement.clientHeight)) {
myFunction();
}
} else {
if (document.documentElement.scrollHeight == (document.documentElement.scrollTop + document.documentElement.clientHeight)) {
myFunction();
}
}
};

Selengkapnya mengenai potongan kode untuk mengecek batas akhir gulungan layar bisa Anda baca di sini.

Silakan dipelajari dan dimodifikasi sesuka hati Anda dengan mengikuti persetujuan yang Saya tuliskan di dalam kode sumbernya. Eksperimen ini akan diperbaharui jika memang ada yang perlu diperbaharui. Begitu.

JSON (JavaScript Object Notation)

JSON

JSON merupakan sekumpulan objek JavaScript. Titik.

Pada dasarnya sebuah JSON hanyalah teks biasa yang tertulis dalam pola tertentu, yang kemudian disimpan dengan ekstensi .json, untuk kemudian bisa kita terjemahkan/konversi menjadi data yang terstruktur dan dapat dilihat dalam bentuk-bentuk yang bisa dibaca oleh manusia untuk keperluan interaksi (misalnya dalam bentuk tabel, daftar atau paragraf).

Data JSON berbasis teks, oleh karena itu dia tidak bergantung pada bahasa pemprograman apapun, itulah yang menjadikan JSON ideal sebagai bahasa pertukaran data. Jika Anda melihat footer pada situs JSON, maka Anda akan mendapati begitu banyak tautan yang mengarah pada beberapa bahasa untuk menangani JSON selain dengan . Dan semuanya tampak tidak terlalu berbeda dalam hal logika dan penerapannya.

Kali ini Saya hanya akan membicarakan tentang penanganan JSON dengan JavaScript. Sebagai catatan, pada dasarnya format dan pola teks di dalam JSON semuanya sama, hanya cara memparse/menerjemahkan datanya itu yang berbeda-beda.

Sekumpulan Objek

JSON tidak akan jauh-jauh dari array dan object, karena JSON memang merupakan penjabaran dari dua tipe data tersebut. Sebuah JSON paling sederhana dapat dinyatakan sebagai objek tunggal seperti ini:

var memberCard = {
"nama": "Taufik Nurrohman",
"memberId": 777,
"address": "http://nama_situs.com"
};

Sebuah variabel memberCard, secara umum hanya bisa menyimpan satu nilai/data saja. Namun ketika nilai variabel tersebut menjadi objek, maka kemampuan variabel tersebut akan meningkat dan bisa memuat data lebih banyak lagi dan lebih kompleks dibandingkan variabel biasa. Untuk menampilkan nilai objek satu per satu, Anda bisa membaca artikel mengenai JavaScript Array dan JavaScript Object:

var memberCard = {
"nama": "Taufik Nurrohman",
"memberId": 777,
"address": "http://nama_situs.com"
};

// Menampilkan data JSON sebagai kartu anggota (member card) virtual:
document.write('<div class="member-card">');
document.write('<ol>');
document.write('<li><strong>Nama:</strong> ' + memberCard.nama + '</li>');
document.write('<li><strong>ID Member:</strong> ' + memberCard.memberId + '</li>');
document.write('<li><strong>Alamat Situs:</strong> <a href="' + memberCard.address + '">' + memberCard.address + '</a></li>');
document.write('</ol>');
document.write('</div>');

Lebih Banyak Data

Untuk memasukkan data yang lebih banyak ke dalam JSON, Anda bisa mengelompokkan objek menjadi array. Untuk menciptakan cabang, Anda bisa mengubah nilai properti objek menjadi objek baru.

Sampel Pertama: Daftar Kartu Anggota

Untuk membuat kartu anggota yang berjumlah lebih dari satu, kita bisa menggabungkan beberapa objek kartu anggota menjadi array. Setelah itu, semua data bisa kita akses/panggil menggunakan loop:

var memberCard = [
{
"nama": "Taufik Nurrohman",
"memberId": 777,
"address": "http://nama_situs.com"
},
{
"nama": "Agus Bolagus",
"memberId": 778,
"address": "http://nama_situs_agus.com"
},
{
"nama": "Bejo Subejo",
"memberId": 230,
"address": "http://the_bejo_site.com"
},
{
"nama": "Paimin Bin Paimun",
"memberId": 411,
"address": "http://blog_paimin.com"
}
];

// Menampilkan data JSON sebagai deret kartu anggota (member card) virtual:
for (var i = 0; i < memberCard.length; i++) {
document.write('<div class="member-card">');
document.write('<ol>');
document.write('<li><strong>Nama:</strong> ' + memberCard[i].nama + '</li>');
document.write('<li><strong>ID Member:</strong> ' + memberCard[i].memberId + '</li>');
document.write('<li><strong>Alamat Situs:</strong> <a href="' + memberCard[i].address + '">' + memberCard[i].address + '</a></li>');
document.write('</ol>');
document.write('</div>');
}

Sampel ke Dua: Cabang Baru

Untuk menciptakan cabang baru, kita bisa menyatakan nilai salah satu properti objek menjadi objek baru:

var memberCard = {
"nama": "Taufik Nurrohman",
"memberId": 777,
"address": {
"address1": "http://nama_situs_pertamax.com",
"address2": "http://nama_situs_keduax.com",
"address3": "http://nama_situs_ketigax.com"
}
};

// Menampilkan data JSON sebagai kartu anggota (member card) virtual:
document.write('<div class="member-card">');
document.write('<ol>');
document.write('<li><strong>Nama:</strong> ' + memberCard.nama + '</li>');
document.write('<li><strong>ID Member:</strong> ' + memberCard.memberId + '</li>');
document.write('<li><strong>Alamat Situs:</strong>');
document.write('<div>1. <a href="' + memberCard.address.address1 + '">' + memberCard.address.address1 + '</a></div>');
document.write('<div>2. <a href="' + memberCard.address.address2 + '">' + memberCard.address.address2 + '</a></div>');
document.write('<div>3. <a href="' + memberCard.address.address3 + '">' + memberCard.address.address3 + '</a></div>');
document.write('</li>');
document.write('</ol>');
document.write('</div>');

Membuat Fungsi Untuk Memparse JSON

Jika JSON telah dinyatakan ke dalam variabel, maka kita bisa meletakkan variabel tersebut sebagai bagian dari parameter sebuah fungsi:

var memberCard = {
"nama": "Taufik Nurrohman",
"memberId": 777,
"address": "http://nama_situs.com"
};

function makeCard(json) {
document.write('<div class="member-card">');
document.write('<ol>');
document.write('<li><strong>Nama:</strong> ' + json.nama + '</li>');
document.write('<li><strong>ID Member:</strong> ' + json.memberId + '</li>');
document.write('<li><strong>Alamat Situs:</strong> <a href="' + json.address + '">' + json.address + '</a></li>');
document.write('</ol>');
document.write('</div>');
}

// Menampilkan data JSON sebagai kartu anggota (member card) virtual...
makeCard(memberCard);

JSON Dalam Dunia Nyata

Dalam dunia nyata, sebuah JSON tidak hanya terdiri dari data sependek itu. Beberapa bisa menampung konten yang lebih besar seperti posting atau identitas anggota yang kompleks. Sebuah JSON eksternal disimpan dengan ekstensi .json

Contoh JSON yang paling mudah kita lihat ada pada feed blog Blogger. Anda bisa melihatnya dengan cara mengakses URL feed blog yang diakhiri dengan parameter ?alt=json:

Contoh lain: Coba Anda lihat kode sumber halaman blog Anda. Pada bagian paling bawah, seharusnya Anda akan mendapati kode seperti ini. Ini adalah JSON, yang “sedang diterjemahkan” oleh sebuah fungsi bernama _WidgetManager._SetDataContext():

_WidgetManager._SetDataContext([{
'name': 'blog',
'data': {
'blogId': '8380174996736403350',
'bloggerUrl': 'http://www.blogger.com',
'title': 'DTE :]',
'pageType': 'item',
'url': 'http://hompimpaalaihumgambreng.blogspot.com/2013/01/konsep-auto-read-more-dengan-bantuan.html',
'canonicalUrl': 'http://hompimpaalaihumgambreng.blogspot.com/2013/01/konsep-auto-read-more-dengan-bantuan.html',
'canonicalHomepageUrl': 'http://hompimpaalaihumgambreng.blogspot.com/',
'homepageUrl': 'http://hompimpaalaihumgambreng.blogspot.com/',
'blogspotFaviconUrl': 'http://hompimpaalaihumgambreng.blogspot.com/favicon.ico',
'enabledCommentProfileImages': true,
'adultContent': false,
'disableAdSenseWidget': false,
'analyticsAccountNumber': 'UA-27593783-1',
'searchLabel': '',
'searchQuery': '',
'pageName': 'Konsep Auto Read-More Baru dengan Bantuan Textarea',
'pageTitle': 'DTE :]: Konsep Auto Read-More Baru dengan Bantuan Textarea',
'metaDescription': 'Metode baru untuk mengurangi beban HTML posting yang biasa terjadi pada script auto read-more versi lama dengan memanfaatkan \46lt;textarea\46gt; untuk mencegah peramban memparse kode HTML di dalam posting.',
'encoding': 'UTF-8',
'locale': 'in',
'localeLanguage': 'in',
'isPrivate': false,
'isMobile': false,
'isMobileRequest': false,
'mobileClass': '',
'isPrivateBlog': false,
'languageDirection': 'ltr',
'feedLinks': '\74link rel\75\42alternate\42 type\75\42application/atom+xml\42 title\75\42DTE :] - Atom\42 href\75\42http://hompimpaalaihumgambreng.blogspot.com/feeds/posts/default\42 /\76\n\74link rel\75\42alternate\42 type\75\42application/rss+xml\42 title\75\42DTE :] - RSS\42 href\75\42http://hompimpaalaihumgambreng.blogspot.com/feeds/posts/default?alt\75rss\42 /\76\n\74link rel\75\42service.post\42 type\75\42application/atom+xml\42 title\75\42DTE :] - Atom\42 href\75\42http://www.blogger.com/feeds/8380174996736403350/posts/default\42 /\76\n\74link rel\75\42EditURI\42 type\75\42application/rsd+xml\42 title\75\42RSD\42 href\75\42http://www.blogger.com/rsd.g?blogID\0758380174996736403350\42 /\76\n\74link rel\75\42alternate\42 type\75\42application/atom+xml\42 title\75\42DTE :] - Atom\42 href\75\42http://hompimpaalaihumgambreng.blogspot.com/feeds/6023732528357300917/comments/default\42 /\76\n',
'meTag': '',
'openIdOpTag': '',
'googleProfileUrl': 'https://plus.google.com/108949996304093815163',
'postImageThumbnailUrl': 'http://2.bp.blogspot.com/-PLdSyiYy8Os/UOaEAHS8SQI/AAAAAAAAGHE/Q2521ahg5Jk/s72-c/auto-readmore-hack-for-blogger-with-textarea.png',
'imageSrcTag': '\74link rel\75\42image_src\42 href\75\42http://2.bp.blogspot.com/-PLdSyiYy8Os/UOaEAHS8SQI/AAAAAAAAGHE/Q2521ahg5Jk/s72-c/auto-readmore-hack-for-blogger-with-textarea.png\42 /\76\n',
'latencyHeadScript': '\74script type\75\42text/javascript\42\76(function() { var a\75window,b\75\42jstiming\42,d\75\42tick\42;var e\75function(c){this.t\75{};this.tick\75function(c,p,h){h\75void 0!\75h?h:(new Date).getTime();this.t[c]\75[h,p]};this[d](\42start\42,null,c)},f\75new e;a.jstiming\75{Timer:e,load:f};if(a.performance\46\46a.performance.timing){var g\75a.performance.timing,j\75a[b].load,k\75g.navigationStart,l\75g.responseStart;0\74k\46\46l\76\75k\46\46(j[d](\42_wtsrt\42,void 0,k),j[d](\42wtsrt_\42,\42_wtsrt\42,l),j[d](\42tbsd_\42,\42wtsrt_\42))}\ntry{var m\75null;a.chrome\46\46a.chrome.csi\46\46(m\75Math.floor(a.chrome.csi().pageT),j\46\0460\74k\46\46(j[d](\42_tbnd\42,void 0,a.chrome.csi().startE),j[d](\42tbnd_\42,\42_tbnd\42,k)));null\75\75m\46\46a.gtbExternal\46\46(m\75a.gtbExternal.pageT());null\75\75m\46\46a.external\46\46(m\75a.external.pageT,j\46\0460\74k\46\46(j[d](\42_tbnd\42,void 0,a.external.startE),j[d](\42tbnd_\42,\42_tbnd\42,k)));m\46\46(a[b].pt\75m)}catch(n){};a.tickAboveFold\75function(c){var i\0750;if(c.offsetParent){do i+\75c.offsetTop;while(c\75c.offsetParent)}c\75i;750\76\75c\46\46a[b].load[d](\42aft\42)};var q\75!1;function r(){q||(q\75!0,a[b].load[d](\42firstScrollTime\42))}a.addEventListener?a.addEventListener(\42scroll\42,r,!1):a.attachEvent(\42onscroll\42,r);\n })();\74/script\076',
'mobileHeadScript': '',
'adsenseClientId': 'pub-4884309229437815',
'view': '',
'dynamicViewsCommentsSrc': '//www.blogblog.com/dynamicviews/4224c15c4e7c9321/js/comments.js',
'dynamicViewsScriptSrc': '//www.blogblog.com/dynamicviews/20497177ec370ede',
'plusOneApiSrc': 'https://apis.google.com/js/plusone.js'
}
}, {
'name': 'skin',
'data': {
'vars': {},
'override': ''
}
}, {
'name': 'view',
'data': {
'classic': {
'name': 'classic',
'url': '/?view\75classic'
},
'flipcard': {
'name': 'flipcard',
'url': '/?view\75flipcard'
},
'magazine': {
'name': 'magazine',
'url': '/?view\75magazine'
},
'mosaic': {
'name': 'mosaic',
'url': '/?view\75mosaic'
},
'sidebar': {
'name': 'sidebar',
'url': '/?view\75sidebar'
},
'snapshot': {
'name': 'snapshot',
'url': '/?view\75snapshot'
},
'timeslide': {
'name': 'timeslide',
'url': '/?view\75timeslide'
}
}
}]);

JavaScript Object

JavaScript Object

Pada dasarnya tujuan object tidak jauh berbeda dengan array, yaitu berfungsi untuk mengumpulkan beberapa data/nilai variabel menjadi satu kesatuan. Sebuah objek merupakan sekumpulan data yang disatukan menjadi satu kesatuan di dalam braket keriting/kurung kurawal ({}). Setiap objek terdiri dari beberapa properti yang dipisahkan dengan tanda koma, dan setiap properti terdiri dari kunci/key dan nilai yang dipisahkan dengan tanda titik dua:

// var identity = { property1, property2, property3 };
// var identity = { key1: value1, key2: value2, key3: value3 };

var identity = { "nama": "Taufik", "usia": 21, "lajang": true };

Saya mulai dengan array. Saat kita menuliskan array, maka cara kita memanggil anggotanya adalah dengan menuliskan nama variabel yang diikuti oleh indeks anggota tersebut seperti ini:

var text = ["Taufik", 21, true];
document.write(text[0]); // Hasil => `Taufik`

Dalam objek, kita memanggil data tidak melalui indeks, melainkan melalui kunci properti. Pemanggilan dimulai dengan menuliskan nama variabel, kemudian diikuti dengan kunci properti yang diinginkan dengan pemisah berupa tanda titik:

var identity = {
"nama": "Taufik",
"usia": 21,
"lajang": true
};

document.write(identity.nama); // Hasil => `Taufik`
document.write(identity.usia); // Hasil => `21`
document.write(identity.lajang); // Hasil => `true`

Lainnya

Beberapa Cara Penulisan Object

Cara paling ringkas:

var x = { "nama": "Taufik", "usia": 21, "lajang": true };

Mendeklarasikan objek kosong, kemudian menuliskan anggotanya satu per satu:

var x = {};
x["nama"] = "Taufik";
x["usia"] = 21;
x["lajang"] = true;

Metode lama/primitif:

var x = new Object();
x["nama"] = "Taufik";
x["usia"] = 21;
x["lajang"] = true;

Pemanggilan Data seperti halnya Array

Ini adalah cara pemanggilan data yang disarankan:

var identity = {
"nama": "Taufik",
"usia": 21,
"lajang": true
};

document.write(identity.nama); // Hasil => `Taufik`

Namun kita juga bisa menggunakan konsep pemanggilan data seperti halnya penanganan data di dalam array, hanya saja indeks anggota tidak dituliskan sebagai angka melainkan sebagai nama properti:

var identity = {
"nama": "Taufik",
"usia": 21,
"lajang": true
};

document.write(identity["nama"]); // Hasil => `Taufik`

Objek Bertingkat/Beranak/Bercabang

Sebuah objek tidak terbatas pada isi berupa properti. Sebuah objek juga bisa berisi objek lain, fungsi, atau bahkan array seperti ini:

var identity = {
"nama": "Taufik",
"usia": 21,
"lajang": true,
"hobi": {
"makan": "roti",
"menggambar": ["arsitektur", "kartun", "abstrak"],
"favorit": {
"makanan": "roti",
"minuman": "air bening",
}
},
"visi": {},
"misi": {
2013: "apa ya?",
2014: "2013 saja belum apalagi 2014!"
},
"fungsi": function() {
alert("Say no to free sex!");
}
};

// Contoh-contoh pemanggilan...
document.write(identity.nama); // Hasil => `Taufik`
document.write(identity.hobi.makan); // Hasil => `roti`
document.write(identity.hobi["makan"]); // Hasil => `roti`
document.write(identity.hobi.favorit.minuman); // Hasil => `air bening`
document.write(identity["hobi"]["favorit"]["minuman"]); // Hasil => `air bening`
document.write(identity.hobi.menggambar[1]); // Hasil => `kartun`

identity.fungsi(); // Akan memicu tampilnya kotak pesan bertuliskan `Say no to free sex!`

Sebuah objek dengan data yang kompleks seperti contoh di atas bisa kita sebut sebagai JavaScript Object Notation (JSON)

JavaScript Array

JavaScript Array

Array merupakan suatu variabel dimana di dalamnya terdapat beberapa anggota yang disatukan menjadi satu kesatuan dalam braket kotak ([]). Setiap data dapat diakses/dipanggil melalui nama variabel yang diikuti dengan indeks anggota. Berikut ini adalah sebuah gambaran bagaimana kita meringkas beberapa nama variabel menjadi satu kelompok array sebuah variabel…

Saya mulai dengan variabel biasa:

var text1 = "Aku";
var text2 = "Cinta";
var text3 = "Kamu";

Variabel di atas dapat dipanggil dengan cara menuliskan namanya satu per satu seperti ini:

document.write(text1 + " " + text2 + " " + text3); // Hasil => `Aku Cinta Kamu`

Dengan array, kita bisa menggabungkan beberapa nilai variabel ke dalam satu nama variabel menggunakan braket kotak:

var text = ["Aku", "Cinta", "Kamu"];

Untuk memanggil data di dalam array, kita tuliskan nama variabel yang kemudian diikuti dengan indeks anggota array tersebut. Indeks anggota dimulai dari 0:

document.write(text[0]); // Hasil => `Aku`
document.write(text[0] + " " + text[1] + " " + text[2]); // Hasil => `Aku Cinta Kamu`
document.write(text[2] + " " + text[1] + " " + text[0]); // Hasil => `Kamu Cinta Aku`
document.write(text[0] + " dan " + text[2]); // Hasil => `Aku dan Kamu`

Lainnya

Beberapa Cara Penulisan Array

Cara paling ringkas:

var x = ["lorem", "ipsum", "dolor", "sit", "amet"];

Mendeklarasikan array kosong, kemudian menuliskan anggotanya satu per satu:

var x = [];
x[0] = "lorem";
x[1] = "ipsum";
x[2] = "dolor";
x[3] = "sit";
x[4] = "amet";

Metode lama/primitif:

var x = new Array("lorem", "ipsum", "dolor", "sit", "amet");
var x = new Array();
x[0] = "lorem";
x[1] = "ipsum";
x[2] = "dolor";
x[3] = "sit";
x[4] = "amet";

Data yang Berbeda

var x = ["lorem", "ipsum", false, null, 0, 30, ""];

Kotak Penelusuran Blogger dengan Ajax JQuery

Ajax Search Form with JQuery
Kotak Penelusuran Blogger dengan Ajax JQuery

Beberapa waktu yang lalu Saya pernah menuliskan cara menampilkan hasil penelusuran dengan JSON Blogger tanpa harus berpindah dari halaman awal menuju halaman hasil penelusuran dengan JavaScript (Anda bisa membacanya di sini).

Melalui JQuery $.ajax() kita bisa meniadakan penyisipan script callback dan langsung memanggil JSON dengan cara seperti ini:

$('#search-form').on("submit", function() {
$.ajax({
url: '../feeds/posts/summary?alt=json-in-script&q=KATA_KUNCI',
type: 'get',
dataType: 'jsonp',
success: function(json) {
...
}
});
});

Sehingga jika dijabarkan akan menjadi seperti ini:

HTML Formulir

<form action="/search" id="ajax-search-form">
<input type="text" name="q">
<input type="submit" value="Search">
</form>

JQuery

(function($) {
var $form = $('#ajax-search-form'),
$input = $form.find(':text');
$form.append('<div id="search-result"></div>');
var $result_container = $('#search-result');
$form.on("submit", function() {
var keyword = $input.val();
$result_container.show().html('Loading...');
$.ajax({
url: 'http://nama_blog.blogspot.com/feeds/posts/summary?alt=json-in-script&q=' + keyword + '&max-results=9999',
type: 'get',
dataType: 'jsonp',
success: function(json) {
var entry = json.feed.entry,
link, skeleton = "";
if (entry !== undefined) {
skeleton = '<h4>Search results for keyword &quot;' + keyword + '&quot;</h4>';
skeleton += '<a class="close" href="/">&times;</a><ol>';
for (var i = 0; i < entry.length; i++) {
for (var j = 0; j < entry[i].link.length; j++) {
if (entry[i].link[j].rel == "alternate") {
link = entry[i].link[j].href;
}
}
skeleton += '<li><a href="' + link + '">' + entry[i].title.$t + '</a></li>';
}
skeleton += '</ol>';
$result_container.html(skeleton);
} else {
$result_container.html('<a class="close" href="/">&times;</a><strong>No result!</strong>');
}
},
error: function() {
$result_container.html('<a class="close" href="/">&times;</a><strong>Error loading feed.</strong>');
}
});
return false;
});
$form.on("click", ".close", function() {
$result_container.fadeOut();
return false;
});
})(jQuery);

Cara Kerja

Pertama-tama kita tangkap beberapa elemen penting yaitu formulir pencarian dan elemen input kata kunci pencarian:

var $form = $('#ajax-search-form'), // Mendapatkan elemen formulir
$input = $form.find(':text'); // Mendapatkan elemen input bertipe teks (penampung kata kunci pencarian)

Sisipkan sebuah elemen HTML secara tidak langsung sebagai kontainer hasil pencaran:

$form.append('<div id="search-result"></div>');
var $result_container = $('#search-result');

Setelah itu kita berlakukan event .submit() atau .on("submit") pada formulir untuk kemudian kita bisa langsung memproses data JSON yang akan ditransfer pada saat yang bersamaan ketika kita menekan tombol Enter pada papan ketik atau mengeklik tombol penelusuran di dalam formulir:

$form.on("submit", function() {
$.ajax(url, type, dataType, success, error); // Dapatkan data dan proses data di sini...
return false; // <= Ini digunakan untuk mencegah formulir membawa kita menuju halaman hasil penelusuran saat kita men-submit kata kunci pencarian
});

Pengambilan data JSON dilakukan oleh JQuery $.ajax(), sehingga kita tidak perlu menyisipkan script callback ke dalam area <head> seperti dalam metode JavaScript mentah pada umumnya:

$.ajax({
url: 'http://nama_blog.blogspot.com/feeds/posts/summary?alt=json-in-script&q=' + keyword + '&max-results=9999',
type: 'get',
dataType: 'jsonp',
success: function(json) {
var entry = json.feed.entry,
link, skeleton = "";
if (entry !== undefined) {
skeleton = '<h4>Search results for keyword &quot;' + keyword + '&quot;</h4>';
skeleton += '<a class="close" href="/">&times;</a><ol>';
for (var i = 0; i < entry.length; i++) {
for (var j = 0; j < entry[i].link.length; j++) {
if (entry[i].link[j].rel == "alternate") {
link = entry[i].link[j].href;
}
}
skeleton += '<li><a href="' + link + '">' + entry[i].title.$t + '</a></li>';
}
skeleton += '</ol>';
$result_container.html(skeleton);
} else {
$result_container.html('<a class="close" href="/">&times;</a><strong>No result!</strong>');
}
},
error: function() {
$result_container.html('<a class="close" href="/">&times;</a><strong>Error loading feed.</strong>');
}
});

keyword adalah variabel. Nilainya diambil dari elemen input teks:

var keyword = $input.val();
// `../feeds/posts/summary?alt=json-in-script&q=keyword&max-results=9999`

Integrasi Widget ke Blogger

Widget ini hanya akan bekerja jika blog Anda sudah dilengkapi dengan JQuery.

Pertama-tama masuk ke halaman Tata Letak, kemudian tambahkan sebuah elemen halaman HTML/JavaScript. Salin kode ini dan letakkan di dalam formulirnya:

<style type="text/css" scoped="scoped">
#ajax-search-form {
position:relative;
font:normal normal 13px/normal Arial,Sans-Serif;
}
#ajax-search-form a {
color:#741F27;
text-decoration:none;
}
#ajax-search-form input {
border:1px solid #ccc;
border-top-color:#999;
background-color:white;
font:inherit;
color:black;
margin:0 0;
padding:5px 5px;
width:180px;
}
#ajax-search-form input::-moz-focus-inner {
margin:0;
padding:0;
border:none;
outline:none;
}
#ajax-search-form input[type="submit"] {
width:auto;
background-color:#084670;
border-color:transparent;
color:#B4D8F0;
font-weight:bold;
cursor:pointer;
padding-left:7px;
padding-right:7px;
}
#ajax-search-form input[type="submit"]:hover,
#ajax-search-form input[type="submit"]:focus {background-color:#083E5F}
#search-result {
border:1px solid #bbb;
background-color:white;
padding:10px 15px;
margin:2px 0;
width:auto;
height:auto;
position:absolute;
top:100%;
left:0;
z-index:99;
-webkit-box-shadow:0 1px 3px rgba(0,0,0,.4);
-moz-box-shadow:0 1px 3px rgba(0,0,0,.4);
box-shadow:0 1px 3px rgba(0,0,0,.4);
display:none;
}
#search-result ol,
#search-result li,
#search-result h4 {
margin:0;
padding:0;
}
#search-result h4,
#search-result strong {
display:block;
margin:0 30px 10px 0;
}
#search-result ol {margin:0 0 10px 28px}
#search-result ol a:hover {text-decoration:underline}
#search-result .close {
display:block;
position:absolute;
top:6px;
right:10px;
line-height:normal;
color:#17950F;
}
#search-result strong {color:#B75252}
</style>
<form action="/search" id="ajax-search-form">
<input type="text" name="q" />
<input type="submit" value="Search" />
</form>
<script type="text/javascript">
(function($) {

var $form = $('#ajax-search-form'),
$input = $form.find(':text');

// Append a search result container to the search form
$form.append('<div id="search-result"></div>');
var $result_container = $('#search-result');

// When the keyword is submitted...
$form.on("submit", function() {

// Get the input value
var keyword = $input.val();

// Show the search result container and insert a `Loading...` text
$result_container.show().html('Loading...');

// Get the blog JSON via $.ajax() to show the search result
// The URL format: http://blog_name.blogspot.com/feeds/posts/summary?alt=json-in-script&q={THE_KEYWORD}&max-results=9999
$.ajax({
url: 'http://nama_blog.blogspot.com/feeds/posts/summary?alt=json-in-script&q=' + keyword + '&max-results=9999',
type: 'get',
dataType: 'jsonp',

// If success, grab the search result list...
success: function(json) {
var entry = json.feed.entry,
link, skeleton = "";
if (entry !== undefined) {
skeleton = '<h4>Search results for keyword &quot;' + keyword + '&quot;</h4>';
skeleton += '<a class="close" href="/">&times;</a><ol>';
for (var i = 0; i < entry.length; i++) {
for (var j = 0; j < entry[i].link.length; j++) {
if (entry[i].link[j].rel == "alternate") {
link = entry[i].link[j].href;
}
}
skeleton += '<li><a href="' + link + '">' + entry[i].title.$t + '</a></li>';
}
skeleton += '</ol>';
$result_container.html(skeleton);
} else {
// If the JSON is empty ... (entry === undefined)
// Show the `not found` or `no result` message
$result_container.html('<a class="close" href="/">&times;</a><strong>No result!</strong>');
}
},
error: function() {

// If error, show an error message
$result_container.html('<a class="close" href="/">&times;</a><strong>Error loading feed.</strong>');
}
});
return false;
});

// Fade out the search result container if the close button is clicked
$form.on("click", ".close", function() {
$result_container.fadeOut();
return false;
});

})(jQuery);
</script>

Ganti kode yang Saya beri tanda dengan URL blog Anda kemudian klik Simpan Widget.

Memperbaharui Pemuatan JSON berdasarkan Event Scroll

Sebuah kumpulan data dalam daftar akan menampilkan indikator sedang memuat dan akan memulai pemuatan data baru saat jarak gulungan telah mencapai titik maksimal
Sebuah kumpulan data dalam daftar akan menampilkan indikator sedang memuat dan akan memulai pemuatan data baru saat jarak gulungan telah mencapai titik maksimal

Metode ini masih sama dengan metode-metode penundaan pemuatan JSON yang biasa Saya lakukan untuk widget-widget Saya yaitu dengan cara menyisipkan script callback secara tidak langsung ke dalam area <head> dengan ID tertentu. Kemudian, jika Saya ingin memperbaharui muatan JSON yang sudah ada, Saya tinggal menyingkirkan script callback yang lama kemudian menggantinya dengan duplikat baru dengan parameter yang sudah diperbaharui.

Bayangkan saja bahwa sudah terdapat sebuah script callback dengan ID foo di dalam area <head> seperti ini:

...
...
<script id="foo" src="../feeds/posts/summary?alt=json-in-script&callback=functionName" type="text/javascript"></script>
</head>

Kemudian Saya akan menyingkirkannya dengan cara menangkap ID elemen tersebut sebagai awalan untuk menyeleksi node induknya:

var a = document.getElementById('foo');
var parent = a.parentNode; // Mendapatkan elemen induk dari `foo`

Kemudian, dari induk tersebut Saya akan menyingkirkan elemen itu sendiri:

var a = document.getElementById('foo');
var parent = a.parentNode; // Mendapatkan elemen induk dari `foo`
parent.removeChild(a); // Singkirkan `foo` dari `parent`

Di sini, kita akan melakukan pekerjaan di atas berdasarkan event onscroll dengan batasan akhir berupa jarak gulungan maksimal kontainer. Kode di bawah ini akan menjalankan fungsi bernama myFunction() berdasarkan event onscroll dengan syarat jarak gulungan telah mencapai titk maksimal:

elem.onscroll = function() {
if ((this.scrollTop + this.offsetHeight) == inner.offsetHeight) {
myFunction();
}
};

Dimana elem adalah objek berupa kontainer.

Memulai Pekerjaan

Markup HTML

Kita mulai dengan pembuatan markup HTML sederhana seperti ini:

<div id="result-container" style="width:400px;height:400px;overflow:auto;">
<ol></ol>
<span class="loading">Memuat...</span>
</div>

Elemen #result-container digunakan sebagai area scroll, elemen ol digunakan sebagai kontainer data yang nantinya akan dihasilkan dari JSON, dan elemen span.loading digunakan sebagai indikator sedang memuat.

Membangun JavaScript

Pertama-tama kita buat script untuk memparse data JSON menjadi elemen HTML. Sederhana, seperti script recent post biasa yang Saya beri nama grabList(), dan hanya akan menghasilkan elemen <li> dengan tautan dan judul posting di dalamnya:

var elem = document.getElementById('result-container'), // Mendapatkan elemen `#result-container`
inner = elem.getElementsByTagName('ol')[0], // Mendapatkan elemen `ol` pertama
loading = elem.getElementsByTagName('span')[0]; // Mendapatkan elemen `span` pertama (dalam hal ini adalah elemen indikator sedang memuat)

// Bangun sebuah script untuk menampilkan daftar posting
function grabList(json) {

var list = json.feed.entry, link, skeleton = "";

// Jalankan loop hanya jika data JSON masih ada/dapat didefinisikan
if (list !== undefined) {
for (var i = 0; i < list.length; i++) {
for (var j = 0; j < list[i].link.length; j++) {
if (list[i].link[j].rel == "alternate") {
link = list[i].link[j].href; // Mendapatkan URL posting
}
}

// Bangun beberapa elemen `<li>` yang berisi tautan dan judul posting...
skeleton += '<li><a href="' + link + '">' + list[i].title.$t + '</a></li>';

}

// ... kemudian sisipkan elemen tersebut ke dalam elemen `<ol>`
inner.innerHTML += skeleton;

// dan sembunyikan indikator sedang memuat.
loading.style.display = "none";

} else {

// Jika data JSON sudah tidak ada (list == undefined), tambahkan kelas baru kepada elemen indikator sedang memuat dengan nilai `the-end`
loading.className += ' the-end';

// kemudian ganti teks indikator sedang memuat dengan kata `Habis`
loading.textContent = 'Habis';

}
}

Setelah itu buat sebuah fungsi untuk memuat script callback secara tidak langsung. Tambahkan dua buah parameter untuk menangani start-index dan max-results:

function updateScript(i, max) {
var head = document.getElementsByTagName('head')[0],
script = document.createElement('script');
script.type = 'text/javascript';
script.id = 'load-on-scroll-end';
script.src = 'http://nama_blog.blogspot.com/feeds/posts/summary?alt=json-in-script&start-index=' + i + '&max-results=' + max + '&callback=grabList';
head.appendChild(script);
}

// Jalankan fungsi!
updateScript(1, 25);

Fungsi di atas akan menyisipkan sebuah script callback JSON Blogger dengan nilai parameter start-index berupa 1 dan max-results berupa 25, sehingga sebuah elemen <script> dengan parameter yang sudah diatur akan disipkan ke dalam area <head> secara tidak langsung seperti ini:

...
...
...
<script id="load-on-scroll-end" src="http://nama_blog.blogspot.com/feeds/posts/summary?alt=json-in-script&start-index=1&max-results=25&callback=grabList" type="text/javascript"></script>
</head>

Memperbaharui JSON Berdasarkan Jarak Maksimal Gulungan Area

Setelah itu kita tambahkan sebuah kondisional untuk menyingkirkan script callback lama jika script tersebut ada. Tidak perlu membuat fungsi baru, cukup gunakan fungsi tadi agar kita bisa menggunakannya untuk dua hal sekaligus, yaitu menyisipkan script baru dan/atau menyingkirkan script lama (jika ada):

function updateScript(i, max) {
var head = document.getElementsByTagName('head')[0],
script = document.createElement('script');
script.type = 'text/javascript';
script.id = 'load-on-scroll-end';
script.src = 'http://nama_blog.blogspot.com/feeds/posts/summary?alt=json-in-script&start-index=' + i + '&max-results=' + max + '&callback=grabList';
if (document.getElementById('load-on-scroll-end')) {
var oldScript = document.getElementById('load-on-scroll-end');
oldScript.parentNode.removeScript(oldScript);
}

head.appendChild(script);
}

updateScript(1, 25); // Jalankan fungsi!

Karena kita juga akan menjalankan fungsi updateScript() berdasarkan event onscroll, maka kita juga harus memasukkan updateScript() ke dalam event yang Saya tuliskan pertama kali:

elem.onscroll = function() {
if ((this.scrollTop + this.offsetHeight) == inner.offsetHeight) {
// Muat ulang JSON Blogger dengan `start-index` yang baru melalui parameter `i`
updateScript(i, 25);
// Kemudian tampilkan indikator sedang memuat
loading.style.display = "block";
}
};

Parameter i haru dinamis, dan harus bisa bertambah setiap kali gulungan kontainer berakhir. Untuk membuatnya menjadi dinamis, kita akan menggunakan variabel awalan dengan nilai 0, kemudian kita tingkatkan nilainya di dalam event onscroll setiap kali jarak gulungan telah mencapai titik maksimal:

var start = 0;
elem.onscroll = function() {
if ((this.scrollTop + this.offsetHeight) == inner.offsetHeight) {

// Tingkatkan nilai `start` dengan 1 (dari `start = 0` menjadi `start = 1`, `start = 2`, dst...)
start++;

// Muat ulang JSON Blogger dengan `start-index` yang telah diperbaharui...
// ... melalui `start` yang nilainya dikalikan dengan 25
updateScript(start*25, 25); // => dari `(1, 25)` menjadi `(25, 25)`, `(50, 25)`, `(75, 25)`, dst...

// Kemudian tampilkan indikator sedang memuat
loading.style.display = "block";

}
};

Produk Final

HTML

<div id="result-container">
<ol></ol>
<span class="loading">Memuat...</span>
</div>

CSS

#result-container {
height:400px;
width:400px;
overflow:auto;
margin:50px auto;
font:normal normal 12px 'Trebuchet MS',Trebuchet,Geneva,Arial,Sans-Serif;
}

#result-container ol {
margin:0 0;
padding:0 0;
background-color:#B5D68C;
}

#result-container li {
margin:0 0;
padding:0 0;
list-style:none;
}

#result-container li:nth-child(even) {background-color:#A2C179}

#result-container li a {
display:block;
padding:5px 10px;
font-weight:bold;
color:#396B18;
text-decoration:none;
}

#result-container li a:hover {
background-color:#396B18;
color:white;
text-decoration:none;
}

#result-container .loading {
display:block;
height:26px;
font:normal bold 11px/26px Arial,Sans-Serif;
color:white;
text-align:center;
background-color:#B75A6F;
border-top:2px solid #222;
}

#result-container .loading.the-end {background-color:#666}

JavaScript

var widget_config = {
home_page: 'http://nama_blog.blogspot.com', // Your blog homepage
container_id: 'result-container', // ID of the result container
script_id: 'load-on-scroll-end-script', // ID of the asynchronous script
max_result: 25, // Max result post at once script loading
end_text: 'Habis' // End text if all posts has been loaded
};

var elem = document.getElementById(widget_config.container_id),
inner = elem.getElementsByTagName('ol')[0],
loading = elem.getElementsByTagName('span')[0],
start = 0, // Dynamic start-index
max = widget_config.max_result;

function grabList(json) {
var list = json.feed.entry, link, skeleton = "";
if (list !== undefined) {
for (var i = 0; i < list.length; i++) {
for (var j = 0; j < list[i].link.length; j++) {
if (list[i].link[j].rel == "alternate") {
link = list[i].link[j].href;
}
}
skeleton += '<li><a href="' + link + '">' + list[i].title.$t + '</a></li>';
}
inner.innerHTML += skeleton; // Insert the list to the container
loading.style.display = "none"; // Hide the loading indicator
} else {
// If the JSON is empty (list == undefined),
// add a new class to the loading indicator called `the-end`
loading.className += ' the-end';
// Replace the loading indicator text into `fully loaded!` for the example
loading.textContent = widget_config.end_text;
}
}

// Make an indirect script loader with two parameters: start-index and max-result post
function updateScript(a, b) {
var head = document.getElementsByTagName('head')[0],
script = document.createElement('script');
script.type = 'text/javascript';
script.id = widget_config.script_id;
script.src = widget_config.home_page + '/feeds/posts/summary?alt=json-in-script&start-index=' + a + '&max-results=' + b + '&callback=grabList';
// If there is an old script in the document...
if (document.getElementById(widget_config.script_id)) {
var oldScript = document.getElementById(widget_config.script_id);
// Remove the old script, and replace with the new one that has an updated start-index value
oldScript.parentNode.removeChild(oldScript);
}
head.appendChild(script);
}

// Start loading the callback script with start-index of 1
updateScript(1, max);

// When the container is being scrolled...
elem.onscroll = function() {
// ... check the scroll distance
if ((this.scrollTop + this.offsetHeight) == inner.offsetHeight) {
// If the distance equal to the height of the inner container...
start++; // Increase the start value by one
// then load the new script with an updated start-index
updateScript(start*max, max);
// and show the loading indicator
loading.style.display = "block";
}
};

JSON Blogger dengan Ajax JQuery

HTML

<div id="result">Loading...</div>

JQuery

// $.ajax({url:feedUrl,type:'get',dataType:'jsonp',success:function(json){ ... }});
$(function() {
$.ajax({
url: 'http://hompimpaalaihumgambreng.blogspot.com/feeds/posts/summary?alt=json-in-script',
type: 'get',
dataType: 'jsonp',
success: function(data) {
var link, title, skeleton = '',
content = data.feed.entry;
if (content !== undefined) {
skeleton = "<ol>";
for (var i = 0; i < content.length; i++) {
title = content[i].title.$t;
for (var j = 0; j < content[i].link.length; j++) {
if (content[i].link[j].rel == "alternate") {
link = content[i].link[j].href;
break;
}
}
skeleton += '<li><a href="' + link + '">' + title + '</a></li>';
}
skeleton += '</ol>';
$('#result').html(skeleton);
} else {
$('#result').html('<span>No result!</span>');
}
},
error: function() {
$('#result').html('<strong>Error Loading Feed!</strong>');
}
});
});

Membangun Aplikasi Quick Search dengan JSON Blogger

Membangun Aplikasi Quick Search dengan JSON Blogger
Membangun Aplikasi Quick Search dengan JSON Blogger

Selain melalui halaman pencarian biasa, Blogger juga mengizinkan kita untuk mengakses posting-posting acak di dalam feed yang dapat disortir berdasarkan kata kunci. Ini bisa dilakukan melalui parameter q.

Format dasar URL feed untuk memanggil data posting dengan sortir berdasarkan kata kunci adalah seperti ini:

http://nama_blog.blogspot.com/feeds/posts/summary?q=Kata Kunci

Yang jika diakses akan menghasilkan halaman berisi daftar posting tersortir berdasarkan kata kunci dari parameter q seperti ini ⇒ Daftar posting dengan kata kunci ‘css’

Dengan memanfaatkan kerangka dasar widget Blogger, event onsubmit pada formulir dan juga penargetan elemen kontainer yang tepat, maka parameter ini memungkinkan kita untuk menciptakan aplikasi quick search. Yaitu sebuah aplikasi yang bisa digunakan untuk mencari artikel/posting dalam sebuah blog tanpa harus berpindah dari halaman asal. Seluruh hasil penelusuran akan tampil pada tempat yang sama!

Pada prinsipnya, hal pertama yang Saya buat adalah sebuah fungsi yang akan menyisipkan elemen <script> secara tidak langsung ke dalam area <head> saat fungsi tersebut dieksekusi. JavaScript yang Saya bangun adalah callback widget Blogger biasa dengan pola sumber yang umum. Saya hanya menambahkan parameter kata kunci pencarian sebagai penyortir posting yang akan dikirim nantinya:

http://nama_blog.blogspot.com/feeds/posts/summary?alt=json-in-script&q=Kata Kunci&callback=functionName

Nilai parameter sumber diambil dari sebuah elemen <input> yang Saya letakkan di dalam formulir. Logikanya seperti ini:

Menyisipkan Nilai Elemen Input ke dalam Parameter 'q'
Menyisipkan Nilai Elemen Input ke dalam Parameter q pada URL Feed
function insertScript() {
// Membangun elemen <script> untuk disisipkan ke dalam area <head> ...
// ... dengan parameter kueri yang ditentukan oleh nilai elemen 'feed-q-input'
var query = document.getElementById('feed-q-input').value,
s = document.createElement('script');
s.type = "text/javascript";
s.src = "http://nama_blog.blogspot.com/feeds/posts/summary?q="+query+"&alt=json-in-script&callback=functionName";
document.getElementsByTagName('head')[0].appendChild(s);
}
<form onsubmit="insertScript();return false;"> ... </form>

Kode aslinya lebih panjang, tapi pada intinya inilah dasar yang Saya gunakan untuk membangun aplikasi pencarian cepat. Anda bisa mengunduh JavaScript dan melihat demonya melalui tombol-tombol ini:


Integrasi Widget ke Blogger

Pertama-tama masuk ke halaman editor HTML template Anda, kemudian salin kode CSS ini dan letakkan di atas kode ]]></b:skin> atau </style>:

#search-form-feed {
width:200px; /* lebar kotak penelusuran */
position:relative;
margin:0 0 10px;
padding:0;
font:normal normal 11px/normal Arial,Sans-Serif;
color:#333;
}

#feed-q-input {
display:block;
width:100%;
border:2px solid #bbb;
background-color:white;
padding:5px;
font:normal bold 13px/normal Tahoma,Arial,Sans-Serif;
color:#ccc;
margin:0;
-webkit-border-radius:4px;
-moz-border-radius:4px;
border-radius:4px;
-webkit-box-shadow:inset 0 1px 5px rgba(0,0,0,.2);
-moz-box-shadow:inset 0 1px 5px rgba(0,0,0,.2);
box-shadow:inset 0 1px 5px rgba(0,0,0,.2);
-webkit-box-sizing:border-box;
-moz-box-sizing:border-box;
box-sizing:border-box;
}

#feed-q-input:focus {
border-color:#0D6786;
color:#333;
outline:none;
-webkit-box-shadow:0 0 5px #153E95,0 0 7px #153E95;
-moz-box-shadow:0 0 5px #153E95,0 0 7px #153E95;
box-shadow:0 0 5px #153E95,0 0 7px #153E95;
}

#search-result-container {
width:400px;
height:300px;
overflow:auto;
position:absolute;
top:100%;
right:0;
z-index:999;
background-color:#E5EDF7;
border:2px solid white;
padding:10px 10px 0;
margin:10px 0 0;
-webkit-box-shadow:0 1px 2px rgba(0,0,0,.4),0 7px 7px -4px rgba(0,0,0,.4);
-moz-box-shadow:0 1px 2px rgba(0,0,0,.4),0 7px 7px -4px rgba(0,0,0,.4);
box-shadow:0 1px 2px rgba(0,0,0,.4),0 7px 7px -4px rgba(0,0,0,.4);
-webkit-border-radius:5px;
-moz-border-radius:5px;
border-radius:5px;
display:none;
}

#search-result-container mark {
background-color:yellow;
color:black;
}

#search-result-container a {
text-decoration:none;
color:#0D3E71;
font-weight:bold;
font-size:12px;
display:block;
}

#search-result-container a:hover {color:#052748}

#search-result-container h4 {
margin:0 0 10px;
font:normal bold 12px/normal "Trebuchet MS",Trebuchet,Tahoma,Arial,Sans-Serif;
color:#B50001;
}

#search-result-container ol {
background:transparent;
border:none;
margin:0 0 10px;
padding:0;
}

#search-result-container li {
margin:0 0 1px;
padding:7px 8px;
list-style:none;
border:1px solid #B7C1CE;
background-color:white;
overflow:hidden;
word-wrap:break-word;
}

#search-result-container li img {
display:block;
float:left;
margin:0 10px 4px 0;
border:1px solid #B7C1CE;
background-color:#F5F5F5;
padding:2px;
}

#search-result-loader {
position:absolute;
top:100%;
left:5px;
z-index:999;
background-color:#0D6786;
color:white;
padding:3px 5px;
margin:-2px 0 0;
font:normal bold 10px/normal Arial,Sans-Serif;
-webkit-border-radius:0 0 3px 3px;
-moz-border-radius:0 0 3px 3px;
border-radius:0 0 3px 3px;
display:none;
}

Setelah itu masuk ke halaman Tata Letak, kemudian tambahkan sebuah elemen halaman HTML/JavaScript. Salin kode ini dan letakkan di dalam formulirnya:

<div id="search-form-feed">
<form action="/search" onsubmit="return updateScript();">
<input name="q" type="text" placeholder="Telusuri..." id="feed-q-input" onkeyup="resetField();"/>
</form>
<div id="search-result-container"></div>
<div id="search-result-loader">Loading...</div>
</div>
<script>
//<![CDATA[
var searchFormConfig = {
url: "http://nama_blog.blogspot.com", // URL Blog
numPost: 9999, // Jumlah maksimal temuan
summaryPost: true, // `true` jika ingin menampilkan deskripsi posting
summaryLength: 400, // Jumlah karakter ringkasan posting
resultTitle: "Hasil penelusuran untuk kata kunci", // Judul hasil pencarian
noResult: "No result", // Deskripsi `tak ditemukan`
resultThumbnail: true, // `true` untuk menampilkan thumbnail posting
thumbSize: 40, // Ukuran & resolusi thumbnail
fallbackThumb: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAA3NCSVQICAjb4U/gAAAADElEQVQImWOor68HAAL+AX7vOF2TAAAAAElFTkSuQmCC" // Fallback thumbnail untuk posting tak bergambar
};
//]]>
</script>
<script src="http://dte-project.googlecode.com/svn/trunk/blogger-quick-search.js"></script>

Klik Simpan Widget.

Konfigurasi Widget

Semua opsi sangat umum. Saya yakin Anda bisa dengan cepat mempelajarinya:

OpsiKeterangan
urlURL blog Anda
numPostJumlah posting yang akan ditampilkan dalam hasil pencarian. Nilai 9999 maksudnya adalah Anda mencoba untuk menampilkan semua posting yang ditemukan
summaryPostPilihan untuk menampilkan atau menyembunyikan ringkasan posting dalam hasil pencarian
summaryLengthDigunakan untuk menentukan jumlah karakter ringkasan hasil pencarian
resultTitleJudul hasil pencarian
noResultPeringatan yang menunjukkan bahwa posting tidak ditemukan
resultThumbnailPilihan untuk menampilkan atau menyembunyikan thumbnail posting dalam hasil pencarian
thumbSizeDigunakan untuk menentukan ukuran dan resolusi thumbnail hasil pencarian
fallbackThumbGambar cadangan untuk posting tak bergambar.

CSS untuk Tema Minimalis (Layout Dasar)

Digunakan sebagai pengganti kode CSS di atas demi kemudahan dalam hal penyesuaian tema:

#search-form-feed {
width:200px; /* lebar kotak penelusuran */
position:relative;
margin:0 0 10px;
padding:0;
font:normal normal 11px/normal Arial,Sans-Serif;
color:#333;
}

#feed-q-input {
-webkit-box-sizing:border-box;
-moz-box-sizing:border-box;
box-sizing:border-box;
display:block;
width:100%;
border:1px solid #bbb;
background-color:white;
padding:5px 5px;
font:inherit;
font-size:13px;
margin:0;
}

#search-result-container {
width:400px;
height:300px;
overflow:auto;
position:absolute;
top:100%;
left:0; /* ganti menjadi `right:0` untuk mendorong kontainer ke kanan */
z-index:9999;
border:1px solid #ccc;
padding:10px 10px 0;
margin:10px 0 0;
-webkit-box-shadow:0 3px 5px rgba(0,0,0,.2);
-moz-box-shadow:0 3px 5px rgba(0,0,0,.2);
box-shadow:0 3px 5px rgba(0,0,0,.2);
display:none;
}

#search-result-container mark {
font:inherit;
display:inline;
background-color:#ff0;
color:black;
}

#search-result-container a {
text-decoration:none;
font-weight:bold;
font-size:110%;
display:block;
}

#search-result-container h4 {
margin:0 0 10px;
font:inherit;
font-weight:bold;
color:#B50001;
}

#search-result-container ol {
background:none;
border:none;
margin:0 0 10px;
padding:0;
}

#search-result-container li {
margin:0 0 15px;
list-style:none;
overflow:hidden;
word-wrap:break-word;
padding-left:65px;
}

#search-result-container li img {
display:block;
float:left;
margin:0 0 2px -55px;
border:1px solid #ccc;
padding:2px;
}

#search-result-loader {
position:absolute;
top:100%;
left:5px;
z-index:9999;
margin-top:4px;
font-size:10px;
display:none;
}

Menampilkan Semua Daftar Label Posting dengan JSON Blogger

Menampilkan Semua Daftar Label Posting dengan JSON Blogger
Konten Feed Blogger

Kode ini digunakan untuk menampilkan semua daftar nama label yang berada di dalam array category feed Blogger (lihat di sini):

<script type="text/javascript">
//<![CDATA[
var homepage = "http://nama_blog.blogspot.com";
function showLabels(json) {
var label = json.feed.category;
document.write('<ul>');
for (var i = 0; i < label.length; i++) {
document.write('<li><a href="' + homepage + '/search/label/' + encodeURIComponent(label[i].term) + '" target="_blank">' + label[i].term + '</a></li>');
}
document.write('</ul>');
}
document.write('<scr' + 'ipt src="' + homepage + '/feeds/posts/summary?max-results=0&alt=json-in-script&callback=showLabels"><\/scr' + 'ipt>');
//]]>
</script>

Susunan markup tidak mutlak. Anda juga bisa mengubahnya menjadi sesuatu yang lain, misalnya mengubahnya menjadi elemen select box seperti ini:

var homepage = "http://nama_blog.blogspot.com";
function showLabels(json) {
var label = json.feed.category;
document.write('<select onchange="window.open(this.value);"><option selected disabled>-- Daftar Kategori --</option>');
for (var i = 0; i < label.length; i++) {
document.write('<option value="' + homepage + '/search/label/' + encodeURIComponent(label[i].term) + '">' + label[i].term + '</option>');
}
document.write('</select>');
}

Blogger JSON - Top Commentators

<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
<title>Top Commentators</title>
<style type="text/css">
.top-commenter-line {
margin:3px 0px;
}
.top-commenter-avatar {
display:inline-block;
vertical-align:middle;
}
</style>
</head>
<body>

<script type="text/javascript">
// Top Commentators gadget with avatars, by MS-potilas 2012.
// Gets a list of top commentators from all comments, or specified number of days in the past.
// See http://yabtb.blogspot.com/2012/05/top-commenters-gadget-with-avatars.html

// CONFIG:
var homepage = 'http://latitudu.blogspot.com', // Homepage
maxTopCommenters = 17, // How much?
minComments = 1, // How many comments must top commentator have at least
numDays = 0, // From how many days (ex. 30), or 0 from "all the time"
excludeMe = true, // true: exclude my own comments
excludeUsers = ["Anonymous", "Another Name"], // Exclude these usernames
maxUserNameLength = 42, // 0: don't cut, >4: cut usernames
txtTopLine = '<b>[#].</b> [image] [user] ([count])', // List number
txtNoTopCommenters = 'No top commentators at this time.',
txtAnonymous = '', // Empty, or Anonymous user name localized if you want to localize
sizeAvatar = 16, // Avatar size
cropAvatar = true,
urlNoAvatar = 'https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBXUevxTfA2_KW3gUcRN491LD6l0Kl-n60ssGv6F3_bSqH-ibQ_sBLYERsYLZUpJwWtLr2lc7QjB9D-AdomDzizCYso7lafPRXtHRxs74TsrP23CKAASVzk-cdQ4eCGKKvpmV0nNvLamw/' + sizeAvatar + '/avatar_blue_m_96.png', // http://www.blogger.com/img/avatar_blue_m_96.png resizeable
urlAnoAvatar = 'http://www.gravatar.com/avatar/00000000000000000000000000000000?d=mm&s=' + sizeAvatar,
urlMyProfile = '', // Set if you have no profile gadget on page
urlMyAvatar = ''; // Can be empty (then it is fetched) or url to image
// END CONFIG
// for old IEs & IE modes:
if (!Array.indexOf) {
Array.prototype.indexOf = function(obj) {
for (var i = 0; i < this.length; i++) if (this[i] == obj) return i;
return -1;
};
}

function replaceTopCmtVars(text, item, position) {
if (!item || !item.author) return text;
var author = item.author;

var authorUri = "";
if (author.uri && author.uri.$t !== "") authorUri = author.uri.$t;

var avaimg = urlAnoAvatar;
var bloggerprofile = "http://www.blogger.com/profile/";
if (author.gd$image && author.gd$image.src && authorUri.substr(0, bloggerprofile.length) == bloggerprofile) {
avaimg = author.gd$image.src;
} else {
var parseurl = document.createElement('a');
if (authorUri !== "") {
parseurl.href = authorUri;
avaimg = 'http://www.google.com/s2/favicons?domain=' + parseurl.hostname;
}
}
if (urlMyProfile !== "" && authorUri == urlMyProfile && urlMyAvatar !== "") avaimg = urlMyAvatar;
if (avaimg == "http://img2.blogblog.com/img/b16-rounded.gif" && urlNoAvatar !== "") avaimg = urlNoAvatar;
var newsize = "s" + sizeAvatar;
avaimg = avaimg.replace(/\/s\d\d+-c\//, "/" + newsize + "-c/");
if (cropAvatar) newsize += "-c";
avaimg = avaimg.replace(/\/s\d\d+(-c){0,1}\//, "/" + newsize + "/");

var authorName = author.name.$t;
if (authorName == 'Anonymous' && txtAnonymous !== "" && avaimg == urlAnoAvatar) authorName = txtAnonymous;
var imgcode = '<img class="top-commenter-avatar" height="' + sizeAvatar + '" width="' + sizeAvatar + '" title="' + authorName + '" src="' + avaimg + '" />';
if (authorUri !== "") imgcode = '<a href="' + authorUri + '">' + imgcode + '</a>';

if (maxUserNameLength > 3 && authorName.length > maxUserNameLength) authorName = authorName.substr(0, maxUserNameLength - 3) + "...";
var authorcode = authorName;
if (authorUri !== "") authorcode = '<a class="profile-name-link" href="' + authorUri + '">' + authorcode + '</a>';

text = text.replace('[user]', authorcode);
text = text.replace('[image]', imgcode);
text = text.replace('[#]', position);
text = text.replace('[count]', item.count);
return text;
}

var topcommenters = {};
var ndxbase = 1;

function showTopCommenters(json) {
var one_day = 1000 * 60 * 60 * 24;
var today = new Date();

if (urlMyProfile === "") {
var elements = document.getElementsByTagName("*");
var expr = /(^| )profile-link( |$)/;
for (var i = 0; i < elements.length; i++) {
if (expr.test(elements[i].className)) urlMyProfile = elements[i].href;
break;
}
}

for (var j = 0; j < json.feed.entry.length; j++) {
var entry = json.feed.entry[j];
if (numDays > 0) {
var datePart = entry.published.$t.match(/\d+/g); // Assume ISO 8601
var cmtDate = new Date(datePart[0], datePart[1] - 1, datePart[2], datePart[3], datePart[4], datePart[5]);

// Calculate difference btw the two dates, and convert to days
var days = Math.ceil((today.getTime() - cmtDate.getTime()) / (one_day));
if (days > numDays) break;
}
var authorUri = "";
if (entry.author[0].uri && entry.author[0].uri.$t !== "") authorUri = entry.author[0].uri.$t;

if (excludeMe && authorUri !== "" && authorUri == urlMyProfile) continue;
var authorName = entry.author[0].name.$t;
if (excludeUsers.indexOf(authorName) != -1) continue;

var hash = entry.author[0].name.$t + "-" + authorUri;
if (topcommenters[hash]) topcommenters[hash].count++;
else {
var commenter = {};
commenter.author = entry.author[0];
commenter.count = 1;
topcommenters[hash] = commenter;
}
}
if (json.feed.entry.length == 200) {
ndxbase += 200;
document.write('<scr' + 'ipt type="text/javascript" src="' + homepage + '/feeds/comments/default?redirect=false&max-results=200&start-index=' + ndxbase + '&alt=json-in-script&callback=showTopCommenters"></' + 'script>');
return;
}

// Convert object to array of tuples
var tuplear = [];
for (var key in topcommenters) tuplear.push([key, topcommenters[key]]);

tuplear.sort(function(a, b) {
if (b[1].count - a[1].count) return b[1].count - a[1].count;
return (a[1].author.name.$t.toLowerCase() < b[1].author.name.$t.toLowerCase()) ? -1 : 1;
});

// List top commenters:
var realcount = 0;
for (var k = 0; k < maxTopCommenters && k < tuplear.length; k++) {
var item = tuplear[k][1];
if (item.count < minComments) break;
document.write('<di' + 'v class="top-commenter-line">');
document.write(replaceTopCmtVars(txtTopLine, item, realcount + 1));
document.write('</d' + 'iv>');
realcount++;
}
if (!realcount) document.write(txtNoTopCommenters);
}
document.write('<scr' + 'ipt type="text/javascript" src="' + homepage + '/feeds/comments/default?redirect=false&max-results=200&alt=json-in-script&callback=showTopCommenters"></' + 'script>');
</script>

</body>
</html>

Recent Post dan Recent Comment pada Drop Down Menu??

Recent Post dan Recent Comment pada Drop Down Menu??
Widget Blogger pada Menu Navigasi

Seringkali Saya melihat beberapa orang mencoba menuliskan semua kategori posting pada drop down menu. Mereka melakukannya secara manual. Saya pikir, seandainya Saya bisa menggunakan JSON untuk ini, maka mereka tidak perlu lagi repot-repot memperbaharui menu setiap kali label baru ditambahkan.

Tapi setelah Saya coba ternyata hasilnya proses muat halaman menjadi sangat lambat. Jadi Saya mencoba menggunakan alternatif menarik lainnya, yaitu widget recent post dan recent comment yang Saya letakkan pada menu-menu sekunder. Kita tahu bahwa kebanyakan widget semacam ini dibangun oleh elemen-elemen daftar, oleh karena itulah kita bisa menaruhnya dengan sangat pas ke dalam menu (yang juga dibangun oleh elemen-elemen daftar).

Masih sama. Halaman menjadi sedikit lebih lambat. Ya, itu terjadi karena widget-widget ini harus memanggil feed posting untuk menampilkan isi widget tersebut. Terlebih lagi, menu navigasi secara umum diletakan di bagian atas, sehingga jika proses pemuatan menu navigasi lebih lambat dari biasanya, maka peramban akan terlambat pula saat membaca elemen-elemen di bawahnya, karena peramban membaca seperti manusia, dari kiri atas menuju ke kanan bawah (Kesimpulan: Proses muat halaman menjadi lambat).

Solusi Saya adalah dengan cara meletakkan menu navigasi ini pada bagian paling bawah, tepatnya di atas </body> sehingga kita harap widget ini akan memulai proses pemuatan posting saat elemen-elemen di atasnya sudah cukup siap. Dan untuk mengangkat menu navigasi yang berada di bawah menuju ke atas, Saya menggunakan posisi absolute dengan nilai top sebesar 0:

Masuklah ke menu Template kemudian klik Edit HTML dan klik Lanjutkan:

Edit HTML Blogger
Mengedit HTML

Temukan kode ini:

</head>

Salin kode ini dan letakkan di atasnya:

<style>
#autonav {
position:absolute;
top:0;
right:0;
left:0;
z-index:9999;
margin:0;
padding:0;
font:normal normal 11px/normal Helmet,Freesans,Sans-Serif;
color:white;
border-bottom:2px solid #333;
-webkit-box-shadow:0 1px 7px rgba(0,0,0,.4);
-moz-box-shadow:0 1px 7px rgba(0,0,0,.4);
box-shadow:0 1px 7px rgba(0,0,0,.4);
}

#autonav ul {
margin:0;
padding:0;
height:30px;
background-color:#0F5079;
}

#autonav ul li {
list-style:none;
display:inline;
float:left;
margin:0;
padding:0;
position:relative;
}

#autonav ul li a {
display:block;
line-height:30px;
height:30px;
overflow:hidden;
margin:0;
padding:0 15px;
border-left:1px solid #155F90;
border-right:1px solid #082E46;
text-decoration:none;
text-shadow:0 -1px 0 rgba(0,0,0,.4);
color:white;
font-weight:bold;
}

#autonav ul li a:hover,
#autonav ul li:hover > a {
background-color:#0F486C;
border-right-color:#082434;
}

#autonav ul ul {
position:absolute;
width:220px;
height:auto;
top:100%;
left:0;
z-index:9999;
background-color:#111;
-webkit-box-shadow:0 1px 3px rgba(0,0,0,.7);
-moz-box-shadow:0 1px 3px rgba(0,0,0,.7);
box-shadow:0 1px 3px rgba(0,0,0,.7);
overflow:visible !important;
display:none;
}

#autonav ul ul:before {
content:"";
width:0;
height:0;
border:7px solid transparent;
border-bottom-color:#111;
position:absolute;
top:-14px;
left:24px;
}

#autonav ul ul li {
display:block;
float:none;
}

#autonav ul ul li a {
border:none;
color:#999;
}

#autonav ul ul ul {
top:0;
left:100%;
}

#autonav li:hover > ul {display:block}

/* Khusus JSON */
#autonav ul.json-dropdown {overflow:hidden}

#autonav ul.json-dropdown li {
cursor:pointer;
display:block;
padding:7px 10px;
margin:0;
overflow:hidden;
}

#autonav ul.json-dropdown li a {
line-height:14px;
height:auto !important;
padding:0;
}

#autonav ul.json-dropdown li a:hover {
text-decoration:underline;
background:transparent;
}

#autonav li ul li a:hover,
#autonav li ul.json-dropdown li:hover {background-color:#000}

#autonav ul.json-dropdown img.rp-thumb {
padding:0;
outline:none;
border:2px solid #333;
background-color:#02406C;
display:block;
float:left;
margin:0 10px 0 0;
width:40px;
height:40px;
}

#autonav .subposts span,
#autonav .subcomments span {
font-family:Verdana,Tahoma,Helmet,Freesans,Sans-Serif;
color:#666;
font-size:9px;
}

/* Drop down menu untuk ukuran yang cukup lebar */
#autonav .wide {width:400px}
</style>
<script>
//<![CDATA[
var numpost = 7,
numcomment = 7,
cmtext = "Komentar",
cmsumm = 100,
pBlank = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAA3NCSVQICAjb4U/gAAAADElEQVQImWOor68HAAL+AX7vOF2TAAAAAElFTkSuQmCC";
//]]>
</script>
<script src='http://dte-project.googlecode.com/svn/trunk/json-dropdown.js'></script>

Setelah itu temukan kode ini:

</body>

Salin kerangka menu ini dan letakkan di atasnya:

<nav id='autonav'>
<ul>
<li><a href='/'>Beranda</a></li>
<li><a href='#'>Profil</a></li>
<li><a href='#'>Terbaru</a>
<ul class='json-dropdown subposts wide'>
<script src='http://nama_blog.blogspot.com/feeds/posts/summary?alt=json-in-script&amp;callback=dropdownposts'></script>
</ul>
</li>
<li><a href='#'>Komentar Terakhir</a>
<ul class='json-dropdown subcomments'>
<script src='http://nama_blog.blogspot.com/feeds/comments/summary?alt=json-in-script&amp;callback=dropdowncomments'></script>
</ul>
</li>
<li><a href='#'>Kontak</a>
<ul>
<li><a href='#'>Lorem Ipsum</a></li>
<li><a href='#'>Dolor Sit Amet</a></li>
</ul>
</li>
</ul>
</nav>
  • Tentukan jumlah posting menu recent post pada variabel numpost
  • Tentukan jumlah posting recent comment pada variabel numcomment
  • Tentukan label komentar pada variabel cmtext (misal: 17 Komentar)
  • pBlank digunakan untuk menampilkan gambar cadangan pada recent post yang tidak memiliki gambar mini
  • Tentukan jumah ringkasan komentar pada variabel cmsumm
  • Ganti URL yang Saya beri tanda dengan URL blogmu.

Blogger JSON - Archive List Base

Pembaharuan: 10 Desember 2012

Kode HTML Lengkap:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Demo</title>
</head>
<body>


<div id="archive-container">Memuat...</div>
<script type="text/javascript">
// Blogger JSON - Archive List
var postTitle = [],
postUrl = [],
postDate = [],
postMonth = [],
postYear = [],
postYearMonth = [],
postDateNum = [],
monthArray = ["Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"], link, enclosure;

function loadArchive(json) {
if ("entry" in json.feed) {
var total = json.feed.entry.length;
for (var i = 0; i < total; i++) {
var entry = json.feed.entry[i],
title = entry.title.$t,
a = entry.published.$t.substring(0,10),
b = entry.published.$t.substring(5,7),
c = entry.published.$t.substring(8,10),
pub = monthArray[parseInt(b,10) - 1] + " " + entry.published.$t.substring(0,4),
date = "/" + entry.published.$t.substring(0,4) + "_" + b + "_01_archive.html";
for (var j = 0; j < entry.link.length; j++) {
if (entry.link[j].rel == "alternate") {
link = entry.link[j].href;
break;
}
}
for (var k = 0; k < entry.link.length; k++) {
if (entry.link[k].rel == "enclosure") {
enclosure = entry.link[k].href;
break;
}
}
postTitle.push(title);
postDate.push(a);
postUrl.push(link);
postYearMonth.push(pub);
postYear.push(date);
postDateNum.push(c);
}
}
displayToc();
}

function displayToc() {
var a = 0, b = 0, skeleton = "";
while (b < postTitle.length) {
temp = postYearMonth[b];
skeleton += '<p><strong><a title="' + temp + '" href="' + postYear[b] + '" target="_blank">' + temp + '</a></strong>';
skeleton += '<ul>';
do {
skeleton += '<li>';
skeleton += '<time>[' + postDateNum[a] + ']</time> - <a title="' + postTitle[a] + '" href="' + postUrl[a] + '" target="_blank">' + postTitle[a] + '</a>';
skeleton += '</li>';
a = a + 1;
} while (postYearMonth[a] == temp);
b = a;
skeleton += '</ul>';
if (b > postTitle.length) {
break;
}
}
document.getElementById('archive-container').innerHTML = skeleton;
}

(function() {
var head = document.getElementsByTagName('head')[0],
script = document.createElement('script');
script.type = "text/javascript";
script.src = "http://nama_blog.blogspot.com/feeds/posts/summary/?alt=json-in-script&callback=loadArchive&max-results=9999";
head.appendChild(script);
})();
</script>


</body>
</html>

Blogger JSON - Content List Base

<!DOCTYPE html>
<html>
<head>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
<title>Blogger Table of Contents</title>
<script type="text/javascript">
/**
* CONTENT LIST
*
* Created by : Copycat91 On July 30th 2009
* Website : http://infotentangblog.blogspot.com/
* Original post : http://infotentangblog.blogspot.com/2009/08/membuat-daftar-isi-blog.html
*
* Special thanks to :
* *) http://www.blogger.com for the free blog hosting
* *) http://buzz.blogger.com for the tutorial to convert feed->json
* *) NetBeans IDE 6.5 for the free IDE
* *) And other tutorials about HTML, javascript, json, etc I have read
*/

var all_entries, entries, all_labels = [], json;
function createEntries(json) {
var entries_obj_list = [];
var entries = json.feed.entry;
for (var i = 0; i < entries.length; i++) {
var entry = entries[i];
var entry_obj = new Object;
entry_obj.id = entry.id.$t;
entry_obj.title = entry.title.$t;
entry_obj.href = getEntryHref(entry);
entry_obj.content = getEntryContent(entry);
entry_obj.labels = getEntryLabels(entry);
entry_obj.published = entry.published.$t.substr(0, 10);
entries_obj_list.push(entry_obj);
}
return entries_obj_list;
}

function getEntryById(id) {
for (var i = 0; i < all_entries.length; i++) {
if (all_entries[i].id == id) {
return all_entries[i];
}
}
return null;
}

function getEntryContent(entry) {
return entry.content ? entry.content.$t : entry.summary.$t;
}

function getEntryHref(entry) {
var links = entry.link;
for (var i = 0; i < links.length; i++) {
if (links[i].rel == "alternate") {
return links[i].href;
}
}
return null;
}

function getEntryLabels(entry) {
var labels = [];
var categories = entry.category;
if (!categories) {
return labels;
}
for (var i = 0; i < categories.length; i++) {
var label = categories[i].term;
if (!isExists(all_labels, label)) {
all_labels.push(label);
} // while collecting all labels
labels.push(label);
}
return labels;
}

function getSomeEntries(cmp) {
entries = [];
for (var i = 0; i < all_entries.length; i++) {
var entry = all_entries[i];
if (cmp(entry)) {
entries.push(entry);
}
}
return entries;
}

function isExists(array, val) {
for (var i = 0; i < array.length; i++) {
if (array[i] == val) {
return true;
}
}
return false;
}

function onLoadFeed(json_arg) {
json = json_arg;
setTimeout("onLoadFeedTimeout()", 100);
}

function onLoadFeedTimeout() {
entries = createEntries(json);
all_entries = entries;
showHeaderOption();
showEntries(entries);
}

function showEntries(entries) {
var s = "";
for (var i = 0; i < entries.length; i++) {
var entry = entries[i];
s += "<p>";
s += titleCode(entry);
s += "<span style='font-size:80%;'>" + footlabel + " " + labelsCode(entry);
s += " " + footon + " " + publishedDateCode(entry) + "</span>";
s += "</p>";
}
document.getElementById("cl_content_list").innerHTML = s;
}

function showHeaderOption() {
var s = "";
s += "<table border='0' cellpadding='3'>";
s += "<tr>";
s += "<td style='text-align:right;'>" + sortby;
s += "<td><select onchange='sortBy(this.value.substr(1), this.value.substr(0,1))' style='width:100%;'>";
s += "<option value='0published'>" + timepub + "</option>";
s += "<option value='1title'>" + ptitle + "</option>";
s += "</select>";
s += "<tr>";
s += "<td style='text-align:right'>" + labelsort;
s += "<td><select onchange='showPostsWLabel(this.value)' id='cl_labels' style='width:100%;'>";
s += "<option value='*'>" + showall + "</option>";
for (var i = 0; i < all_labels.length; i++) {
var label = all_labels[i];
s += "<option value='" + label + "'>" + label + "</option>";
}
s += "</select>";
s += "<tr>";
s += "<td><td><button onclick='showPostsWLabel(\"*\");'>" + showall + "</button>";
s += "</table>";
document.getElementById("cl_option").innerHTML = s;
}

function shortenContent(entry) {
var content = entry.content;
content = stripHTML(content);
if (content.length > cl_summlen) {
content = content.substr(0, cl_summlen);
if (content.charAt(content.length - 1) != " ") {
content = content.substr(0, content.lastIndexOf(" ") + 1);
}
content += "...";
}
entry.content = content;
return content;
}

function showHideSummary(obj) {
var p = obj.nextSibling;
while (p.className != "cl_content") {
p = p.nextSibling;
}
var id = p.id;
var entry = getEntryById(id);
var content = shortenContent(entry);
if (p.innerHTML == "") {
p.innerHTML = content + "<br/>";
obj.innerHTML = "&#9660;";
obj.title = hidesum;
} else {
p.innerHTML = "";
obj.innerHTML = "&#9658;";
obj.title = showsum;
}
}

function sortBy(attribute, asc) {
var cmp = function(entry1, entry2) {
if (entry1[attribute] == entry2[attribute]) {
return 0;
}
else if (asc == '1') {
return entry1[attribute].toLowerCase() > entry2[attribute].toLowerCase();
}
else {
return entry1[attribute].toLowerCase() < entry2[attribute].toLowerCase();
}
}
entries.sort(cmp);
showEntries(entries);
}

function stripHTML(s) {
var c;
var intag = false;
var newstr = "";
for (var i = 0; i < s.length; i++) {
c = s.charAt(i);
if (c == "<") {
intag = true;
}
else if (c == ">") {
intag = false;
}
if (c == ">") {
newstr += " ";
}
else if (!intag) {
newstr += c;
}
}
return newstr;
}

// Functions Returning HTML Code
function labelsCode(entry) {
var s = "";
if (entry.labels.length == 0) {
return " (tidak berlabel) ";
}
for (var j = 0; j < entry.labels.length; j++) {
var label = entry.labels[j];
s += "<a href='javascript:showPostsWLabel(\"" + label + "\")' ";
s += "title='" + showlabel + " " + label + "'>" + label + "</a>";
s += (j != entry.labels.length - 1) ? ", " : "";
}
return s;
}

function publishedDateCode(entry) {
var y = entry.published.substr(0, 4);
var m = entry.published.substr(5, 2);
var d = entry.published.substr(8, 2);
var s = "<a href='javascript:showPostsInDate(\"" + y + "\")' title='" + y + "'>" + y + "</a>/";
s += "<a href='javascript:showPostsInDate(\"" + y + "-" + m + "\")' title='" + y + "/" + m + "'>" + m + "</a>/";
s += "<a href='javascript:showPostsInDate(\"" + y + "-" + m + "-" + d + "\")'title='" + y + "/" + m + "/" + d + "'>" + d + "</a>";
return s;
}

function titleCode(entry) {
var s = "<span title='" + showsum + "' onclick='showHideSummary(this)' style='cursor:pointer'>&#9658;</span> ";
s += "<b><a href='" + entry.href + "'>" + entry.title + "</a></b><br/>";
s += "<span class='cl_content' id='" + entry.id + "'></span>";
return s;
}

// Selection Functions
function showPostsInDate(date) {
var cmp = function(entry) {
return entry.published.indexOf(date) == 0;
}
var entries = getSomeEntries(cmp);
showEntries(entries);
}

function showPostsWLabel(label) {
var cmp = function(entry) {
if (label == "*") {
return true;
}
for (var i = 0; i < entry.labels.length; i++) {
if (entry.labels[i] == label) {
return true;
}
}
return false;
}
var entries = getSomeEntries(cmp);
showEntries(entries);
document.getElementById("cl_labels").value = label;
}

</script>
</head>
<body>
<div id="cl_option">Loading...</div>
<div id="cl_content_list"></div>
<script type="text/javascript">
var cl_summlen = 500,
timepub = "Tanggal Publikasi",
ptitle = "Judul Artikel",
sortby = "Urut berdasarkan:",
labelsort = "Filter artikel dengan label:",
showall = "Lihat Semua",
hidesum = "Sembunyikan Rangkuman...",
showsum = "Tampilkan Rangkuman...",
footlabel = "Kategori:",
footon = "di",
showlabel = "Lihat posing dengan label";
</script>
<script src="http://hompimpaalaihumgambreng.blogspot.com/feeds/posts/default?alt=json-in-script&callback=onLoadFeed&max-results=9999"></script>
</body>
</html>
 
Support : Creating Website | Johny Template | Mas Template
Copyright © 2011. Homtimpa - All Rights Reserved
Template Modify by Creating Website
Proudly powered by Blogger