Thursday, February 28, 2013

JavaScript Draggable

Membuat elemen HTML menjadi bisa digeser-geser ternyata jauh lebih mudah dibandingkan dengan apa yang Saya pikir selama ini. Fungsi di bawah ini murni menggunakan JavaScript biasa dan tidak memerlukan library apapun. Berbeda dengan plugin draggable buatan Saya yang dulu:

HTML

<div id="draggable-element" style="position:relative;">Drag me!</div>

JavaScript

var selected = null, // Object of the element to be moved
    x_pos = 0, y_pos = 0, // Stores x & y coordinates of the mouse pointer
    x_elem = 0, y_elem = 0; // Stores top, left values (edge) of the element

// Will be called when user starts dragging an element
function _drag_init(elem) {
    selected = elem; // Store the object of the element which needs to be moved
    x_elem = x_pos - selected.offsetLeft;
    y_elem = y_pos - selected.offsetTop;
}

// Will be called when user dragging an element
function _move_elem(e) {
    x_pos = document.all ? window.event.clientX : e.pageX;
    y_pos = document.all ? window.event.clientY : e.pageY;
    if (selected !== null) {
        selected.style.left = (x_pos - x_elem) + 'px';
        selected.style.top = (y_pos - y_elem) + 'px';
    }
}

// Destroy the object when we are done
function _destroy() {
    selected = null;
}

// Bind the functions here...
document.getElementById('draggable-element').onmousedown = function() {
    _drag_init(this);
    return false;
};

document.onmousemove = _move_elem;
document.onmouseup = _destroy;

Demo

Lihat Demo


Referensi: DigiMantra - Drag an Element, Image, etc… Using JavaScript

Labels: ,

Wednesday, February 27, 2013

Event Mouse Wheel

Setiap peramban memiliki spesifikasi yang berbeda:

if (window.addEventListener) {
    // IE9, Chrome, Safari, Opera
    window.addEventListener("mousewheel", doScroll, false);
    // Firefox
    window.addEventListener("DOMMouseScroll", doScroll, false);
} else {
    // IE 6/7/8
    window.attachEvent("onmousewheel", doScroll);
}

Event ini akan memicu sebuah fungsi bernama doScroll (yang akan kita buat nanti) untuk bekerja saat mouse wheel digulung. Dimana nantinya doScroll akan dijadikan sebagai penayang nilai gulungan.

Nilainya hanya terdiri dari 1 atau -1, sekedar untuk menunjukkan apakah aksi yang terjadi adalah “menggulung ke atas” atau “menggulung ke bawah”:

var doScroll = function(e) {

    e = window.event || e;
    var delta = Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail)));

    // Lakukan sesuatu dengan `delta`
    // (dalam contoh ini: menampilkan nilainya di dalam area `<body>`)
    document.body.innerHTML = delta;

    e.preventDefault(); // Tambahkan ini agar kerja `mouse whell` yang sesungguhnya bisa dimatikan

};

if (window.addEventListener) {
    // IE9, Chrome, Safari, Opera
    window.addEventListener("mousewheel", doScroll, false);
    // Firefox
    window.addEventListener("DOMMouseScroll", doScroll, false);
} else {
    // IE 6/7/8
    window.attachEvent("onmousewheel", doScroll);
}

Lihat Demo

Memperbaharui Nilai Setiap Kali Gulungan Terjadi

Pada demo di atas, setiap kali Anda menggulung di atas halaman, yang terjadi hanyalah sebuah penampakan angka 1 atau -1 yang akan muncul berdasarkan arah gulungan. Untuk membuat nilainya meningkat atau berkurang, buatlah sebuah variabel kosong di luar event tersebut dengan nilai 0 seperti ini:

var current = 0;

Setelah itu, tingkatkan/kurangi nilainya dengan cara menambahkan nilai delta ke current:

var current = 0;

var doScroll = function(e) {

    e = window.event || e;
    var delta = Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail)));

    // Lakukan sesuatu dengan `delta`
    current = current + delta; // Tingkatkan/kurangi nilai `current` dengan `delta`
    document.body.innerHTML = current; // Tampilkan hasilnya di dalam `<body>`

    e.preventDefault();

};

Lihat Demo

Contoh Penerapan: Membuat Area Menggulung Secara Horizontal

Pada intinya di sini Saya menerapkan contoh nomor dua dengan cara memanfaatkan nilai yang dihasilkan untuk memanipulasi nilai properti left pada elemen agar elemen bisa bergerak ke kiri atau ke kanan berdasarkan arah gulungan. Supaya gerakannya lebih cepat, nilainya Saya kalikan dengan mean:

HTML

<div id="scroll-area">
    <div>

        <!-- Konten di sini... -->

    </div>
<div>

CSS

#scroll-area {
  width:400px;
  border:2px solid;
  background-color:#ccc;
  overflow:hidden;
}

#scroll-area div {
  width:3000px;
  position:relative; /* relative positioned */
  padding:10px 14px;
}

JavaScript

// Fake horizontal scrolling with mouse wheel
var elem = document.getElementById('scroll-area'),
    width = parseInt(elem.offsetWidth, 10),
    cldWidth = parseInt(elem.children[0].offsetWidth, 10),
    distance = cldWidth-width,
    mean = 40, // Just for multiplier (go faster or slower)
    current = 0;

elem.children[0].style.left = current + "px"; // Set default `left` value as `0` for initiation

var doScroll = function(e) {

    // cross-browser wheel delta
    e = window.event || e;
    var delta = Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail)));

    // (1 = scroll-up, -1 = scroll-down)
    // Always check the scroll distance, make sure that the scroll distance value will not
    // increased more than the container width and/or less than zero
    if ((delta == -1 && current*mean >= -distance) || (delta == 1 && current*mean < 0)) {
        current = current + delta;
    }

    // Move element to the left or right by updating the `left` value
    elem.children[0].style.left = (current*mean) + 'px';

    e.preventDefault();

};

if (elem.addEventListener) {
    elem.addEventListener("mousewheel", doScroll, false);
    elem.addEventListener("DOMMouseScroll", doScroll, false);
} else {
    elem.attachEvent("onmousewheel", doScroll);
}

Demo

Contoh Penerapan: Scroll Horizontal Satu Layar Penuh

Selengkapnya, silakan lihat dan pelajari kode sumbernya:

JavaScript

(function() {
    function scrollHorizontally(e) {
        e = window.event || e;
        var delta = Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail)));

        // Scroll to the left or right in `document.documentElement` and `document.body`
        document.documentElement.scrollLeft -= (delta * 40); // Multiplied by 40
        document.body.scrollLeft -= (delta * 40); // Multiplied by 40
        e.preventDefault();
    }
    if (window.addEventListener) {
        // IE9, Chrome, Safari, Opera
        window.addEventListener("mousewheel", scrollHorizontally, false);
        // Firefox
        window.addEventListener("DOMMouseScroll", scrollHorizontally, false);
    } else {
        // IE 6/7/8
        window.attachEvent("onmousewheel", scrollHorizontally);
    }
})();

Lihat Demo

Labels: ,

Sunday, February 24, 2013

URL Parser

// This function creates a new anchor element and uses location
// properties (inherent) to get the desired URL data. Some String
// operations are used (to normalize results across browsers).
// Read => http://james.padolsey.com/javascript/parsing-urls-with-the-dom/

function parseURL(url) {
    var a = document.createElement('a');
    a.href = url;
    return {
        source: url,
        protocol: a.protocol.replace(':', ''),
        host: a.hostname,
        port: a.port,
        query: a.search,
        params: (function() {
            var ret = {},
            seg = a.search.replace(/^\?/, '').split('&'),
                len = seg.length,
                i = 0, s;
            for (; i < len; i++) {
                if (!seg[i]) {
                    continue;
                }
                s = seg[i].split('=');
                ret[s[0]] = s[1];
            }
            return ret;
        })(),
        file: (a.pathname.match(/\/([^\/?#]+)$/i) || [, ''])[1],
        hash: a.hash.replace('#', ''),
        path: a.pathname.replace(/^([^\/])/, '/$1'),
        relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [, ''])[1],
        segments: a.pathname.replace(/^\//, '').split('/')
    };
}

Penggunaan

Data yang diparse nantinya akan berubah menjadi objek seperti ini:

{
    source: "XXX",
    protocol: "XXX",
    host: "XXX",
    port: "XXX",
    query: "XXX",
    params: {
        "XXX": "XXX",
        "XXX": "XXX",
        "XXX": "XXX",
        "XXX": "XXX"
    },
    file: "XXX",
    hash: "XXX",
    path: "XXX",
    relative: "XXX",
    segments: ["XXX", "XXX", "XXX"]
}

Dari situ kita bisa memanggil setiap bagian dari objek yang dihasilkan dengan cara yang sama seperti saat kita memanggil data pada objek. Misalnya:

var myUrl = parseURL('http://abc.com:8080/dir/index.html?id=255&m=hello#top');

alert(myUrl.protocol); // => akan menghasilkan `http`

Selengkapnya

myUrl.file;     // = 'index.html'
myUrl.hash;     // = 'top'
myUrl.host;     // = 'abc.com'
myUrl.query;    // = '?id=255&m=hello'
myUrl.params;   // = Object = { id: 255, m: hello }
myUrl.path;     // = '/dir/index.html'
myUrl.segments; // = Array = ['dir', 'index.html']
myUrl.port;     // = '8080'
myUrl.protocol; // = 'http'
myUrl.source;   // = 'http://abc.com:8080/dir/index.html?id=255&m=hello#top'

Lihat Demo


Sumber: James Padolsey – Parsing URLs with the DOM!

Lainnya

Labels: , ,

AJAX jQuery ยท Memuat Beberapa Bagian Halaman Sekaligus dalam Satu Kali Permintaan

Ini adalah metode dasar yang sering Anda gunakan untuk memuat sebagian halaman ke dalam kontainer yang sudah dipersiapkan menggunakan AJAX. Di sini Saya menggambarkan Anda akan memuat elemen #content dari halaman /p/sample-page.html ke dalam elemen #container:

$('button').on("click", function() {
    $('#container').load('/p/sample-page.html #content');
});

Setelah tombol diklik, maka elemen #content dari halaman /p/sample-page.html akan termuat di dalam elemen #container. Ini adalah kasus yang sederhana. Namun kasus ini akan menjadi lebih rumit ketika Anda ingin memuat beberapa bagian dari halaman lain secara bersamaan dalam satu kali permintaan. Sebagai contoh, Anda ingin memuat bagian posting, navigasi halaman dan komentar secara bersamaan dalam satu kali permintaan HTTP ke dalam beberapa kontainer yang sudah dipersiapkan. Berikut ini adalah cara yang tidak efisien:

$('button').on("click", function() {
    $('#container-1').load('http://blog.my_site.com/p/sample-page.html .post');
    $('#container-2').load('http://blog.my_site.com/p/sample-page.html #nav');
    $('#container-3').load('http://blog.my_site.com/p/sample-page.html #comments');
});

Lebih Efisien: Gunakan $.get()

Jangan memakai jQuery .load() untuk memuat beberapa bagian halaman sekaligus. Tapi gunakan jQuery $.get():

$('button').on("click", function() {
    $.get('http://blog.my_site.com/p/sample-page.html', function(data) {
        $('#container-1').html($(data).find('.post'));
        $('#container-2').html($(data).find('#nav'));
        $('#container-3').html($(data).find('#comments'));
    });
});

Pada metode ini, Anda mengeklik sebuah tombol. Kemudian permintaan akan terjadi. Setelah proses permintaan berhasil dilakukan dan halaman yang diminta berhasil dipanggil, maka halaman tersebut tidak akan langsung dimuat ke dalam area/kontainer yang sudah dipersiapkan, melainkan masih berada di dalam parameter data.

Pada kasus ini, parameter data bisa disamakan sebagai keseluruhan HTML dari halaman http://blog.my_site.com/p/sample-page.html.

Dari parameter tersebut Anda bisa menelusuri bagian-bagian halaman lainnya dengan cara menyeleksi elemen yang diinginkan di dalam $(data) untuk kemudian bisa dimuat ke dalam kontainer yang diinginkan melalui jQuery manipulasi DOM seperti .html(), .text(), .append() dan .prepend() atau yang lainnya.

Demo?

Jika Anda sedang menggunakan peramban Firefox, klik pada menu drop-down di pojok kiri atas. Pilih menu Web Developer kemudian klik sub menu Scratchpad (Atau cukup tekan tombol Shift+F4). Salin kode di bawah ini kemudian tempelkan di dalam editor Scratchpad:

$('a').click(function() {
    $.get(this.href, function(data) {
        $('.post').html($(data).find('.post').html());
        $('#blog-pager').html($(data).find('#blog-pager').html());
        $('#comments').html($(data).find('#comments').html());
    }, 'html');
    return false;
});

Klik menu Execute dan pilih Run:

Firefox ScratchPad

Setelah kode ditempelkan, pilih menu Execute kemudian klik Run.

Sekarang klik salah satu tautan pada daftar entri/posting populer di sidebar blog ini dan tunggu beberapa saat sampai bagian dari halaman tersebut termuat. Jika berhasil, maka bagian yang akan berganti isinya adalah ada pada posting, navigasi halaman blog dan isi komentar (isi posting akan berubah, tautan navigasi halaman akan berubah dan isi komentar juga akan berubah).

Catatan dan Tambahan

jQuery .load() bisa menerima beberapa selektor sekaligus, jika Anda tidak tahu:

// Memuat `#sidebar`, `#comments` dan `#blog-pager`
// dari `http://abc_site.com/sample-page.html` ke dalam `#container`
$('#container').load('http://abc_site.com/sample-page.html #comments,#sidebar,#blog-pager');

Jika proses pemuatan menggunakan $.get() gagal (yang Saya alami adalah muncul pesan error TypeError: n.innerHTML is undefined), cobalah untuk menggunakan pola ini:

$.get('http://abc_site.com/sample-page.html', {}, function(data) {
    // Lakukan sesuatu dengan `$(data)`
}, 'html');

Labels: , , ,

Thursday, February 21, 2013

Sliding Up Image Description

Sliding Up Image Description
Terinspirasi dari Google Web Store

HTML

<div class="image-box-wrapper" id="image-box-wrapper">

    <!-- `.image-box` start -->
    <div class="image-box">
        <div class="image-container">
            <img src="img/image-1.jpg" alt="" width="200" height="150">
        </div>
        <div class="image-details">
            <div class="details">
                <h4>Description Title</h4>
                <p>Description text...</p>
                <p><a class="more" href="#">More</a></p>
            </div>
        </div>
    </div>
    <!-- `.image-box` end -->
    
    ...
    ...
    ...

    <div class="clear"></div>

</div>

CSS

.image-box-wrapper {
  width:642px;
  margin:50px auto;
}

.image-box {
  width:210px;
  height:160px;
  overflow:hidden;
  background-color:white;
  border:1px solid #ccc;
  float:left;
  margin:1px 1px;
  font:normal normal 12px/1.4 Segoe,"Segoe UI",Arial,Sans-Serif;
  color:#333;
}

.image-container,
.image-details {
  height:150px;
  border:5px solid white;
  background-color:#ffc;
  -webkit-transition:margin-top .4s ease-out .4s;
  -moz-transition:margin-top .4s ease-out .4s;
  -ms-transition:margin-top .4s ease-out .4s;
  -o-transition:margin-top .4s ease-out .4s;
  transition:margin-top .4s ease-out .4s;
}

.image-container img {
  width:200px;
  height:150px;
  padding:0 0;
  margin:0 0;
  border:none;
  outline:none;
  max-width:none;
  max-height:none;
  background-color:black;
}

.image-details h4,
.image-details p {
  margin:0 0 .2em;
  padding:0 0;
  height:70px;
}

.image-details h4 {
  font-size:120%;
  height:auto;
}

.image-details .details {
  padding:10px 12px;
  overflow:hidden;
}

.image-details .more {
  color:white;
  text-decoration:none;
  display:block;
  text-align:center;
  font-weight:bold;
  background-color:#f9a;
  height:26px;
  line-height:26px;
  margin:10px 0 0;
}

.image-box:hover {border-color:#bbb}
.image-box:hover .image-container {margin-top:-160px}
.image-details .more:hover {background-color:black}

Lihat Demo

Labels: , ,

Wednesday, February 20, 2013

Membangun Layout Paralaks dengan JQuery

jQuery Parallax layout

Membuat layout paralaks, jika Anda masih kesulitan untuk memahami bagaimana cara kerja dan cara membuatnya, di sini Saya akan menjelaskannya dengan rinci mengenai bagaimana layout tersebut tercipta. Pada dasarnya, sebuah layout paralaks hanyalah elemen HTML dengan beberapa tumpukan layer di dalamnya, dimana setiap layer tersebut akan dianimasikan posisinya dengan kecepatan yang sama namun dengan jarak yang berbeda untuk menciptakan efek tiga dimensi saat layer-layer tersebut bergerak.

Membuat Latar Paralaks

Kita mulai dengan elemen HTML seperti ini:

<div id="parallax-wrapper" class="parallax-wrapper">
    <div class="layer layer-1"></div>
    <div class="layer layer-2"></div>
    <div class="layer layer-3"></div>
    ...
    ...
</div>

Saya membuat sebuah elemen HTML sebagai kontainer dengan beberapa layer di dalamnya. Elemen utamanya adalah #parallax-wrapper. Elemen ini berfungsi sebagai wadah dari semua elemen paralaks di dalamnya. Sedangkan elemen-elemen .layer nantinya akan kita gunakan sebagai penampil latar. Kita akan memposisikan layer-layer tersebut menjadi bertumpukan layaknya tumpukan kaca. Jadi kita memerlukan ini untuk mengatur dimensi paralaks yang kita buat:

.parallax-wrapper {
  border:1px solid black;
  height:200px; /* Tentukan tinggi area paralaks, ukuran lebar tidak begitu penting */
  position:relative; /* Penting! Posisi absolut pada elemen induk */
  overflow:hidden;
}

/* Buat semua layer paralaks sebagai elemen absolut,
   sehingga tampilannya akan bertumpuk satu sama lainnya */
.parallax-wrapper .layer {
  position:absolute;
  top:0;
  right:0;
  bottom:0;
  left:0;
  /* set beberapa pengaturan latar di sini,
     sebelum kita mendefinisikan latar gambar secara sepihak
     pada masing-masing layer */
  background-position:0 0;
  background-color:transparent;
  background-repeat:repeat-x;
}

Setelah itu, gambar-gambar bisa diterapkan pada masing-masing layer:

.parallax-wrapper .layer-1 {background-image:url('img/parallax-bg-1.png')}
.parallax-wrapper .layer-2 {background-image:url('img/parallax-bg-2.png')}
.parallax-wrapper .layer-3 {background-image:url('img/parallax-bg-3.png')}

Navigasi Paralaks

Navigasi ini digunakan untuk menggerakkan latar paralaks —dan konten di dalamnya tentunya, agar paralaks tidak hanya berfungsi sebagai hiasan. Navigasi terdiri dari elemen <span> dengan beberapa tautan di dalamnya. Anda bisa membuatnya menggunakan elemen apa saja, tapi di sini Saya mencoba untuk membuatnya seminimalis mungkin:

<span id="parallax-navigation" class="parallax-navigation">
    <a href="#1">1</a>
    <a href="#2">2</a>
    <a href="#3">3</a>
    <a href="#4">4</a>
    ...
    ...
</span>

CSS untuk navigasinya:

.parallax-navigation {
  display:block;
  height:30px;
  line-height:30px;
  position:relative;
  text-align:right;
  font-size:11px;
  font-weight:bold;
}

.parallax-navigation a {
  text-decoration:none;
  color:black;
  background-color:#eee;
  padding:5px 10px;
}

/* set latar dan warna yang berbeda untuk item navigasi yang sedang aktif */
.parallax-navigation a.active {
  background-color:#529834;
  color:white;
}

Selesai sampai di sini, sekarang kita akan mengerjakan fungsi dasar untuk menggerakkan layer:

Lihat Demo

Efek Paralaks

Beberapa mungkin akan membuat efek paralaks dengan cara menganimasikan properti left pada elemen relatif untuk menggerakkan elemen ke kiri atau ke kanan. Tapi kekurangannya adalah, mengubah jarak left terlalu jauh akan membuat posisi layer berubah dan pada akhirnya akan menghilang dari pandangan jika jaraknya sudah terlalu jauh. Di sini Saya lebih menyarankan untuk menganimasikan posisi latar dibandingkan posisi layer itu sendiri, sehingga layer tidak akan bergerak, hanya latarnya saja yang bergerak.

Namun tidak mendukung properti animasi background-position dengan baik, jadi kita membutuhkan sebuah plugin untuk itu. Anda akan menemukan begitu banyak plugin jQuery yang berfungsi untuk menganimasikan posisi latar jika Anda mencarinya, dan Saya memilih untuk menggunakan plugin animasi posisi latar dari Keith Wood. Saya tidak kenal dengan orang itu, tapi pluginnya bagus ⇒ http://keith-wood.name/backgroundPos.html

<!-- Muat jQuery di awal -->
<script src="js/jquery.js"></script>
<!-- Sertakan plugin jQuery BackgroundPos -->
<script src="js/jquery.backgroundpos.min.js"></script>
<script>
  // Pekerjaan kita di sini...
</script>

Definisikan beberapa variabel untuk mempermudah kita dalam menyeleksi elemen dan sekaligus juga memperbaiki performa. Seperti biasa:

var $parallax = $('#parallax-wrapper'),
    $layer = $parallax.find('.layer'),
    $nav = $('#parallax-navigation');

Setelah itu kita kumpulkan semua item navigasi dan layer di dalam paralaks. Kita akan cenderung menggunakan jQuery .each() di sini, karena ini adalah cara yang paling mudah untuk mendapatkan indeks/urutan masing-masing elemen. Kita akan menganimasikan elemen dengan parameter dari indeks elemen (urutan elemen):

$nav.find('a').each(function() {
    // Saat pengguna mengeklik item navigasi...
    $(this).on("click", function() {
        var step = $(this).index(); // Dapatkan indeks dari setiap item navigasi
        // Kumpulkan layer...
        $layer.each(function() {
            // Definisikan jarak animasi latar pada setiap layer berdasarkan indeksnya
            var distance = ($(this).index()+1) * 200; // Kalikan dengan 200
        });
        return false;
    });
}).first().addClass('active'); // Tambahkan kelas `active` pada item navigasi pertama sebagai awalan

Setelah itu, buat fungsi untuk menambah dan melepas kelas active pada setiap item navigasi. Dulu Saya sudah pernah menuliskan kodenya di sini

$nav.find('a').each(function() {
    // Saat pengguna mengeklik item navigasi...
    $(this).on("click", function() {
        var step = $(this).index(); // Dapatkan indeks dari setiap item navigasi
        $nav.find('.active').removeClass('active'); // Singkirkan kelas `active` pada item navigasi
        $(this).addClass('active'); // Tambahkan kelas `active` pada item navigasi yang diklik
        // Kumpulkan layer...
        $layer.each(function() {
            // Definisikan jarak animasi latar pada setiap layer berdasarkan indeksnya
            var distance = ($(this).index()+1) * 200; // Kalikan dengan 200
        });
        return false;
    });
}).first().addClass('active'); // Tambahkan kelas `active` pada item navigasi pertama sebagai awalan

Animasikan posisi latar pada masing-masing layer dengan parameter berupa urutan layer, sehingga jarak perubahan posisi akan berbeda-beda pada masing-masing layer (lebih tepatnya: jarak animasi akan meningkat berdasarkan urutan layer):

$nav.find('a').each(function() {
    // Saat pengguna mengeklik item navigasi...
    $(this).on("click", function() {
        var step = $(this).index(); // Dapatkan indeks dari setiap item navigasi
        $nav.find('.active').removeClass('active'); // Singkirkan kelas `active` pada item navigasi
        $(this).addClass('active'); // Tambahkan kelas `active` pada item navigasi yang diklik
        // Kumpulkan layer...
        $layer.each(function() {
            // Definisikan jarak animasi latar pada setiap layer berdasarkan indeksnya
            var distance = ($(this).index()+1) * 200; // Kalikan dengan 200
            // Animasikan posisi latar
            $(this).stop().animate({backgroundPosition: '-' + (step*distance) + 'px 0px'}, 1500);
        });
        return false;
    });
}).first().addClass('active'); // Tambahkan kelas `active` pada item navigasi pertama sebagai awalan

Dan beginilah hasil akhir sementara kita. Baru latarnya saja yang dianimasikan, belum ada konten:

Lihat Demo

Langkah Akhir: Menambahkan Konten

Animasi paralaks sudah berhasil dibuat, sekarang tinggal membuat konten paralaks saja. Setiap konten merupakan item yang bisa Anda isi dengan tulisan dan/atau gambar layaknya slideshow:

HTML

<div id="parallax-wrapper" class="parallax-wrapper">
    <div class="layer layer-1"></div>
    <div class="layer layer-2"></div>
    <div class="layer layer-3"></div>
    <div class="box-item-wrapper">
        <div class="box-item"> ... </div>
        <div class="box-item"> ... </div>
        <div class="box-item"> ... </div>
        <div class="box-item"> ... </div>
        ...
        ...
    </div>
</div>

CSS

.box-item-wrapper {
  position:relative;
  overflow:hidden;
}

.box-item-wrapper .box-item {
  float:left; /* posisikan `.box-item` sebagai layout mendatar */
  width:100%;
  margin:7em 0;
  padding:1.5em 2em;
}

Fungsi selanjutnya ditujukan untuk mengeset ukuran kontainer item dan lebar item, serta menganimasikan kontainer item menuju ke kiri dengan jarak tertentu berdasarkan indeks item navigasi. Pertama-tama kita atur ukuran lebar .box-item-wrapper dan .box-item:

var $window = $(window),
    $wrap = $parallax.find('.box-item-wrapper'),
    width, totalWidth; // Variabel kosong

$window.on("resize", function() {

    width = $parallax.width(); // Mendapatkan lebar `#parallax-wrapper`
    totalWidth = width * $wrap.find('.box-item').length; // Lebar total = lebar `#parallax-wrapper` dikalikan jumlah `.box-item`

    // Set lebar `.box-item-wrapper` selebar `totalWidth`
    $wrap.width(totalWidth)
        // Set lebar `.box-item` selebar `#parallax-wrapper`
        .find('.box-item').width(width);

}).trigger("resize");

Saya menuliskan variabel width dan totalWidth kosong, kemudian menyatakan nilainya di dalam $window.on("resize", function() {}) agar lebar elemen bisa diperbaharui setiap kali ukuran layar diubah. Saya juga menyatakan lebar elemen di dalam event tersebut.

Terakhir, gabungkan animasi properti left di dalam event klik item navigasi untuk menganimasikan posisi .box-item-wrapper:

$nav.find('a').each(function() {
    // Saat pengguna mengeklik item navigasi...
    $(this).on("click", function() {
        var step = $(this).index(); // Dapatkan indeks dari setiap item navigasi
        $nav.find('.active').removeClass('active'); // Singkirkan kelas `active` pada item navigasi
        $(this).addClass('active'); // Tambahkan kelas `active` pada item navigasi yang diklik
        // Kumpulkan layer...
        $layer.each(function() {
            // Definisikan jarak animasi latar pada setiap layer berdasarkan indeksnya
            var distance = ($(this).index()+1) * 200; // Kalikan dengan 200
            // Animasikan posisi latar
            $(this).stop().animate({backgroundPosition: '-' + (step*distance) + 'px 0px'}, 1500);
        });
        // Animasikan `.box-item-wrapper` ke kiri untuk menggerakkan `.box-item`
        $wrap.stop().animate({'left': -(step*width)}, 1500);
        return false;
    });
}).first().addClass('active'); // Tambahkan kelas `active` pada item navigasi pertama sebagai awalan

Produk Final

HTML

<div id="parallax-wrapper" class="parallax-wrapper">
    <div class="layer layer-1"></div>
    <div class="layer layer-2"></div>
    <div class="layer layer-3"></div>
    <div class="box-item-wrapper">
        <div class="box-item"> ... </div>
        <div class="box-item"> ... </div>
        <div class="box-item"> ... </div>
        <div class="box-item"> ... </div>
    </div>
</div>

<span id="parallax-navigation" class="parallax-navigation">
    <a href="#1">1</a>
    <a href="#2">2</a>
    <a href="#3">3</a>
    <a href="#4">4</a>
</span>

CSS

.parallax-wrapper {
  border:1px solid black;
  height:200px;
  position:relative;
  overflow:hidden;
}

.parallax-wrapper .layer {
  position:absolute;
  top:0;
  right:0;
  bottom:0;
  left:0;
  background-position:0 0;
  background-color:transparent;
  background-repeat:repeat-x;
}

.parallax-wrapper .layer-1 {background-image:url('img/parallax-bg-1.png')}
.parallax-wrapper .layer-2 {background-image:url('img/parallax-bg-2.png')}
.parallax-wrapper .layer-3 {background-image:url('img/parallax-bg-3.png')}

.box-item-wrapper {
  position:relative;
  overflow:hidden;
}

.box-item-wrapper .box-item {
  float:left;
  width:100%;
  margin:5em 0 0;
  padding:1.5em 2em;
}

.parallax-navigation {
  display:block;
  height:30px;
  line-height:30px;
  position:relative;
  text-align:right;
  font-size:11px;
  font-weight:bold;
}

.parallax-navigation a {
  text-decoration:none;
  color:black;
  background-color:#eee;
  padding:5px 10px;
}

.parallax-navigation a.active {
  background-color:#529834;
  color:white;
}

jQuery

(function($) {

    // Cache some elements
    var $window = $(window),
        $parallax = $('#parallax-wrapper'),
        $layer = $parallax.find('.layer'),
        $wrap = $parallax.find('.box-item-wrapper'),
        $nav = $('#parallax-navigation'), width, totalWidth;

    // Set the parallax content & item width in window resize ...
    // ... so we can be sure that when the window is resized, the size of the elements will be updated too
    $window.on("resize", function() {
        width = $parallax.width(); // get the parallax wrapper width
        totalWidth = width * $wrap.find('.box-item').length; // total width = (parallax wrapper width * box item length)
        $wrap.width(totalWidth).find('.box-item').outerWidth(width);
    }).trigger("resize");

    // Collect all navigation item inside parallax navigation, then get their index to set the animation distance
    $nav.find('a').each(function() {
        // when user click on the navigation item
        $(this).on("click", function() {
            var step = $(this).index(); // get the index (0, 1, 2, 3, ...)
            $nav.find('.active').removeClass('active'); // remove the active class from navigation item
            $(this).addClass('active'); // add the active class to the clicked navigation item
            $layer.each(function() {
                // set the background-position per-animation distance of each layer ...
                // ... based on its index
                var distance = ($(this).index()+1) * 200; // multiplied by 200
                $(this).stop().animate({backgroundPosition: '-' + (step*distance) + 'px 0px'}, 1500); // (jQuery background position plugin required)
            });
            // also, animate the `.box-item-wrapper` to the left to move the `.box-item`
            $wrap.stop().animate({'left': -(step*width)}, 1500);
            return false;
        });
    }).first().addClass('active'); // add active class to the first navigation item on initiation

})(jQuery);

Demo

Lihat Demo Unduh Semua Demo Bonus: Paralaks Orientasi Vertikal

Labels: , , ,

Sunday, February 17, 2013

Generator HTML Peta Gambar Palsu

Image Map

Alat ini digunakan untuk membuat image map palsu menggunakan elemen HTML. Beberapa orang lebih memilih menggunakan yang palsu karena lebih fleksibel. Pada intinya alat ini digunakan untuk mempermudah di dalam merancang ukuran dan posisi lokasi pada tiap bagian di dalam gambar. Mengenai elemen apa yang akan Anda gunakan dan bagaimana Anda memodifikasi tampilannya, itu terserah Anda:

Coba Alat

Bagi para pembaca yang belum mengerti apa itu image map, kalian bisa memulai mempelajarinya di sini. Dan berikut ini adalah contoh gambar yang dihasilkan dari alat yang Saya buat di atas. Coba letakkan pointer mouse Anda di atas wajah-wajah atau badan tokoh kartun di bawah ini untuk mengetahui nama mereka:

Madagascar Animation Characters

Cara Menggunakan

Ambillah sebuah foto atau gambar dimana di dalamnya terdapat beberapa bagian yang memerlukan detail khusus. Misalnya foto keluarga atau peta negara, lalu unggah foto atau gambar tersebut pada blog Anda. Ambil URL gambarnya, kemudian letakkan di dalam input URL yang tersedia. Setelah itu klik tombol Create. Klik tombol Add Location untuk menambahkan lokasi/koordinat baru pada gambar. Geser dan ubah ukurannya sesuai keinginan. Kode HTML akan tampil di bagian area teks sebelah kanan.

Labels: , , ,

Tuesday, February 12, 2013

Modifikasi Widget Posting Populer Menjadi Berwarna-Warni

Widget Posting Populer yang Sudah Dimodifikasi

Pada konfigurasi widget Posting Populer, pastikan bahwa Anda memilih model widget berupa thumbnail dan judul. Setelah itu masuk ke editor HTML template. Salin kode CSS ini dan letakkan di atas kode ]]></b:skin> atau </style>:

/* Custom CSS for Blogger Popular Post Widget */
.PopularPosts ul,
.PopularPosts li,
.PopularPosts li img,
.PopularPosts li a,
.PopularPosts li a img {
  margin:0 0;
  padding:0 0;
  list-style:none;
  border:none;
  background:none;
  outline:none;
}

.PopularPosts ul {
  margin:.5em 0;
  list-style:none;
  font:normal normal 13px/1.4 "Arial Narrow",Arial,Sans-Serif;
  color:black;
  counter-reset:num;
}

.PopularPosts ul li img {
  display:block;
  margin:0 .5em 0 0;
  width:50px;
  height:50px;
  float:left;
}

.PopularPosts ul li {
  background-color:#eee;
  margin:0 10% .4em 0;
  padding:.5em 1.5em .5em .5em;
  counter-increment:num;
  position:relative;
}

.PopularPosts ul li:before,
.PopularPosts ul li .item-title a {
  font-weight:bold;
  font-size:120%;
  color:inherit;
  text-decoration:none;
}

.PopularPosts ul li:before {
  content:counter(num);
  display:block;
  position:absolute;
  background-color:black;
  color:white;
  width:30px;
  height:30px;
  line-height:30px;
  text-align:center;
  top:50%;
  right:-10px;
  margin-top:-15px;
  -webkit-border-radius:30px;
  -moz-border-radius:30px;
  border-radius:30px;
}

/* Set color and level */
.PopularPosts ul li:nth-child(1) {background-color:#E11E28;margin-right:1%}
.PopularPosts ul li:nth-child(2) {background-color:#FD3C03;margin-right:2%}
.PopularPosts ul li:nth-child(3) {background-color:#FECB09;margin-right:3%}
.PopularPosts ul li:nth-child(4) {background-color:#6EBE27;margin-right:4%}
.PopularPosts ul li:nth-child(5) {background-color:#149A48;margin-right:5%}
.PopularPosts ul li:nth-child(6) {background-color:#5BBFF1;margin-right:6%}
.PopularPosts ul li:nth-child(7) {background-color:#61469C;margin-right:7%}
.PopularPosts ul li:nth-child(8) {background-color:#863E86;margin-right:8%}
.PopularPosts ul li:nth-child(9) {background-color:#863E62;margin-right:9%}
.PopularPosts ul li:nth-child(10) {background-color:#815540;margin-right:10%}

Klik Simpan Template. Begitu saja.

Labels: , , , ,

Monday, February 11, 2013

Input Teks dengan Ikon Pembersih

Text Input with Clear Button

Pada peramban WebKit seperti Google Chrome dan Safari, sebuah elemen input bertipe search memiliki kemampuan untuk menampilkan ikon/tombol pembersih kecil di samping input teks jika kita telah mengetikkan sesuatu di dalamnya. Tapi tidak pada peramban yang lain. Terkadang kita merasa butuh dan menyukai fitur itu, dan berharap bisa bekerja pada semua peramban.

Kita bisa menggunakan markup ekstra dan sedikit JavaScript untuk menciptakan rekayasa seperti itu. Tapi untuk memastikan tampilannya polos, gunakan elemen input bertipe text, bukan search:

HTML

<form id="search-form" action="/search" method="get">
    <span class="text-input-wrapper">
        <input type="text" name="q" size="18"><span title="Clear">&times;</span>
    </span>
    <input type="submit" value="Submit">
</form>

CSS

.text-input-wrapper {
  border:1px solid;
  background-color:white;
  padding:1px 6px 1px 1px;
  display:inline-block;
}

.text-input-wrapper input {
  border:none;
  background:none;
  outline:none;
  padding:0 0;
  margin:0 0;
  font:inherit;
}

.text-input-wrapper span {
  cursor:pointer;
  color:blue;
  font-weight:bold;
  visibility:hidden;
}

JavaScript

(function() {
    var searchForm = document.getElementById('search-form'),
        textInput = searchForm.q,
        clearBtn = textInput.nextSibling;
    textInput.onkeyup = function() {
        // Show the clear button if text input value is not empty
        clearBtn.style.visibility = (this.value.length) ? "visible" : "hidden";
    };
    // Hide the clear button on click, and reset the input value
    clearBtn.onclick = function() {
        this.style.visibility = "hidden";
        textInput.value = "";
    };
})();

Demo

Labels: , , ,

Hosting File dengan Google Code dan TortoiseSVN

Pada tanggal 25 Januari 2016 nanti, Google Code akan mematikan layanannya, sehingga tutorial ini tidak akan berlaku lagi pada saat itu. Semua widget yang Saya unggah ke Google Code mungkin juga akan hilang. Sebagai alternatif, Anda bisa mengambil data yang Saya simpan di DropBox di sini.

Selama ini kita biasa menggunakan Google Code untuk menyimpan maksimal hanya tiga jenis berkas/file saja. Yaitu JavaScript, ZIP dan gambar. Selain itu tidak pernah. Alasannya, saat file selain JavaScript, ZIP dan gambar yang tersimpan di Google Code dibuka maka akan gagal bekerja. Misalnya file CSS atau HTML. Saat dibuka malah hanya muncul sebagai teks biasa dan tidak bisa digunakan sebagaimana file CSS dan HTML pada keadaan normal.

Biasanya kita mengunggah file melalui situs Google Code secara langsung, atau bisa juga melalui aplikasi subversi seperti TortoiseSVN. Kabar baiknya, dengan cara mengatur MIME yang beragam pada aplikasi tersebut, maka itu akan memungkinkan kita untuk mengunggah berbagai file dengan format yang berbeda-beda. Sehingga direktori Google Code tidak lagi berfungsi sebagai ruang penyimpanan file berupa kode saja, tetapi juga bisa kita gunakan untuk menyimpan berbagai macam file seperti halnya situs-situs penyedia layanan hosting file pada umumnya.

Saya masih belum begitu berani untuk mengungkapkan apa itu pengertian MIME. Tapi kalau kamu ingin mencari tahu lebih jauh, kamu bisa membacanya di Wikipedia – MIME

Dengan mendefinisikan properti otomatis pada aplikasi, maka kita bisa mengunggah beberapa file yang bisa dibilang sama sekali tidak ada hubungannya dengan kode seperti PDF, DOC, SWF (Flash), WAV dan lain-lain.

Untuk mengubah masukan berkas Google Code menjadi lebih luas, maka ada dua buah hal yang harus kita lakukan. Pertama adalah menginstal aplikasi TortoiseSVN dan ke dua adalah membuat sebuah halaman proyek baru.

Pekerjaan I: Menginstal TortoiseSVN

Kunjungi situs ini ⇒ http://tortoisesvn.net/downloads.html. Unduh aplikasi tersebut lalu instal. Setelah terinstal, komputer harus di-restart karena aplikasi ini akan terintegrasi dengan menu konteks/menu klik kanan (shell command).

Setelah itu klik kanan pada desktop atau jendela eksplorasi berkas. Pilih menu TortoiseSVN » Settings:

TortoiseSVN Settings
TortoiseSVN » Settings

Akan muncul kotak dialog seperti ini. Klik General dan klik tombol Edit:

TortoiseSVN Configuration
Pengaturan TortoiseSVN

Setelah file config terbuka, salin kode ini dan letakkan di bawah komentar # Makefile = svn:eol-style=native

[miscellany]
enable-auto-props = yes

[auto-props]
# Scriptish formats
*.bat        = svn:eol-style=native; svn:keywords=Id; svn-mine-type=text/plain
*.bsh        = svn:eol-style=native; svn:keywords=Id; svn:mime-type=text/x-beanshell
*.cgi        = svn:eol-style=native; svn:keywords=Id; svn-mine-type=text/plain
*.cmd        = svn:eol-style=native; svn:keywords=Id; svn-mine-type=text/plain
*.js         = svn:eol-style=native; svn:keywords=Id; svn:mime-type=text/javascript
*.php        = svn:eol-style=native; svn:keywords=Id Rev Date; svn:mime-type=text/x-php
*.pl         = svn:eol-style=native; svn:keywords=Id; svn:mime-type=text/x-perl; svn:executable
*.pm         = svn:eol-style=native; svn:keywords=Id; svn:mime-type=text/x-perl
*.py         = svn:eol-style=native; svn:keywords=Id; svn:mime-type=text/x-python; svn:executable
*.sh         = svn:eol-style=native; svn:keywords=Id; svn:mime-type=text/x-sh; svn:executable
# Image formats
*.bmp        = svn:mime-type=image/bmp
*.gif        = svn:mime-type=image/gif
*.ico        = svn:mime-type=image/ico
*.jpeg       = svn:mime-type=image/jpeg
*.jpg        = svn:mime-type=image/jpeg
*.png        = svn:mime-type=image/png
*.tif        = svn:mime-type=image/tiff
*.tiff       = svn:mime-type=image/tiff
# Data formats
# *.pdf      = svn:mime-type=application/pdf
# *.avi      = svn:mime-type=video/avi
# *.doc      = svn:mime-type=application/msword
# *.eps      = svn:mime-type=application/postscript
*.gz         = svn:mime-type=application/gzip
# *.mov      = svn:mime-type=video/quicktime
# *.mp3      = svn:mime-type=audio/mpeg
*.ppt        = svn:mime-type=application/vnd.ms-powerpoint
*.ps         = svn:mime-type=application/postscript
# *.psd      = svn:mime-type=application/photoshop
*.rtf        = svn:mime-type=text/rtf
# *.swf      = svn:mime-type=application/x-shockwave-flash
*.tgz        = svn:mime-type=application/gzip
# *.wav      = svn:mime-type=audio/wav
# *.xls      = svn:mime-type=application/vnd.ms-excel
*.zip        = svn:mime-type=application/zip
# Text formats
.htaccess    = svn:mime-type=text/plain
*.css        = svn:mime-type=text/css
*.dtd        = svn:mime-type=text/xml
*.html       = svn:mime-type=text/html
*.ini        = svn:mime-type=text/plain
*.sql        = svn:mime-type=text/x-sql
*.txt        = svn:mime-type=text/plain
*.xhtml      = svn:mime-type=text/xhtml+xml
*.xml        = svn:mime-type=text/xml
*.xsd        = svn:mime-type=text/xml
*.xsl        = svn:mime-type=text/xml
*.xslt       = svn:mime-type=text/xml
*.xul        = svn:mime-type=text/xul
*.yml        = svn:mime-type=text/plain
CHANGES      = svn:mime-type=text/plain
COPYING      = svn:mime-type=text/plain
INSTALL      = svn:mime-type=text/plain
Makefile*    = svn:mime-type=text/plain
README       = svn:mime-type=text/plain
TODO         = svn:mime-type=text/plain
# Code formats
*.c          = svn:eol-style=native; svn:keywords=Id; svn:mime-type=text/plain
*.cpp        = svn:eol-style=native; svn:keywords=Id; svn:mime-type=text/plain
*.h          = svn:eol-style=native; svn:keywords=Id; svn:mime-type=text/plain
*.java       = svn:eol-style=native; svn:keywords=Id; svn:mime-type=text/plain
*.as         = svn:eol-style=native; svn:keywords=Id; svn:mime-type=text/plain
*.mxml       = svn:eol-style=native; svn:keywords=Id; svn:mime-type=text/plain
# Webfonts
# *.eot      = svn:mime-type=application/vnd.ms-fontobject
# *.woff     = svn:mime-type=application/x-font-woff
# *.ttf      = svn:mime-type=application/x-font-truetype
# *.svg      = svn:mime-type=image/svg+xml

1 Desember 2013: Saya mengomentari beberapa tipe MIME yang biasa digunakan untuk penyalahgunaan akun Google Code, untuk memastikan agar akun kamu cukup aman. Semua data yang kamu simpan di Google Code haruslah digunakan untuk kepentingan kode sumber terbuka yang bisa diakses serta dipelajari oleh siapa saja. Mengompres dan membuat kode menjadi tidak bisa dibaca sangat tidak disarankan jika kamu ingin menggunakan akun Google Code. Kamu bisa mengaktifkannya kembali dengan cara menghapus simbol # sebelum ekstensi jika kamu ingin bisa mengunggah berkas dengan ekstensi tersebut ke Google Code. Tetapi resiko ditanggung sendiri.

Simpan perubahan yang kamu lakukan. Biarkan sampai di sini dulu.

Pekerjaan II: Membuat Halaman Proyek Baru

Jika belum punya akun Google, buat terlebih dahulu agar bisa mendapatkan akses ke Google Code. Kunjungi http://code.google.com, lalu klik Create A New Project:

Create a New Project
Buat proyek baru.

Isi formulirnya, atur pilihan version control system ke Subversion, lalu pilih lisensi yang kamu kehendaki untuk file-file yang diunggah di situ:

Filling the Project Form
Mengisi formulir.

Klik Create Project. Kamu akan dibawa menuju halaman dasbor proyek barumu jika sudah berhasil. Klik tab Source lalu klik tautan googlecode.com password untuk membuat password. Ini digunakan untuk menghubungkan aplikasi dengan proyek Google kamu:

Generating Google Code Password
Mengenerasikan password Google Code.

Catat password yang tampil:

Generated Password
Password —dan alamat email— sudah digenerasikan.

Mulai Mengunggah

Buka aplikasi TortoiseSVN dengan cara mengeklik kanan pada desktop atau jendela eksplorasi berkas lalu pilih TortoiseSVN » Repo-browser:

Repo Browser
Repo browser.

Akan muncul kotak dialog untuk memasukkan URL proyek:

Input the Project URL
Memasukkan URL proyek.

Pola URL selalu berbentuk seperti ini:

https://nama_proyek.googlecode.com/svn/trunk/

Yang harus diingat dan yang paling sering membuat gagal dalam pengunggahan file: Saat menuliskan URL proyek di aplikasi, gunakan https, tapi saat ingin melihat hasilnya atau mengakses hasil kerjanya secara online, gunakan http

Klik OK. Tunggu sampai proses memuat selesai.

Buka folder dimana terdapat file yang ingin diunggah. Seret file yang diinginkan ke area daftar file unggahan:

Uploading
Mengunggah file.

Tunggu beberapa saat, maka kamu akan diminta untuk mengautentikasikan akun Google Code kamu seperti ini:

Authentication
Autentikasi akun Google Code.

Isi alamat email dan password yang sebelumnya sudah kamu catat. Centang Save authentication agar kita tidak perlu berkali-kali login pada saat pengunggahan file di masa mendatang.

Dengan menggunakan aplikasi subversi, selain bisa mengunggah berbagai file yang tidak biasa, kita juga bisa mengedit file yang sudah kita unggah. Sehingga kita tidak perlu menghapus file lama dan mengunggah file yang baru berulang kali seperti saat menggunakan akun Google Code pada umumnya.

Untuk memeriksa hasil kerja satu per satu secara online, akses pola URL ini:

http://nama_proyek.googlecode.com/svn/trunk/

Kita juga bisa mengedit (hanya mengedit) file melalui situs Google Code secara langsung (jika kita memberikan izin pada pengaturan pengeditan secara online). Kunjungi pola URL ini:

http://code.google.com/p/nama_proyek/source/browse/trunk/

Labels: ,

Saturday, February 2, 2013

DL, DT, DD dalam Layout Tabel

Definition List/Description List

Sebagai catatan, perpanjangan dl sebagai definition list pada HTML4 telah diganti menjadi description list pada HTML5 — HTML5 Doctor - The DL Element

HTML

<dl class="member-details">

    <dt>Nama:</dt>
    <dd>Lulu Tralala</dd>

    <dt>Usia:</dt>
    <dd>17</dd>

    <dt>Jenis Kelamin:</dt>
    <dd>Wanita</dd>

    <dt>Lahir:</dt>
    <dd>14 April 1992</dd>

    <dt>Alamat:</dt>
    <dd><em>Belum dilengkapi</em></dd>

    <dt>Keterangan:</dt>
    <dd>Lorem ipsum dolor sit amet...</dd>

</dl>

CSS

.member-details {
  margin:0 0 1.7em 0;
  padding:0 0;
  overflow:hidden;
}

.member-details dt,
.member-details dd {
  margin:0 0 2px 136px; 
  padding:5px 7px;
  background-color:#eee;
}

.member-details dt {
  background-color:#BC4106;
  float:left;
  font-weight:bold;
  width:120px;
  clear:left;
  margin-left:0;
}

Demo

Labels: , ,

Menangani Variabel yang Tidak Hadir/Hilang

Fungsi ini digunakan untuk memastikan bahwa JavaScript tidak akan mengalami gangguan/error jika salah satu variabel tidak sempat ditentukan. Hal ini biasanya disebabkan karena kelalaian pengguna yang lupa menuliskan variabel yang dibutuhkan, sehingga salah satu variabel yang harus ada untuk mengaktifkan plugin yang dia pakai tidak hadir/hilang; Atau karena developer plugin tersebut telah memperbaharui plugin buatannya dengan menambahkan beberapa variabel baru, sementara para pengguna yang menggunakan plugin melalui hosting dari sumber plugin secara langsung sudah cukup banyak. Developer tidak mungkin memberitahu para pengguna untuk mengeset variabel baru agar plugin mereka bisa bekerja kembali. Itu merepotkan:

function handleVars(options) {

    // Set beberapa variabel default/standar di sini:
    var defaults = {
        "name": "Anonymous",
        "age": "Unknown",
        "site": "Not available",
        "email": "Not available",
        "address": "Unknown"
    };

    // Cek apakah key `options[i]` tidak hadir/tidak ditentukan.
    // Jika tidak hadir, gantikan dengan `defaults[i]` 
    for (var i in defaults) {
        options[i] = (typeof options[i] == "undefined") ? defaults[i] : options[i];
    }

    return options;

}

Anda bisa menentukan/menambah/mengedit beberapa variabel standar/default pada plugin yang Anda buat di dalam objek defaults. Fungsi di atas akan menjaga para pengguna dari gangguan yang disebabkan oleh ketidakhadiran variabel yang diperlukan karena kesalahan atau pembaharuan. Fungsi di atas akan memastikan bahwa: jika variabel tidak hadir, maka variabel tersebut akan digantikan oleh variabel standar yang sudah dituliskan di dalam objek defaults.

Sebagai contoh, variabel pada plugin yang harus ada adalah name, age, site, email dan address. Sedangkan yang kita tuliskan/deklarasikan hanya tiga variabel:

var myWidgetConfig = handleVars({
    "name": "Taufik Nurrohman",
    "age": 21,
    "site": "//www.dte.web.id"
});

Tidak masalah. Beberapa variabel yang tidak sempat dideklarasikan akan mengikuti variabel standar yang telah kita tentukan di dalam handleVars, sehingga myWidgetConfig akan menghasilkan konfigurasi seperti ini secara tidak langsung:

var myWidgetConfig = {
    "name": "Taufik Nurrohman",
    "age": 21,
    "site": "//www.dte.web.id",
    "email": "Not available",
    "address": "Unknown"
};

Lihat Demo

Labels: , , ,