Saturday, April 28, 2012

Posting Auto Read-More Tanpa JavaScript

Posting ini sekaligus sebagai sanggahan dari pernyataan Saya mengenai tidak adanya tag khusus dari Blogger untuk memproduksi ringkasan artikel pada Optimasi Thumbnail pada Auto Read-More Link dan Widget Blogger

Posting Auto Read-More Tanpa JavaScript
Posting Read-More dengan thumbnail berukuran 72 × 72 piksel dan karakter ringkasan sebanyak 100 karakter.

Versi posting auto read-more link yang satu ini adalah murni menggunakan tag data dari Blogger untuk mengambil ringkasan artikel dan thumbnail posting. Kita akan menggunakan ke dua elemen ini untuk menyisipkan ringkasan dan gambar:

Mengambil Ringkasan Posting

<data:post.snippet/>

Mengambil Thumbnail Posting

<img expr:src='data:post.thumbnailUrl'/>

Selama ini Saya tidak menyadarinya, tapi jika kita melihat isi dari widget Posting Populer, maka kita akan menemukan kedua data tersebut di dalamnya (sedikit berbeda pada data:post.thumbnailUrl). Mereka berdua digunakan untuk menampilkan ringkasan artikel sebanyak 100 karakter dan thumbnail berukuran 72 × 72 piksel seperti yang biasanya kita lihat pada widget Posting Populer bawaan dari Blogger - Referensi

<!-- (4) Show snippets and thumbnails -->
<div class='item-content'>
  <b:if cond='data:post.thumbnail'>
    <div class='item-thumbnail'>
      <a expr:href='data:post.href' target='_blank'>
        <img alt='' expr:height='data:thumbnailSize' expr:src='data:post.thumbnail' expr:width='data:thumbnailSize'/>
      </a>
    </div>
  </b:if>
  <div class='item-title'><a expr:href='data:post.href'><data:post.title/></a></div>
  <div class='item-snippet'><data:post.snippet/></div>
</div>
<div class='clear' style='clear: both;'/>

Jika Anda saat ini telah memakai versi auto read-more link script, Anda bisa dengan mudah memodifikasinya. Pada formulir HTML Temlpate, temukan kode ini:

<div expr:id='&quot;summary&quot; + data:post.id'><data:post.body/></div>
<script>createSummaryAndThumb(&quot;summary<data:post.id/>&quot;);</script>

Ganti menjadi seperti ini:

<b:if cond='data:post.thumbnailUrl'>
  <a expr:href='data:post.url'><img class='post-thumbnail' alt='thumbnail' expr:src='data:post.thumbnailUrl'/></a>
<b:else/>
  <a expr:href='data:post.url'><img class='post-thumbnail' alt='thumbnail' src='http://reader-download.googlecode.com/svn/trunk/images/no-image-72x72.png'/></a>
</b:if>
<div class='post-snippet'><data:post.snippet/></div>

Setelah itu temukan kode ini:

]]></b:skin>

Letakkan kode CSS ini di atasnya untuk mengatur posisi thumbnail:

.post-thumbnail {
  width:72px;
  height:72px;
  float:left;
  margin:2px 10px 0 0;
}

Terakhir, Anda bisa membuang script auto read-more link yang biasanya terletak di atas </head>

Klik Simpan Template.

Jika posting Anda masih berupa posting biasa, carilah kode ini:

<data:post.body/>

Ganti dengan kode ini:

<b:if cond='data:blog.pageType != &quot;static_page&quot;'>
  <b:if cond='data:blog.pageType != &quot;item&quot;'>
    <b:if cond='data:post.thumbnailUrl'>
      <a expr:href='data:post.url'><img class='post-thumbnail' alt='thumbnail' expr:src='data:post.thumbnailUrl'/></a>
    <b:else/>
      <a expr:href='data:post.url'><img class='post-thumbnail' alt='thumbnail' src='http://reader-download.googlecode.com/svn/trunk/images/no-image-72x72.png'/></a>
    </b:if>
    <div class='post-snippet'>
      <data:post.snippet/>
    </div>
    <div class='rm-button-wrap'>
      <a class='button' expr:href='data:post.url'>Baca Selengkapnya</a>
    </div>
  </b:if>
</b:if>

<b:if cond='data:blog.pageType == &quot;item&quot;'>
  <data:post.body/>
</b:if>
<b:if cond='data:blog.pageType == &quot;static_page&quot;'>
  <data:post.body/>
</b:if>

Klik Simpan Template.

Masalah Interpretasi Tag HTML

<data:post.snippet/> memiliki sikap yang tidak lazim jika dilihat dari segi perannya di dalam menampilkan ringkasan artikel. Dia akan memparse semua kode HTML yang pernah kita ketik di dalam posting menjadi apa adanya. Sehingga hal-hal aneh semacam ini mungkin akan Anda alami terutama jika Anda memiliki posting dengan kumpulan kode HTML di dalamnya:

Blogger sepertinya sudah memperbaiki masalah ini.

Tag HTML tetap Diinterpretasikan Sebagai Apa Adanya Tag HTML
Tag HTML yang telah kita parse di dalam posting tetap diinterpretasikan sebagai apa adanya tag HTML, sehingga hal ini seringkali akan membuat posting Anda menjadi berantakan dan tidak valid (banyak kode yang tidak lengkap dan tidak seharusnya berada di dalam posting).

Kita bisa saja menggunakan JavaScript untuk menghilangkan semua tag HTML di dalamnya, tapi di sini Saya ingin merealisasikan isi artikel sesuai dengan judulnya (tanpa JavaScript). Jadi untuk kasus ini Saya akan menggunakan CSS Pseudo-Element.

Kita tidak akan meletakkan data:post.snippet sebagai elemen apa adanya seperti halnya saat kita menuliskan kode <data:post.snippet/>, tapi kita akan memasukkannya ke dalam atribut seperti ini:

<div class='post-snippet' expr:data-snippet='data:post.snippet'></div>

Dengan cara di atas, maka deskripsi posting akan tersimpan di dalam atribut data-snippet. Dan untuk menampilkan nilai atribut tersebut sebagai teks, kita bisa menggunakan CSS Pseudo-Element :before atau :after seperti ini:

.post-snippet:before {
  content:attr(data-snippet);
}

Labels: , ,

Thursday, April 26, 2012

CSS3 Slideshow Tanpa Loncatan Halaman

Pure CSS3 Slideshow Without Page Jump

Saya sudah sangat sering melihat beberapa eksperimen tentang slideshow dengan CSS3 yang memanfaatkan selektor :target untuk mengakses setiap slide. Sehingga jika salah satu tombol navigasi diklik, maka salah satu slide dengan ID yang sesuai dengan #hash pada URL akan ditampilkan:

#css3-slider img {
  display:none;
}

#css3-slider img:target {
  display:block;
}

Namun sayangnya CSS :target akan membuat halaman meloncat. Ini adalah sikap normal konsep fragment identifier halaman » Tentang CSS :target

Ada satu cara lain untuk mengakses setiap slide tanpa menyebabkan loncatan halaman, yaitu dengan menggunakan hack elemen input bertipe checkbox atau radio. Mereka bisa dimanfaatkan karena mereka memiliki selektor pseudo-class :checked. Dan tentunya, elemen input tidak akan menyebabkan loncatan halaman seperti halnya tautan. Sedangkan untuk mengakses setiap slide, kita akan menggunakan selektor + atau ~ untuk mengakses elemen yang terletak tepat di sebelah elemen yang ditandai/dicentang (:checked).

Beginilah konsep yang Saya gunakan: Kita menggunakan elemen <label> untuk mengeksekusi elemen <input type="radio">, sehingga kita bisa mengatur tampilannya dan bisa melupakan radio yang tidak pernah bisa diubah tampilannya menggunakan CSS (Setidaknya untuk saat ini. Masa depan, siapa yang tahu?) Kita menggunakan radio hanya sebagai penyimpan aksi checked atau unchecked untuk mengakses setiap slide secara bergantian:

#css3-slider img {
  display:none;
}

#css3-slider input:checked + img {
  display:block;
}
<input type="radio" name="num" id="s1" />
<label for="s1">1</label>
<img src="slide1.png" />

Versi Lengkap

Berikut ini adalah versi lengkap dari konsep yang Saya nyatakan di atas untuk mengatasi masalah loncatan halaman karena CSS :target. Setelah ini Anda tidak lagi memerlukan CSS :target, yang Anda perlukan hanya radio. Agak sulit untuk dijelaskan secara tertulis, Anda hanya bisa mengetahui cara kerjanya dengan cara mempelajari kode di bawah ini setelah Anda mengerti tentang Adjacent Sibling Selectors:

HTML

<ul id='css3-slider'>
    <li>
        <input type='radio' id='s1' name='num' checked='true' />
        <label for='s1'>1</label>
        <a href='/'>
            <img src='slide-1.jpg' />
            <span>Why do you put the egg yolks on your eyes?</span>
        </a>
    </li>
    <li>
        <input type='radio' id='s2' name='num' />
        <label for='s2'>2</label>
        <a href='/'>
            <img src='slide-2.jpg' />
            <span>How can you look ahead if your eyes are on the side?</span>
        </a>
    </li>
    <li>
        <input type='radio' id='s3' name='num' />
        <label for='s3'>3</label>
        <a href='/'>
            <img src='slide-3.jpg' />
            <span>Keep praying to God</span>
        </a>
    </li>
    <li>
        <input type='radio' id='s4' name='num' />
        <label for='s4'>4</label>
        <a href='/'>
            <img src='slide-4.jpg' />
            <span>Stay relaxed</span>
        </a>
    </li>
    <li>
        <input type='radio' id='s5' name='num' />
        <label for='s5'>5</label>
        <a href='/'>
            <img src='slide-5.jpg' />
            <span>And you will forever be relaxed</span>
        </a>
    </li>
</ul>

CSS

/*
 * Pure CSS3 Slideshow Without Page Jump by Taufik Nurrohman
 * 26 April 2012
 * http://dte-feed.blogspot.com
 */

/* General */
#css3-slider {
  margin:30px auto;
  padding:0px 0px;
  width:448px;
  height:286px;
  position:relative;
}

#css3-slider li {
  list-style:none;
  margin:0px 0px;
  padding:0px 0px;
}

/* Navigation */
#css3-slider li input + label {
  position:absolute;
  bottom:5px;
  left:10px;
  z-index:999;
  font:bold 11px/16px Arial,Sans-Serif;
  background-color:black;
  color:white;
  padding:0px 0px;
  width:16px;
  text-align:center;
  cursor:pointer;
}

#css3-slider li:nth-child(2) label {left:28px;}
#css3-slider li:nth-child(3) label {left:46px;}
#css3-slider li:nth-child(4) label {left:64px;}
#css3-slider li:nth-child(5) label {left:82px;}

/* Images */
#css3-slider li img {
  border:none;
  outline:none;
  position:absolute;
  top:50%;
  left:50%;
  width:0px;
  height:0px;
  visibility:hidden;
  opacity:0;
  -webkit-transition:all 2s ease-in-out;
  -moz-transition:all 2s ease-in-out;
  -ms-transition:all 2s ease-in-out;
  -o-transition:all 2s ease-in-out;
  transition:all 2s ease-in-out;
  -webkit-transform:rotate(0deg) scale(0);
  -moz-transform:rotate(0deg) scale(0);
  -ms-transform:rotate(0deg) scale(0);
  -o-transform:rotate(0deg) scale(0);
  transform:rotate(0deg) scale(0);
}

/* Captions */
#css3-slider a {
  text-decoration:none !important;
}

#css3-slider li a span {
  display:block;
  position:absolute;
  right:0px;
  bottom:0px;
  left:0px;
  background-color:rgba(0,0,0,0.8);
  font:normal 11px/26px Arial,Sans-Serif;
  color:white;
  padding:0px 10px;
  text-align:right;
  opacity:0;
  viibility:hidden;
  -webkit-transition:all 2s ease-in-out;
  -moz-transition:all 2s ease-in-out;
  -ms-transition:all 2s ease-in-out;
  -o-transition:all 2s ease-in-out;
  transition:all 2s ease-in-out;
}

/* Active navigation */
#css3-slider li input:checked + label {
  background-color:#39f;
  color:white;
}

/* Show the image with transition */
#css3-slider li input:checked ~ img,
#css3-slider li input:checked ~ a img {
  top:0%;
  left:0%;
  width:448px;
  height:286px;
  visibility:visible;
  -webkit-transform:rotate(720deg) scale(1);
  -moz-transform:rotate(720deg) scale(1);
  -ms-transform:rotate(720deg) scale(1);
  -o-transform:rotate(720deg) scale(1);
  transform:rotate(720deg) scale(1);
  opacity:1;
  z-index:99;
}

/* Show the caption with fade effect */
#css3-slider li input:checked ~ a span {
  opacity:1;
  z-index:100;
}

/* Hide the radio */
#css3-slider input {
  display:none;
}

Lihat Demo

Slideshow ini bekerja pada semua peramban yang memiliki prefiks CSS3 yang tercantum di atas (FF, Opera, Chrome, Safari dan IE). Masih tetap bisa bekerja pada IE9 dengan fallback yang baik (slide berpindah tanpa efek transisi). Tampilan terbaik pada Opera 11.62

Labels: , , ,

Wednesday, April 25, 2012

Memanfaatkan Plugin .highlight() untuk Menandai Kata Kunci Hasil Pencarian

Plugin .highlight() digunakan untuk menandai setiap teks yang telah ditentukan. Penulisannya seperti ini:

// $(selektor).highlight('teks', 'kelas');
$('p').highlight('lorem', 'yellow');

Kode di atas akan membungkus semua kata "lorem" di dalam paragraf dengan elemen <span class="yellow">, dengan begitu kita bisa memberikan tanda tertentu pada teks tersebut, misalnya mengubah warna latar menjadi berwarna kuning agar teks yang terbungkus elemen span.yellow menjadi berlatar kuning:

.yellow {
  background-color:yellow;
}

Tapi cobalah untuk tidak membatasi diri. Kita bisa menggunakan plugin tersebut untuk menandai setiap karakter yang cocok dengan kata kunci dalam halaman hasil pencarian, sehingga halaman hasil pencarian akan tampak lebih komunikatif dan jelas. Pada intinya kita akan mengambil kata kunci yang tercantum di dalam URL pada Address Bar, kemudian ambil karakter tersebut sebagai karakter yang akan kita tandai:

Mengambil Karakter pada URL Pencarian
Mengambil Karakter pada URL Pencarian

Kita akan menggunakan JavaScript window.location.search untuk mengambil karakter tersebut. Tapi karena window.location.search akan mencetak karakter input beserta simbol ?query= pada URL, maka kita harus memodifikasinya sedikit. Dan juga, untuk simbol + yang menjadi pengganti simbol spasi, itu juga harus diganti:

// Contoh: http://www.namasitus.com/search?query=lorem+ipsum

var qs = window.location.search; // Akan menghasilkan nilai "?query=lorem+ipsum"
    // Ubah semua karakter encoded URI menjadi karakter normal,
    // hapus simbol "?query="
    // dan ubah simbol "+" menjadi spasi
    qs = decodeURIComponent(qs.replace(/\?query=/, "").replace(/\+/g, " ")); // Akan mengasilkan nilai "lorem ipsum" (tanpa tanda petik)

Setelah variabel qs berhasil ditentukan, tugas selanjutnya hanyalah menerapkan variabel ke dalam plugin:

jQuery.fn.highlight = function(str, className) {
    var regex = new RegExp(str, "gi");
    return this.each(function() {
        $(this).contents().filter(function() {
            return this.nodeType == 3 && regex.test(this.nodeValue);
        }).replaceWith(function() {
            return (this.nodeValue || "").replace(regex, function(match) {
                return "<span class=\"" + className + "\">" + match + "</span>";
            });
        });
    });
};
var qs = window.location.search;
    qs = decodeURIComponent(qs.replace(/\?query=/, "").replace(/\+/g, " "));
$('*').highlight(qs, 'yellow');

Sebagai tambahan kecil, mungkin Anda juga ingin menampilkan pesan-pesan seperti, "Hasil pencarian untuk kata kunci ... " atau, "Tidak ditemukan!". Itu bisa dibuat dengan menciptakan peraturan berdasarkan kondisi:

if(window.location.search) {
    $('#message').html('<h2>Hasil penelusuran untuk kata kunci \"' + qs + '\"</h2>');
    if($('span.yellow').length == 0) {
        $('#message').html('<h2>Tidak ditemukan!</h2>');
    }
}

Jika karakter window.location.search ada/ditemukan (ditemukan setelah menekan tombol Submit atau tombol Enter pada papan kunci), sisipkan pesan hasil penelusuran pada elemen #message. Setelah itu maka plugin akan bekerja untuk menandai seluruh teks yang sesuai dengan nilai variabel qs yang kita dapatkan dari URL. Setelah plugin menjalankan tugasnya, maka elemen <span class="yellow"> akan menyebar ke seluruh teks yang telah ditemukan. Tapi jika elemen span.yellow tidak ditemukan, ganti keterangan hasil penelusuran dengan pernyataan bahwa hasil penelusuran tidak ditemukan.

Terakhir adalah membuat formilir pencarian:

<form action="/search.html">
    <input name="query" type="text" value="" />
    <input type="submit" value="Cari!" />
</form>

Lihat Demo

Labels: ,

Tuesday, April 24, 2012

Membuat Sistem Penomoran Otomatis pada Setiap Baris Kode di dalam Tag PRE

Membuat Penomoran Otomatis pada Setiap Baris Kode di dalam Tag PRE

Cara termudah untuk menciptakan baris-baris angka di dalam tag <pre> adalah dengan menghitung jumlah karakter ganti baris di dalamnya, kemudian kita gunakan hasilnya untuk menciptakan deret angka yang nantinya akan mengalir secara otomatis.

Kita mulai dengan markup HTML seperti ini sebagai gambaran awal:

<pre><code>Baris teks 1
Baris teks 2
Baris teks 3</code></pre>

Pertama-tama kita harus menyeleksi semua elemen <pre>:

var pre = document.getElementsByTagName('pre'),
    pl = pre.length;
for (var i = 0; i < pl; i++) {
    // Lakukan sesuatu di sini melalui objek pre[i] ...
}

Setelah itu buat kontainer baris-baris angka dengan elemen <span>:

var pre = document.getElementsByTagName('pre'),
    pl = pre.length;
for (var i = 0; i < pl; i++) {
    // Sisipkan kontainer angka-angka
    pre[i].innerHTML = '<span class="line-number"></span>' + pre[i].innerHTML + '<span class="cl"></span>';
}

Markup HTML saat ini seharusnya sudah menjadi seperti ini:

<pre><span class="line-number"></span><code>Baris teks 1
Baris teks 2
Baris teks 3</code><span class="cl"></span></pre>

Hitung jumlah karakter ganti baris (\n) di dalam masing-masing elemen <pre>. Buat sebuah loop dengan batasan akhir sebanyak/sebesar jumlah karakter ganti baris yang ditemukan untuk membatasi jumlah angka-angka yang masuk ke dalam kontainer angka secara otomatis:

var pre = document.getElementsByTagName('pre'),
    pl = pre.length;
for (var i = 0; i < pl; i++) {
    // Sisipkan kontainer angka
    pre[i].innerHTML = '<span class="line-number"></span>' + pre[i].innerHTML + '<span class="cl"></span>';
    // Hitung jumlah karakter `\n` di dalam tag <pre>
    var num = pre[i].innerHTML.split(/\n/).length;
    for (var j = 0; j < num; j++) {
        // Menangkap elemen <span> pertama / elemen `.line-number`
        var line_num = pre[i].getElementsByTagName('span')[0];
        // Masukkan angka-angka ke dalam kontainer angka melalui elemen <span> baru
        line_num.innerHTML += '<span>' + (j+1) + '</span>';
    }
}

Sekarang markup HTML sudah menjadi seperti ini:

<pre><span class="line-number"><span>1</span><span>2</span><span>3</span></span><code>Baris teks 1
Baris teks 2
Baris teks 3</code><span class="cl"></span></pre>

Sisanya tinggal memposisikan kontainer angka ke bagian samping dengan CSS agar letaknya menjadi berada di sebelah kiri kode-kode yang kita tuliskan di dalam tag <pre>:

pre {
  background-color:#eee;
  overflow:auto;
  margin:0 0 1em;
  padding:.5em 1em;
}

pre code,
pre .line-number {
  /* Ukuran line-height antara teks di dalam tag <code> dan <span class="line-number"> harus sama! */
  font:normal normal 12px/14px "Courier New",Courier,Monospace;
  color:black;
  display:block;
}

pre .line-number {
  float:left;
  margin:0 1em 0 -1em;
  border-right:1px solid;
  text-align:right;
}

pre .line-number span {
  display:block;
  padding:0 .5em 0 1em;
}

pre .cl {
  display:block;
  clear:both;
}

Lihat Demo


Hasil Seluruh Pekerjaan + Dekorasi

HTML

<pre><code> ... </code></pre>

JavaScript

(function() {
    var pre = document.getElementsByTagName('pre'),
        pl = pre.length;
    for (var i = 0; i < pl; i++) {
        pre[i].innerHTML = '<span class="line-number"></span>' + pre[i].innerHTML + '<span class="cl"></span>';
        var num = pre[i].innerHTML.split(/\n/).length;
        for (var j = 0; j < num; j++) {
            var line_num = pre[i].getElementsByTagName('span')[0];
            line_num.innerHTML += '<span>' + (j+1) + '</span>';
        }
    }
})();

CSS

pre {
  background-color:white;
  padding:0 1em;
  white-space:pre;
  word-wrap:normal;
  overflow:auto;
}

pre code,
pre .line-number {
  display:block;
  font:normal normal 13px/24px "Consolas","Bitstream Vera Sans Mono","Courier New",Courier,monospace !important;
  color:#006699;
}

pre .line-number {
  float:left;
  margin:0 1em 0 -1em;
  color:#aaa;
  background-color:#f5f5f5;
  border-right:3px solid #6CE26C;
  text-align:right;
  min-width:2.5em;
}

pre .line-number span {
  display:block;
  padding:0 .5em 0 1em;
}

pre .line-number span:nth-child(even) {background-color:#eee}

pre .cl {
  display:block;
  clear:both;
}

Lihat Demo

Labels: , ,

Monday, April 23, 2012

Bungkus/Pisahkan Setiap Baris Kata dengan Elemen

$('div').each(function() {
    var d = $(this).html();
    $(this).html('<p>' + d.replace(/[\r\n]+(?=[^\r\n])/g, '</p><p>') + '</p>');
});

Kode di atas akan mengubah sekelompok teks yang tadinya seperti ini:

<div>Lorem ipsum
dolor sit amet
consectetuer
adipiscing elit.</div>

menjadi seperti ini:

<div><p>Lorem ipsum</p>
<p>dolor sit amet</p>
<p>consectetuer</p>
<p>adipiscing elit.</p></div>

Lihat Demo

Namun kode di atas hanya berlaku untuk ganti baris berupa \r dan \n. Jika Anda sedang berhubungan dengan ganti baris berupa elemen <br>, Anda bisa menggunakan ini:

$('div').contents().filter(function() {
    // Select all textnodes
    return this.nodeType == 3;
}).wrap('<p></p>'); // Place them inside paragraph elements
$('br', 'div').remove(); // Remove the line-break

Lihat Demo


  1. Stackoverflow - How to Strip Out <br> Tags and Wrap Lines with <p> and </p> Tags?
  2. Stackoverflow - jQuery, Remove New Line Then Wrap Textnodes with <p>

Labels: , , ,

Mengubah URL YouTube menjadi Video

Video
$('p').html(function(i, html) {
    var re  = /(?:http:\/\/)?(?:www\.)?(?:youtube\.com|youtu\.be)\/(?:watch\?v=)?(.+)/g,
        vid = '<iframe width="420" height="345" src="//www.youtube.com/embed/$1" allowfullscreen></iframe>';
    return html.replace(re, vid);
});

Lihat Demo

Lolos untuk dua bentuk URL YouTube seperti ini:

http://youtu.be/-joKveiaabA
http://www.youtube.com/watch?v=-joKveiaabA

Sumber: How to Convert a YouTube Video URL to the Iframe Embed Code, using jQuery

Labels: , , ,

Membuat Facebox/Like Box Preloader

Di sini Saya menggunakan metode Iframe Preloader yang pernah Saya tuliskan untuk menahan proses muat widget Facebox pada blog. Dengan cara ini maka proses muat halaman akan menjadi lebih cepat karena kita telah menahan Facebox untuk memuat sebelum keseluruhan halaman berhasil termuat:

Lihat Demo

Sebelum melanjutkan ke langkah pembuatannya (atau lebih tepatnya: langkah modifikasi), Anda harus sudah memiliki widget Facebox pada blog Anda. Jika belum, buat widget Facebox Anda terlebih dahulu » Telusuri tentang cara membuat widget Facebox di blog

Preloader ini hanya berlaku untuk Facebox yang ditampilkan melalui iframe, jadi saat Anda memilih kode widget, ambi yang berada pada tab Iframe:

Kode Iframe Facebox/Like Box

Untuk membuatnya, pertama-tama masuklah ke menu Template kemudian klik Edit HTML dan klik Lanjutkan:

Edit HTML Blogger
Mengedit HTML

Temukan kode ini:

]]></b:skin>

Salin kode CSS di bawah ini lalu letakkan di atasnya:

/* Iframe Preloader */
.framePreloader iframe {
  background-color:white;
  border:0 !important;  
  display:block;
  margin:0 auto;
}

Setelah itu temukan kode ini:

</body>

Salin kode di bawah ini kemudian letakkan di atasnya:

<script>
//<![CDATA[
window.onload = function() {
    function createIframe(src, w, h, frID) {
        var i = document.createElement('iframe');
        i.src = src;
        i.scrolling = 'auto';
        i.frameborder = 0;
        i.style.width = w;
        i.style.height = h;
        document.getElementById(frID).appendChild(i);
    }

    // Definisikan dimensi, URL iframe dan tempat sasaran muat iframe di sini...
    createIframe("URL-Iframe", "Lebar Iframe", "Tinggi Iframe", "ID Kontainer");

}
//]]>
</script>

Klik Simpan Template. Sekarang kita masuk ke tahap pengaturan.

Pengaturan

Dalam iframe Facebox, Anda akan menemukan beberapa kode yang nantinya harus Anda masukkan ke dalam preloader. Berikut ini adalah sebuah contoh dari iframe Facebox yang akan Anda dapatkan saat Anda mengeklik tombol Get Code:

<iframe src="//www.facebook.com/plugins/likebox.php?href=http%3A%2F%2Fwww.facebook.com%2Fplatform&amp;width=292&amp;height=290&amp;colorscheme=light&amp;show_faces=true&amp;border_color&amp;stream=false&amp;header=true" scrolling="no" style="border:none; overflow:hidden; width:292px; height:290px;" allowTransparency="true"></iframe>

Kita akan mengambil nilai atribut src, ukuran lebar dan tinggi pada iframe tersebut saja, sementara sisanya bisa kita buang.

Tambahkan sebuah elemen halaman HTML/JavaScript (atau cukup gunakan formulir widget Facebox lama Anda). Di dalam formulirnya, letakkan kode ini:

<div class="framePreloader" id="framePreloader1"></div>

Kode di atas digunakan untuk memuat iframe Facebox Anda. Simpan perubahan widget Anda.

Kembali pada fungsi yang telah kita letakkan di atas </body>, ubah variabel-variabelnya menjadi seperti ini:

createIframe("//www.facebook.com/plugins/likebox.php?href=http%3A%2F%2Fwww.facebook.com%2Fplatform&amp;width=292&amp;height=290&amp;colorscheme=light&amp;show_faces=true&amp;border_color&amp;stream=false&amp;header=true", "292px", "290px", "framePreloader1");

Klik Simpan Template dan lihat hasilnya.

Catatan: Script ini tidak hanya berlaku untuk satu buah iframe saja. Anda bisa menggunakan satu fungsi ini untuk menunda proses muat beberapa iframe sekaligus. Pada intinya, yang terpenting adalah buat elemen-elemen kontainer yang akan kita gunakan sebagai wadah iframe seperti ini:

<div class="framePreloader" id="framePreloader1"></div>
<div class="framePreloader" id="framePreloader2"></div>
<div class="framePreloader" id="framePreloader3"></div>
<div class="framePreloader" id="framePreloader4"></div>

Setelah itu Anda bisa menggandakan fungsinya seperti ini:

createIframe("iframe1.html", "250px", "300px", "framePreloader1");
createIframe("iframe2.html", "250px", "300px", "framePreloader2");
createIframe("iframe3.html", "250px", "300px", "framePreloader3");
createIframe("iframe4.html", "250px", "300px", "framePreloader4");

Labels: ,

Sunday, April 22, 2012

JQuery Highlight Text Plugin

jQuery.fn.highlight = function(str, className) {
    var regex = new RegExp(str, "gi");
    return this.each(function() {
        $(this).contents().filter(function() {
            return this.nodeType == 3 && regex.test(this.nodeValue);
        }).replaceWith(function() {
            return (this.nodeValue || "").replace(regex, function(match) {
                return "<span class=\"" + className + "\">" + match + "</span>";
            });
        });
    });
};

Penggunaan

Seleksi sebuah elemen kemudian terapkan fungsi .highlight("teks", "nama-kelas"):

$('p').highlight("lorem ipsum", "yellow");

Lihat Demo


Sumber: A Web Coding Blog - Highlight Words in Text with jQuery

Labels: , , ,

Set Nilai Berdasarkan URL pada Address Bar

Pembaharuan 2018/05/04: Query String Parser

Gambar Situs Google Translate
Beberapa situs memiliki kemampuan untuk mengeset formulir-formulir mereka berdasarkan URL

Setelah sekian lama merasa penasaran tentang bagaimana cara Google Translate mengeset nilai pada formulir mereka berdasarkan URL, akhirnya Saya menemukannya! Fungsi ini digunakan untuk mengambil queri dari URL yang nantinya bisa kita gunakan untuk mengeset/menentukan nilai dari sebuah formulir atau apa saja berdasarkan queri pada URL:

function getUrlQueryString(param) {
    var outObj = {};
    var qs = window.location.search;
    if (qs !== "") {
        qs = decodeURIComponent(qs.replace(/\?/, ""));
        var paramsArray = qs.split("&");
        var length = paramsArray.length;
        for (var i = 0; i < length; ++i) {
            var nameValArray = paramsArray[i].split("=");
            nameValArray[0] = nameValArray[0].toLowerCase();
            if (outObj[nameValArray[0]]) {
                outObj[nameValArray[0]] = outObj[nameValArray[0]] + ";" + nameValArray[1];
            } else {
                if (nameValArray.length > 1) {
                    outObj[nameValArray[0]] = nameValArray[1];
                } else {
                    outObj[nameValArray[0]] = true;
                }
            }
        }
    }
    var retVal = param ? outObj[param.toLowerCase()] : qs;
    return retVal ? retVal : "";
}

Pembaharuan: 12 Juni 2012

function getQueryVariable(variable) {
    var query = window.location.search.substring(1);
    var vars = query.split("&");
    for (var i = 0; i < vars.length; i++) {
        var pair = vars[i].split("=");
        if (pair[0] == variable) {
            return pair[1];
        }
    }
    return (false);
}
getQueryVariable('name');
getQueryVariable('url');
getQueryVariable('email');

Lebih sederhana.

Katakanlah kita memiliki URL seperti ini:

http://www.sitename.com?name=Taufik%20Nurrohman&url=http://latitudu.blogspot.com&email=mamamia@email.com

Dengan menggunakan fungsi di atas kita bisa mengambil karakter Taufik Nurrohman, http://latitudu.blogspot.com dan mamamia@email.com dari URL untuk diambil sebagai variabel, sehingga kita bisa mengeset nilai atribut suatu formulir atau elemen berdasarkan URL pada address bar seperti ini:

JavaScript

var username = getUrlQueryString("name"),
    usersite = getUrlQueryString("url"),
    usermail = getUrlQueryString("email");

document.getElementById('name').value = username;
document.getElementById('site').value = usersite;
document.getElementById('mail').value = usermail;
document.getElementById('view').src = usersite;

HTML

<input id="name" type="text" value="">
<input id="site" type="text" value="">
<input id="mail" type="text" value="">
<iframe id="view" src=""></iframe>

Sebagai contoh, di sini terdapat tiga buah URL yang sama namun dengan queri yang berbeda. Coba Anda kunjungi satu persatu. Saya harap Anda mengerti apa yang Saya maksudkan setelah ini:

http://tovic.github.com/dte-project/demo-javascript-set-value-from-url.html?name=Taufik%20Nurrohman&url=http://lie-out.blogspot.com
http://tovic.github.com/dte-project/demo-javascript-set-value-from-url.html?name=Mei%20Sari%27ah&url=http://ra-miftahul-jannah.blogspot.com
http://tovic.github.com/dte-project/demo-javascript-set-value-from-url.html?name=Taufik%20Nurrohman%20Saja&url=http://dte-feed.blogspot.com

Contoh nyata mengenai manfaat kode ini adalah untuk menciptakan alat-alat seperti Responsive Site Tester yang memiliki kemampuan untuk menyimpan data ke dalam queri URL, sehingga kita bisa menggunakan URL tersebut sebagai URL berbagi.


Referensi: Stack Overflow – Posting Data Into JavaScript From an URL

Labels: , ,

Mendapatkan Hash dari URL

var url  = "//www.sitename.com/approve.html#section12";
var hash = url.split('#')[1];

Variabel url tidak mutlak. Pada intinya, yang kita perhatikan berada pada .split('#')[1] yang akan mengambil potongan karakter pada urutan ke dua.
Contoh lain, misalnya kita ingin mendapatkan hash dari URL pada address bar:

var hash = window.location.href.split('#')[1];
alert(hash);

Lihat Demo

Edit: Ternyata ada cara yang lebih mudah hehe...

var hash = window.location.hash;

Selengkapnya mengenai window.location baca di MDN - window.location

Labels: , ,

Saturday, April 21, 2012

Memuat Iframe setelah Seluruh Halaman telah Termuat

Teknik pertama Saya temukan dari artikel Iframe Loading Techniques and Performance. Cara kerjanya adalah JavaScript akan menciptakan elemen <iframe> dengan nilai src yang telah ditentukan setelah keseluruhan halaman telah selesai dimuat:

//doesn't block the load event
function createIframe() {
    var i         = document.createElement("iframe");
    i.src         = "path/to/file.html";
    i.scrolling   = "auto";
    i.frameborder = "0";
    i.width       = "100%";  // Lebar iframe
    i.height      = "220px"; // Tinggi iframe
    document.getElementById("frameContainer").appendChild(i); // Sisipkan iframe pada elemen yang memiliki ID 'frameContainer'
};

// Check for browser support of event handling capability
if (window.addEventListener) window.addEventListener("load", createIframe, false);
else if (window.attachEvent) window.attachEvent("onload", createIframe);
else window.onload = createIframe;

Setelah itu buat elemen kontainer yang akan menjadi tempat masuknya iframe:

<div id="frameContainer"></div>

Lihat Demo

Teknik ke dua, menggunakan jQuery. Ini adalah teknik yang cukup mudah dipahami karena kita bisa menuliskan elemen <iframe> secara nyata:

$(window).bind("load", function() {
    $('#frameContainer').html('<iframe src="path/to/file.html" width="100%" height="220px" scrolling="auto"></iframe>');
});

Lihat Demo

Labels: , , ,

Menjaga Keadaan Hover pada Menu Induk

Masalah yang tampak kecil tapi kita harap bisa diperbaiki adalah mengenai efek hover menu induk pada navigasi bertingkat yang akan menghilang setelah pointer memasuki submenu:

Menu Navigasi Sebelum Diperbaiki
Efek hover pada menu induk menghilang saat pointer memasuki submenu

Sebelum

Itu terjadi karena pada umumnya kita menargetkan efek hover pada elemen tautan saja seperti ini:

nav li a:hover {
  background-color:blue;
}

Padahal yang seharusnya kita targetkan adalah elemen list/daftar yang menjadi induk dari submenu, karena submenu berada di dalam elemen <li>, bukan di dalam elemen <a>:

List Item
Susunan Submenu

Sayangnya menargetkan elemen <li> secara sepihak untuk mempertahankan warna menu induk tidak bisa kita lakukan karena efek hover berada pada elemen <a>, sehingga saat pointer keluar dari <a> maka efek hover akan menghilang. Tapi berbeda jika kita menargetkan elemen <li> kemudian memanfaatkan sikap hover pada elemen tersebut untuk mengeset warna direct children tautan di dalamnya:

nav li a:hover,
nav li:hover > a {
  background-color:blue;
}

Dengan cara di atas maka warna pada menu induk akan tetap terjaga meskipun pointer sudah meninggalkannya. Karena meskipun sudah keluar, tapi pada dasarnya pointer masih berada di dalam elemen <li> induk:

Menu Navigasi Sesudah Diperbaiki
Warna hover pada menu induk tetap terjaga

Sesudah


Artikel Terkait:
Mari Berbicara Soal Menu Navigasi

Labels: , , ,

Thursday, April 19, 2012

Memperbesar Avatar/Foto Profil Komentar

Memperbesar Avatar/Foto Profil Komentar

Masuklah ke halaman editor HTML blogmu kemudian salin kode ini dan letakkan di atas kode ]]></b:skin> atau </style>:

#comments li.comment div.avatar-image-container,
#comments li.comment div.avatar-image-container img {
  float:none;
  display:block;
  max-width:none;
  max-height:none;
  width:100px !important;  /* Lebar  avatar */
  height:100px !important; /* Tinggi avatar */
}

#comments li.comment div.comment-block {
  margin-left:120px !important; /* Untuk indentasi tubuh komentar agar foto dan paragraf tidak berdesakan */
}

Klik Simpan Template, kemudian pelajari sendiri :)

Labels: , , ,

Optimasi Thumbnail pada Auto Read-More Link dan Widget Blogger

Ini adalah auto read-more link script yang biasa Anda gunakan untuk mengubah posting asli menjadi ringkasan posting:

<script>
var summary_noimg    = 300,
    summary_img      = 300,
    img_thumb_height = 100,
    img_thumb_width  = 120;
</script>
<script>
//<![CDATA[
/**
 * =======================================================================
 * Auto-readmore link script, version 2.0 (for blogspot) (C)2008 by Anhvo
 * =======================================================================
 */
function removeHtmlTag(strx, chop) {
    if (strx.indexOf("<") != -1) {
        var s = strx.split("<");
        for (var i = 0; i < s.length; i++) {
            if (s[i].indexOf(">") != -1) {
                s[i] = s[i].substring(s[i].indexOf(">") + 1, s[i].length);
            }
        }
        strx = s.join(" ");
    }
    chop = (chop < strx.length - 1) ? chop : strx.length - 2;
    while (strx.charAt(chop - 1) != ' ' && strx.indexOf(' ', chop) != -1) chop++;
    strx = strx.substring(0, chop - 1);
    return strx + '...';
}

function createSummaryAndThumb(pID) {
    var div = document.getElementById(pID);
    var imgtag = "";
    var img = div.getElementsByTagName("img");
    var summ = summary_noimg;
    if (img.length >= 1) {
        imgtag = '<span style="float:left;padding:0px 10px 5px 0px;"><img alt="" src="' + img[0].src + '" width="' + img_thumb_width + 'px" height="' + img_thumb_height + 'px"/></span>';
        summ = summary_img;
    }
    var summary = imgtag + '<div>' + removeHtmlTag(div.innerHTML, summ) + '</div>';
    div.innerHTML = summary;
}
//]]>
</script>

Merasa ada yang aneh dengan itu? Saya rasa tidak. Tapi jika Anda sedikit lebih jeli dan memasuki cara kerjanya lebih dalam, maka Anda akan mengerti beberapa hal:

  • Pertama, script tersebut akan mengurangi jumlah karakter posting yang panjang menjadi lebih pendek sesuai dengan pengaturan pada variabel summary_noimg dan summary_img
  • Ke dua, script tersebut akan menampilkan sebuah gambar mini/thumbnail yang diambil dari gambar pertama pada posting terkait. Ukurannya juga berubah, menjadi lebih kecil. Dalam contoh di atas ukurannya dapat diketahui akan berubah menjadi 120 × 100 piksel (nilainya ada pada variabel img_thumb_width dan img_thumb_height).

Itu berarti bahwa jika kita menerapkan fitur auto-readmore-link pada blog kita, maka kita dapat mempercepat proses muat halaman blog, karena kita pikir kita telah mengubah paragraf posting yang panjang menjadi lebih pendek. Dan bahkan, ukuran gambar telah diperkecil menjadi 120 × 100 piksel.

Tapi kenapa saat Anda mencoba merasakan proses muat halaman blog Anda rasanya tidak ada perbedaan yang terlalu jauh antara kecepatan muat posting yang asli dengan versi yang sudah diringkas?

JavaScript Hanya Memanipulasi, Bukan Mengurangi

Script auto read-more link tidak mengurangi ukuran file posting, tapi hanya memanipulasi tampilannya pada pandangan mata. Jika Anda melihat kode sumber dari halaman blog Anda, maka Anda akan melihat bahwa keseluruhan isi posting sebenarnya masih tetap ada pada tempatnya dan ditransfer secara penuh. JavaScript bertugas untuk mengambil beberapa karakter saja dan menampilkannya dalam bentuk ringkasan. Sementara posting yang asli akan ditindih dengan ringkasan yang telah dibuat:

// Menyisipkan summary (duplikat/clone posting yang telah dimanipulasi)
// ke dalam posting dengan ID yang diambil dari <data:post.id/>
var div = document.getElementById(pID);
...
var summary = imgtag + '<div>' + removeHtmlTag(div.innerHTML, summ) + '</div>';
...div.innerHTML = summary;

Sejauh ini tidak ada yang bisa kita lakukan dengan ringkasan posting. Yang bisa kita lakukan hanyalah mengoptimasi ukuran thumbnail. Perlu diketahui bahwa meskipun ukuran gambar pada posting read-more Anda sudah menjadi lebih kecil dari sebelumnya, tapi sebenarnya yang berubah hanya ukuran tinggi dan lebarnya saja, sedangkan ukuran gambar masih tetap sama besarnya dan sama beratnya. Coba Anda klik kanan pada salah satu thumbnail posting kemudian klik View Image Info:

View Image Info
Menampilkan info gambar

dari situ Anda akan melihat ukuran gambar aslinya, bukan hanya ukuran lebar dan tinggi gambar asli, tapi juga ukuran file dari gambar tersebut:

Lebih Besar
Ukuran gambar jauh lebih besar dari yang terlihat

NAH! Ternyata thumbnail kecil yang Anda lihat sebagai gambar berukuran 120 × 100 piksel adalah gambar berukuran 495 × 371 piksel. Dan bukan itu saja, coba lihat pada file size: 24.75KB! Untuk ukuran gambar sebesar itu, kenapa harus dipaksakan menjadi berukuran 120 × 100? Lalu, bisakah kita memperkecil ukuran gambar tersebut secara nyata, dan bukan hanya sekedar menekan ukuran lebar dan tinggi gambar menggunakan atribut width dan height?

Picasa memiliki cara yang unik dalam mengompres gambar. Mereka mengambil ukuran gambar dari URLnya (yaitu kode-kode seperti /s200, /s400, /s1600, /s40-c dan yang lainnya). Dari path itulah Picasa akan mentransfer ukuran gambar dengan resolusi sesuai dengan kode ukuran yang tercantum.

Blogger menggunakan fasilitas yang sama, jadi kita bisa menggunakan kunci sederhana itu untuk memperkecil gambar. Berikut ini adalah beberapa contoh ukuran bawaan dari editor posting pada Blogger seperti Small, Medium, Large, X-Large dan Original Size (Tapi sebenarnya Anda juga masih bisa menentukan ukurannya sendiri):

Kode Ukuran Contoh URL
/s72-c Media Thumbnail (Ukuran Persegi) http://lh5.googleusercontent.com/-hWRTW_pG0f0/UoY31oeAzWI/AAAAAAAAAGs/LnP6x4LPeOs/s72-c/319.jpg
/s200 Small http://lh5.googleusercontent.com/-hWRTW_pG0f0/UoY31oeAzWI/AAAAAAAAAGs/LnP6x4LPeOs/s200/319.jpg
/s320 Medium http://lh5.googleusercontent.com/-hWRTW_pG0f0/UoY31oeAzWI/AAAAAAAAAGs/LnP6x4LPeOs/s320/319.jpg
/s400 Large http://lh5.googleusercontent.com/-hWRTW_pG0f0/UoY31oeAzWI/AAAAAAAAAGs/LnP6x4LPeOs/s400/319.jpg
/s640 X-Large http://lh5.googleusercontent.com/-hWRTW_pG0f0/UoY31oeAzWI/AAAAAAAAAGs/LnP6x4LPeOs/s640/319.jpg
/s1600 Original Size http://lh5.googleusercontent.com/-hWRTW_pG0f0/UoY31oeAzWI/AAAAAAAAAGs/LnP6x4LPeOs/s1600/319.jpg

Semua tautan gambar di atas sebenarnya sama. Saya hanya membedakan pada bagian yang berwarna jingga. Namun saat Anda mencoba mengeceknya, ternyata hanya dengan mengubah URL tersebut saja sudah bisa memperkecil ukuran gambar. Pada awalnya Saya sempat berpikir bahwa saat kita mengunggah gambar ke Picasa, maka Picasa akan menyimpan semua gambar yang sama tersebut dalam berbagai ukuran ke dalam folder bernama s200, s400 dan seterusnya. Tapi semua orang tahu bahwa Google tidak sebodoh itu » https://developers.google.com/speed/docs/best-practices/payload#ScaleImages

Posting blog kita memiliki ukuran gambar yang berbeda-beda, bagaimana kita bisa memperkecil ukuran thumbnail tanpa harus memperkecil ukuran gambar pada posting?

Caranya sederhana. Kita cukup mengubah URL thumbnail yang tadinya berada di seputar /s400, /s640 dan /s1600 menjadi ukuran yang lebih kecil seperti ini:

imgtag = '<span style="float:left;padding:0px 10px 5px 0px;"><img alt="" src="' + img[0].src.replace(/\/s(320|400|640|1600)/, "\/s200") + '" width="' + img_thumb_width + 'px" height="' + img_thumb_height + 'px"/></span>';

dan agar pengaturan ukuran menjadi jauh lebih mudah, lebih baik set karakter pengganti berdasarkan variabel lebar thumbnail:

imgtag = '<span style="float:left;padding:0px 10px 5px 0px;"><img alt="" src="' + img[0].src.replace(/\/s(320|400|640|1600)/, "\/s" + img_thumb_width) + '" width="' + img_thumb_width + 'px" height="' + img_thumb_height + 'px"/></span>';

Dengan cara di atas maka ukuran thumbnail bisa diperkecil sampai dua kali lipatnya. Bahkan lebih!

Gambar sudah mengecil
Ukuran gambar mengecil sampai 2 kali lipat

Saran Saya untuk Developer Blogger

Meskipun tulisan panjang ini hanya membicarakan seputar thumbnail auto read-more link blogspot, tapi sebenarnya bukan itu inti dari apa yang ingin Saya sampaikan. Jika Anda adalah seorang pembuat widget Blogger, Saya harap Anda bersedia untuk memulai mengubah sedikit cara Anda memperkecil gambar. Ini adalah saran terbaik dari Saya. Jika Anda menciptakan widget dengan ukuran lebar dan tinggi thumbnail yang telah diset di dalam variabel, jangan lupa juga untuk menerapkan variabel tersebut sebagai pengganti URL gambar, sehingga kecepatan muat gambar pada widget juga bisa ditingkatkan:

var thumbWidth  = 200,
    thumbHeight = 100;

// Kode widget Anda....
document.write('<img src="' + postimg.replace(/\/s(320|400|640|1600)/, "\/s" + thumbWidth) + '" width="' + thumbWidth + '" height="' + thumbHeight + '" alt="thumbnail" />');

Mengenai ringkasan posting, Saya harap suatu saat nanti Blogger akan merilis tag <data> khusus untuk memanggil ringkasan posting, sama seperti halnya dalam pembagian opsi feed yang sudah ada.

Konsepnya kira-kira begini:

Feed Blog

Dengan begitu kita tidak perlu lagi repot-repot menuliskan JavaScript yang rumit untuk menciptakan posting read-more. Yang perlu kita lakukan hanyalah sesuatu yang sederhana seperti ini:

<article class='post-body entry-content'>
  <b:if cond='data:blog.pageType == &quot;static_page&quot;'>
    <data:post.body/>
  <b:else/>
    <b:if cond='data:blog.pageType != &quot;item&quot;'>
      <div expr:id='data:post.id'><data:post.bodySummary/>      </div>
      <div class='alignright'>
        <a class='read-more' expr:href='data:post.url' rel='dofollow'>READ MORE</a>
      </div>
    </b:if>
    <b:if cond='data:blog.pageType == &quot;item&quot;'>
      <data:post.body/>
    </b:if>
  </b:if>
  <div class='clear'/>
</article>

Pembaharuan: 28 April 2012

Blogger sudah memiliki tag <data> yang bisa menampilkan ringkasan posting meski jumlahnya masih sangat terbatas:

<data:post.snippet/>

Elemen ini sebenarnya lebih sering kita jumpai pada widget Posting Populer yang biasa digunakan untuk menampilkan ringkasan pendek di sekitar thumbnail. Selengkapnya mengenai implementasi auto read-more tanpa JavaScript dengan memanfaatkan tag <data:post.snippet/> dapat Anda baca pada salah satu posting dari seseorang di Vietnam » Auto readmore không s? d?ng javascript cho Blogger


Ikon: ArtDesigner

Labels: , , , ,

Wednesday, April 18, 2012

JQuery .wrap(), .wrapInner(), .wrapAll() dan .unwrap()

jQuery .wrap(), .wrapInner(), .wrapAll() dan .unwrap()

Manipulasi jQuery ini digunakan untuk membungkus suatu elemen dengan elemen lain atau sebaliknya, tidak membungkus suatu elemen dari elemen lainnya (lebih tepatnya: menghilangkan elemen induknya).

.wrap()

Digunakan untuk membungkus elemen dengan elemen lain. Katakanlah kita akan membungkus elemen <p> dengan elemen <div>:

HTML

<p>Lorem ipsum</p>

jQuery

$('p').wrap('<div id="outer"></div>');

maka hasilnya akan menjadi seperti ini:

<div id="outer">
    <p>Lorem ipsum</p>
</div>

.wrapInner()

Digunakan untuk membungkus elemen dengan elemen lain tapi dari bagian dalam:

jQuery

$('p').wrapInner('<div id="outer"></div>');

maka hasilnya akan menjadi seperti ini:

<p>
    <div id="outer">Lorem ipsum</div>
</p>

.wrapAll()

Digunakan untuk membungkus semua elemen yang cocok dengan elemen lain kemudian mengeluarkan yang lainnya. Ini adalah sikap unik dari .wrapAll() karena saat dia menemukan satu elemen yang tidak cocok dengan elemen yang diseleksi, maka dia akan mengeluarkannya dari elemen pembungkus.

Katakanlah kita akan membungkus semua elemen <span> dengan elemen <div> tapi hanya untuk elemen <span> yang memiliki kelas item:

HTML

<span>Item 1</span>
<span class="item">Item 2</span>
<span>Item 3</span>
<span class="item">Item 4</span>

jQuery

$('span.item').wrapAll('<div id="outer"></div>');

maka hasilnya akan menjadi seperti ini:

<span>Item 1</span>
<div id="outer">
    <span class="item">Item 2</span>
    <span class="item">Item 4</span>
</div>
<span>Item 3</span>

.unwrap()

Digunakan untuk melepaskan elemen pembungkus/elemen induk dari elemen terseleksi. Katakanlah kita memiliki elemen <span> di dalam elemen <div>. Kemudian, dengan jQuery kita akan menghilangkan elemen <div> dari <span>:

HTML

<div><span class="inner">Lorem ipsum</span></div>

jQuery

$('span.inner').unwrap();

maka hasilnya elemen <div> yang membungkus <span class="inner"> akan menghilang:

<span class="inner">Lorem ipsum</span>

Lihat Demo

Labels: ,

CSS Fallback untuk Manipulasi Bagian Komentar

CSS Fallback untuk Manipulasi Bagian Komentar

Ini mengenai manipulasi bagian komentar Blogger yang pernah Saya tuliskan di sini dan di sini. Seperti yang kita tahu bahwa JavaScript memiliki satu keterbatasan karena setiap peramban memiliki akses untuk menonaktifkannya. Sehingga kita harap kita bisa memberikan semacam fallback atau sikap cadangan pada blog kita saat sesuatu yang tidak kita inginkan pada JavaScript terjadi. Di sini Saya sudah membuat kode CSS untuk fallback tampilan jika suatu saat JavaScript mengalami konflik atau dinonaktifkan oleh pembaca. Dengan cara ini maka meskipun JavaScript telah dinonaktifkan, atau mengalami konflik dengan JavaScript yang lain, tampilan manipulasi komentar Anda akan tetap tampak rapi:

#comments i[rel="code"] {
  font:normal normal 12px/normal Monaco,Monospace !important;
  font-style:normal;
  color:blue;
}

#comments i[rel="pre"] {
  display:block;
  background-color:#333;
  font:inherit;
  color:white;
  white-space:pre;
  word-wrap:normal;
  overflow:auto;
  padding:.5em 1em;
  margin:10px 0;
}

#comments i[rel="image"],
a[href*="//www.youtube.com/embed"] {
  display:block;
  margin:20px auto;
  width:120px;
  height:100px;
  border:2px solid black;
  position:relative;
  overflow:hidden;
}

#comments i[rel="image"]:before,
a[href*="//www.youtube.com/embed"]:before {
  content:"Please enable the JavaScript to see this image!";
  position:absolute;
  top:0;
  right:0;
  bottom:0;
  left:0;
  background-color:red;
  padding:10px;
  font:normal bold 12px/normal Arial,Sans-Serif;
  color:white;
  text-decoration:none;
}

a[href*="//www.youtube.com/embed"]:before {content:"Please enable the JavaScript to see this video!"}

#comments b[rel="quote"] {
  font-weight:normal;
  display:block;
  background-color:pink;
  padding:10px 15px;
  margin:10px auto;
}

#comments b[rel^="h"] {
  display:block;
  margin-bottom:10px;
}

#comments b[rel="h1"] {font-size:240%}
#comments b[rel="h2"] {font-size:200%}
#comments b[rel="h3"] {font-size:140%}
#comments b[rel="h4"] {font-size:120%}
#comments b[rel="h5"] {font-size:100%}
#comments b[rel="h6"] {font-size:60%}

Pada intinya adalah kita menggunakan CSS untuk mengubah semua tampilan elemen-elemen pemicu manipulasi agar “tampak” sebagai elemen-elemen yang akan menggantikannya nanti. Begitu saja. Bahkan jika Anda belum bisa menerapkan manipulasi komentar yang pernah Saya tuliskan itu, menggunakan teknik ini saja sebenarnya juga sudah cukup.

Kode di atas hanya sebagai contoh saja, karena yang harus menjadi perhatian utama Anda adalah selektornya. Untuk memastikan agar tampilan fallback tampak sama dengan tampilan default elemen <pre>, <code>, <blockquote> dan tag-tag yang akan menjadi pengganti lainnya, akan lebih baik jika Anda menuliskan selektor-selektor CSS3 tersebut di samping elemen yang dikehendaki JavaScript seperti ini:

pre,
#comments i[rel="pre"] {
  /* tampilan default tag `<pre>` ... */
}

blockquote,
#comments b[rel="quote"] {
  /* tampilan default tag `<blockquote>` ... */
}

h1,#comments b[rel="h1"] { /* tampilan default tag `<h1>` ... */ }
h2,#comments b[rel="h2"] { /* tampilan default tag `<h2>` ... */ }
h3,#comments b[rel="h3"] { /* tampilan default tag `<h3>` ... */ }
h4,#comments b[rel="h4"] { /* tampilan default tag `<h4>` ... */ }
h5,#comments b[rel="h5"] { /* tampilan default tag `<h5>` ... */ }
h6,#comments b[rel="h6"] { /* tampilan default tag `<h6>` ... */ }

Dan seterusnya… Saya harap Anda mengerti maksud Saya.

Saya menyadari ini saat Saya iseng mencoba menerjemahkan blog Saya ke bahasa Inggris menggunakan Google Translate dan ternyata sistem manipulasi komentar untuk mengubah tag <i> dan <b> menjadi tag lain pada blog Saya tidak bekerja. Tapi dengan ini semua bisa teratasi.

Lihat Demo

Labels: , , ,

Tuesday, April 17, 2012

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:

Lihat Demo

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.

Labels: , , , , , ,

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>
// 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>

Lihat Demo

Labels: , , ,

Monday, April 16, 2012

LetteringJS Sederhana

LetteringJS
http://letteringjs.com

Pikiran Saya terbuka saat System of Blog menanyakan sesuatu tentang cara membagi-bagi setiap huruf dengan jQuery untuk kemudian dibungkus dengan elemen <span>. Ternyata untuk menciptakan manipulasi teks seperti LetteringJS bisa dengan mudah dibuat. Saya mendapatkan konsep ini dari Stackoverflow - Wrap Each Char in Except Tags with jQuery:

// Bungkus semua huruf dengan elemen span
$('.splitWord').children().andSelf().contents().each(function() {
    if (this.nodeType == 3) {
        $(this).replaceWith(
            $(this).text().replace(/(\w)/g, "<span class='char'>$&</span>")
        );
    }
});

// Menambahkan kelas `.char1`, `.char2`, `.char3`, ...
$('.splitWord').each(function() {
    $('span.char', this).each(function(i) {
        i = i+1;            
        $(this).addClass('char' + i);
    });
});

Lihat Demo

Cara kerja kode bagian pertama adalah akan memecah setiap huruf kemudian mengelilinginya dengan elemen <span> seperti ini:

<p class="splitWord">
    <span class="char">L</span>
    <span class="char">o</span>
    <span class="char">r</span>
    <span class="char">e</span>
    <span class="char">m</span>
</p>

Dan bagian ke dua bertugas untuk menambahkan kelas-kelas baru yang lebih spesifik dan berbeda satu sama lain:

<p class="splitWord">
    <span class="char char1">L</span>
    <span class="char char2">o</span>
    <span class="char char3">r</span>
    <span class="char char4">e</span>
    <span class="char char5">m</span>
</p>

Sama persis seperti LetteringJS.

Labels: , ,

Sunday, April 15, 2012

Tampilan Posting Berbeda-Beda Berdasarkan Label

Darcy Clarke

Saya hanya merasa sedikit penasaran dengan blog Darcy Clarke yang memiliki warna artikel berbeda-beda berdasarkan label posting. Pada awalnya Saya mencoba untuk melihat isinya, karena Saya pikir ada semacam script ajaib untuk melakukan sihir itu. Sayangnya Saya tidak menemukan apapun. Yang Saya temukan hanya tag <style> berisi CSS pendek untuk menyatakan warna latar posting tunggal:

<style>
    body
     { background: #DB8B23; }
    body h1 small
     { color: #DB8B23; }
    body #body
     { color: #000; }
</style>

Dalam Wordpress, ciri kecil seperti ini biasa disebut sebagai Custom Post. Hal ini bisa dilakukan dengan cara menginstal plugin Art Direction. Tapi setahu Saya plugin ini hanya berfungsi untuk menerapkan CSS tambahan tersebut pada saat kita memasuki halaman artikel tunggal, dan bukan menerapkan CSS pada setiap posting seperti gambar di atas.

Art Direction Plugin
Plugin Art Direction Wordpress

Meskipun, jika kita bisa mengetahui masing-masing kelas posting (misalnya .post-#postid), kita bisa saja menerapkan kode CSS pada masing-masing kelas tersebut:

.post-2444 {
  background-color:red;
}
.post-2445 {
  background-color:green;
}
.post-2446 {
  background-color:blue;
}

Tapi kelas posting tidak bisa kita kendalikan. Dan lagipula, Blogger tidak memiliki fasilitas seperti ini. Di sini kita tidak membicarakan mengenai tampilan posting yang berbeda-beda berdasarkan urutan acak melainkan membicarakan tentang tampilan posting yang berbeda-berbeda berdasarkan label, sehingga semuanya harus bisa kita kendalikan dengan baik.

Saat itu Saya cuma memikirkan tentang nama label yang tercantum pada setiap posting. Seandainya Saya bisa mengakses nama label tersebut dan menciptakan kodisi, maka Saya bisa menuliskan kode CSS khusus untuk setiap posting yang mengandung label dengan kata tertentu. Pikiran Saya berhenti pada selektor :contains(). Saya harap Saya bisa menemukan label berisi teks tertentu di dalam setiap posting, dan dengan cara itulah Saya akan menciptakan kondisi.

Yang terpenting adalah kita temukan terlebih dahulu elemen yang biasanya membungkus daftar label pada catatan kaki posting. Dalam blog ini Saya mendapati elemen ini:

Post Labels
Catatan kaki posting

Kita gunakan elemen itu untuk dijadikan sebagai induk dari daftar label posting. Dan kita bisa menciptakan kondisi dengan cara melihat semua artikel yang ada, kemudian kita cek apakah sebuah label berisi teks tertentu ada atau tidak di dalamnya. Jika ada, lakukan sesuatu pada posting tersebut!

// Lihat semua posting yang ada kemudian cek masing-masing tautan di dalam span.post-labels
// Cek apakah di dalamnya terdapat kata tertentu atau tidak (misalnya: Menyenangkan)
// Jika ada, tambahkan satu kelas spesifik baru pada posting tersebut
$('.post').each(function() {
    if ($(this).find('.post-labels a:contains(Menyenangkan)').length) {
        $(this).addClass('red');
    } else if ($(this).find('.post-labels a:contains(Jelek)').length) {
        $(this).addClass('green');
    } else if ($(this).find('.post-labels a:contains(Bosan)').length) {
        $(this).addClass('blue');
    } else if ($(this).find('.post-labels a:contains(Mamamia)').length) {
        $(this).addClass('yellow');
    }
});

Nah! jika semua posting berlabel tertentu sudah mendapatkan kelasnya masing-masing, kita bisa mendefinisikan tampilannya di dalam CSS seperti ini:

.post.red    {background-color:red;   }
.post.green  {background-color:green; }
.post.blue   {background-color:blue;  }
.post.yellow {background-color:yellow;}

Saya tidak memiliki blog demo untuk tutorial ini, tapi Saya sudah membuat ilustrasinya. Katakanlah semua elemen <article> pada ilustrasi ini adalah posting-posting yang ada di dalam blog Anda:

Lihat Demo

Manipulasi ini setidaknya akan berjalan lancar pada posting yang hanya mengandung satu label saja dari semua nama label yang tercantum dalam kondisi. Jika tidak, hasilnya akan tidak terduga. Misalnya, jika kita telah menciptakan kondisi untuk posting dengan label Menyenangkan, Jelek, Bosan dan Mamamia, maka jika terdapat satu posting dengan label Menyenangkan dan Mamamia secara bersamaan, posting ini akan menunjukkan penanpilan yang tidak terduga tampilan posting akan mengikuti deklarasi warna pada kelas yang dituliskan terakhir (peraturan CSS: Yang bawah mengalahkan yang atas).

Saya juga sudah menerapkan teknik ini di sini, namun tampak tidak begitu mencolok. Saya hanya memanfaatkannya untuk menandai setiap label Tingkatan Pembelajaran Saat ini Saya sudah menggantinya dengan hack <b:loop> label posting yang tidak valid, dan hanya berlaku pada halaman tunggal, namun tetap bisa bekerja tanpa JavaScript:

Level Based Learning

Terkait: Tampilan Posting Berbeda-Beda Berdasarkan Label Tanpa javaScript

Labels: , , ,

Editor Teks Sederhana

Usang: Fungsi ini memiliki masalah kecil pada perubahan posisi caret teks setelah manipulasi teks terjadi. Kode dan demo aplikasi editor teks sederhana yang lebih baik bisa Anda lihat di sini

Editor Posting
Editor Posting

Temuan bagus! Script ini digunakan untuk membungkus sekelompok teks yang diseleksi pada <textarea> dengan karakter tertentu. Ini adalah dasar utama untuk menciptakan editor teks seperti halnya editor posting di blogmu:

function wrapText(elementID, openTag, closeTag) {
    var textArea = $('#' + elementID);
    var len = textArea.val().length;
    var start = textArea[0].selectionStart;
    var end = textArea[0].selectionEnd;
    var selectedText = textArea.val().substring(start, end);
    var replacement = openTag + selectedText + closeTag;
    textArea.val(textArea.val().substring(0, start) + replacement + textArea.val().substring(end, len));
}

Penggunaan

wrapText("myTa", "<strong>", "</strong>");
  • myTa adalah ID textarea
  • <strong> adalah karakter awal
  • </strong> adalah karakter akhir.

Lihat Demo


Sumber: Stackoverflow - jQuery Wrap Selected Text in a Textarea

Labels: , , , ,

Saturday, April 14, 2012

Iframe Preloader

jQuery Iframe Preloader

Saya ingin membahas mengenai pertanyaan dari The7Bloggers tentang bagaimana caranya menampilkan iframe pada kotak dialog, tapi isi dari iframe tersebut harus dimuat hanya saat kotak dialog ditampilkan:

The7Bloggers pada Alam Perwira di Membuat Kotak Dialog dengan jQuery:

Mas gimana kalau buat iframe, tapi waktu blognya load iframenya ndak ikut load?

Loadnya itu ketika tombol pembuka jQuery-nya di klik?

Pertanyaan bagus. Ini mengenai efisiensi muat halaman. Katakanlah, kita memiliki widget Buku Tamu tersembunyi di sidebar yang terbuat dari elemen <iframe>. Tapi kita harap kita bisa menunda pemuatan buku tamu tersebut sampai seorang pengunjung mengeklik tombol pembuka, tautan atau apapun yang menjadi pemicu tampilnya buku tamu tersebut.

Untuk memuat iframe pada saat suatu pemicu diklik dapat dilakukan dengan dua metode. Pertama, kita bisa membuat elemen <iframe> dengan atribut src kosong, lalu kita set nilai atribut src kosong tersebut saat sebuah tombol diklik:

HTML

<button>Klik!</button>
<iframe id='dynamicFrame' src=''><iframe>

jQuery

$('button').click(function() {
    $('iframe#dynamicFrame').attr('src', 'http://www.namasitus.com');
});

Ke dua, kita bisa menyisipkan elemen <iframe> pada sebuah kontainer (katakanlah #frameContainer) saat sebuah tombol diklik:

HTML

<button>Klik!</button>
<div id='frameContainer'><div>

jQuery

$('button').click(function() {
    $('#frameContainer').html('<iframe id="dynamicFrame" src="//www.namasitus.com"></iframe>');
});

Saya rasa metode yang ke dua ini lebih baik. Karena setidaknya, saat kita ingin membatalkan proses muat iframe, kita bisa melakukannya dengan cara menghilangkan elemen tersebut seperti ini:

$('button#batal').click(function() {
    $('iframe#dynamicFrame').remove();
});

Membatalkan proses muat iframe pada metode pertama sebenarnya juga bisa dilakukan dengan cara menghapus atribut src pada elemen tersebut:

$('button#batal').click(function() {
    $('iframe#dynamicFrame').removeAttr('src');
});

Tapi terkadang metode itu tidak bekerja dengan baik dan iframe masih tetap akan melanjutkan proses muat meskipun tombol pembatal sudah diklik.

Memadukan Konsep jQuery Dialog dengan Iframe Preloader

Sekarang kita akan meletakkan iframe tersebut ke dalam kotak dialog. Di sini Saya tidak akan mencari bahan terlalu jauh. Kita gunakan saja jQuery Dialog yang pernah Saya buat di posting ini untuk kemudian akan kita isi dengan elemen <iframe> di dalamnya.

Pertama-tama kita harus memodifikasi kerangkanya menjadi seperti ini:

<!-- Start Dialog Box -->
<div id="kotak-dialog">
<h3 class="title">Kotak Dialog<a href="#" class="close">&#215;</a></h3>
    <div class="isi-dialog"><div id="iframeContainer"></div>        <div class="button-wrapper">
            <button class="close">Tutup Kotak Dialog</button>
        </div>
    </div>
</div>
<div id="dialog-overlay"></div>
<!-- End Dialog Box -->

Pada kode di atas bisa Anda melihat bahwa Saya menyisipkan elemen #iframeContainer. Kita akan menggunakan itu sebagai tempat iframe yang akan kita sisipkan dengan jQuery. Berikutnya perhatikan kode ini:

//Tampilkan kotak dialog saat .open-dialog diklik
$('.open-dialog').click(function() {
    $('#kotak-dialog').show();
    $('#dialog-overlay').fadeTo("normal", 0.4);
    return false;
});

Kode tersebut hanya berfungsi untuk menampilkan kotak dialog dan overlay saat tombol pemicu (.open-dialog) diklik. tapi yang kita harapkan adalah setelah kotak dialog tampil, jQuery akan mencari elemen #iframeContainer di dalamnya dan setelah itu akan menyisipkan elemen <iframe> pada elemen tersebut. Itu bisa dilakukan dengan memodifikasi kodenya menjadi seperti ini:

$('.open-dialog').click(function() {
    $('#kotak-dialog').show().find('#frameContainer').html('<iframe src="' + this.href + '"></iframe>');
    $('#dialog-overlay').fadeTo("normal", 0.4);
    return false;
});

this.href adalah objek yang menyatakan nilai atribut href pada tautan yang diklik. Kita akan mengunakan pemicu berupa tautan agar kita bisa menyimpan URL iframe pada tautan tersebut, sehingga dengan satu kotak dialog saja, kita bisa membuka lebih banyak halaman di dalam iframe.

Untuk membatalkan proses muat tidak berbeda dari apa yang sudah Saya nyatakan di atas. Saat tombol .close diklik, sembunyikan kotak dialog dan singkirkan iframe:

// Saat tombol penutup diklik...
$('#kotak-dialog .close').click(function() {
    // Hilangkan kotak dialog dengan efek fade-out
    $('#kotak-dialog').fadeOut('normal', function() {
        // Setelah itu singkirkan iframe di dalamnya
        $('iframe', this).remove();
    });
    // Sembunyikan overlay
    $('#dialog-overlay').hide();
    return false;
});

Kode Selengkapnya

HTML

<!-- Start Dialog Box -->
<div id="kotak-dialog">
<h3 class="title">Kotak Dialog<a href="#" class="close">&#215;</a></h3>
    <div class="isi-dialog">

    <div id="iframeContainer"></div>

        <div class="button-wrapper">
            <button class="close">Tutup Kotak Dialog</button>
        </div>
    </div>
</div>
<div id="dialog-overlay"></div>
<!-- End Dialog Box -->

CSS

#kotak-dialog {
  position:absolute;
  top:20%;
  left:50%;
  margin:0px 0px 0px -200px;
  width:400px;
  height:auto;
  background-color:#fff;
  -webkit-box-shadow:0px 1px 2px rgba(0,0,0,0.4);
  -moz-box-shadow:0px 1px 2px rgba(0,0,0,0.4);
  box-shadow:0px 1px 2px rgba(0,0,0,0.4);
  z-index:1000;
  display:none;
}

#kotak-dialog *:focus {
  outline:none;
}

#kotak-dialog h3.title {
  background-color:#3B5998;
  padding:10px 15px;
  color:#fff;
  font:normal 16px Arial,Sans-Serif;
  margin:0px 0px 0px 0px;
  position:relative;
}

#kotak-dialog h3.title a {
  position:absolute;
  top:10px;
  right:15px;
  color:#fff;
  text-decoration:none;
  cursor:pointer;
}

#kotak-dialog .isi-dialog {
  margin:15px;
  font:normal 12px Arial,Sans-Serif;
}

#kotak-dialog .button-wrapper {
  padding:10px 15px 0px;
  border-top:1px solid #ddd;
  margin-top:15px;
}

#kotak-dialog .button-wrapper button {
  background-color:#FF0C39;
  border:none;
  font:bold 12px Arial,Sans-Serif;
  color:#fff;
  padding:5px 10px;
  -webkit-border-radius:3px;
  -moz-border-radius:3px;
  border-radius:3px;
  cursor:pointer;
}

#kotak-dialog .button-wrapper button:hover {
  background-color:#aaa;
}

#dialog-overlay {
  position:fixed !important;
  position:absolute;
  z-index:999;
  top:0px;
  right:0px;
  bottom:0px;
  left:0px;
  background-color:#000;
  display:none;
}


/* Iframe */
#iframeContainer iframe {
  width:100%;
  height:300px;
  border:none;
  background-color:#ccc;
  overflow:auto;
}

jQuery

//<![CDATA[
$(function() {
    $('.open-dialog').click(function() {
        $('#kotak-dialog').show().find('#iframeContainer').html('<iframe src="' + this.href + '"></iframe>');
        $('#dialog-overlay').fadeTo(400, 0.8);
        return false;
    });
    $('#kotak-dialog .close').click(function() {
        $('#kotak-dialog').fadeOut('normal', function() {
            $('iframe', this).remove();
        });
        $('#dialog-overlay').hide();
        return false;
    });
});
//]]>

Elemen pemicu dibuat dengan sebuah elemen tautan yang memiliki kelas .open-dialog seperti ini:

<a class="open-dialog" href="//www.namasitus.com">Buka Kotak Dialog</a>

Lihat Demo

Labels: ,