jQuery hoverIntent untuk Injected Element

Apa itu jQuery hoverIntent ?,  jQuery hoverIntent adalah sebuah plugin jQuery yang berguna untuk rekan-rekan sekalian jika ingin mengkustomasi event seperti hover, mouseenter, mouseleave atau mouse move yang disediakan jQuery. Sebagai contoh : dengan event jQuery hover standar, setelah element di hover, saat itu juga function callback akan di panggil, dengan jquery hoverIntent, rekan-rekan bisa men-delay hal tersebut, misal rekan-rekan ingin memanggil function callback, jika element sudah di hover selama 3 detik, jika kurang dari 3 detik, maka function callback tidak akan dipanggil. Plugin ini tentunya berguna untuk beberapa kasus seperti Hover Nama User di Facebook, yang delay beberapa miliseconds sebelum menampilkan pop up detail User, dll. Lebih detail mengenai penjelasan dan penggunaan jQuery hoverIntent silakan baca di situsnya.

Namun plugin jQuery hoverIntent, memiliki sebuah kekurangan yaitu, plugin ini tidak bisa diterapkan oleh Injected Element.
Contoh

$(document).ready(function(){

$(‘.element-class’).hoverIntent({

over : makeOver,

interval : 3000,

out : makeOut

});

$(‘.some-button’).click(function(){

$(‘body’).append(‘<a class=”element-class”>ini hover delay</a>’);

});

$(‘.some-button-other’).click(function(){

$(‘body’).append(‘<a class=”element-class”>ini hover delay juga</a>’);

});

});

Pada Contoh diatas, element yang baru rekan-rekan append ke body ketika user klik sebuah tombol, ketika di hover tidak akan terjadi apa-apa, walau sudah menunggu 3000 ms, intinya jQuery hoverIntent tidak berlaku pada element yang di append setelah halaman selesai di load. Untuk mengatasi hal ini, ada beberapa 2 solusi yang saya ajukan

1. Trigger jQuery hoverIntent setiap penambahan element

$(document).ready(function(){

$(‘.element-class’).hoverIntent({

over : makeOver,

interval : 3000,

out : makeOut

});

$(‘.some-button’).click(function(){

$(‘body’).append(‘<a class=”element-class”>ini hover delay</a>’);

$(‘.element-class’).hoverIntent({

over : makeOver,

interval : 3000,

out : makeOut

});

});

$(‘.some-button-other’).click(function(){

$(‘body’).append(‘<a class=”element-class”>ini hover delay juga</a>’);

$(‘.element-class’).hoverIntent({

over : makeOver,

interval : 3000,

out : makeOut

});

});

});


Tentunya hal ini tidak solutif, karena ketika aplikasi yang dibuat misal harus berkali-berkali menginjeksi element serupa dengan trigger yang berbeda beda, maka rekan-rekan harus menyalin kode trigger hoverIntent ketika element selesai di injeksi, dan sangat memungkinkan trigger lupa terpasang ketika injeksi element selesai.

2. Modifikasi jQuery hoverIntent

Solusi ini paling mudah dan paling relevan, modifikasi dilakukan dengan mengubah binding pada plugin jQuery hoverIntent yang awalnya bind dan unbind menjadi live dan unlive, tentunya beberapa perubahan minor pada passing parameter antar function dalam plugin. Namun sama sekali tidak mengubah kegunaan dari plugin ini sendiri. Penggunaannya cukup :

$(document).ready(function(){

$(‘.element-class’).hoverIntent({

over : makeOver,

interval : 3000,

out : makeOut

});

});

Cukup dengan kode itu saja, maka semua element terkait baik yang sudah ada sebelum halaman di load, ataupun element yang baru ada setelah di injeksi akan tetap terpengaruh oleh hoverIntent.

Script plugin yang di sudah modifikasi ada disini :

https://github.com/pentatonicfunk/jQuery-hoverIntent-Live

Referensi :

http://cherne.net/brian/resources/jquery.hoverIntent.html

http://api.jquery.com/category/events/

http://php.refulz.com/jquery-bind-unbind-and-live-methods/

http://api.jquery.com/live/

http://odetocode.com/blogs/scott/archive/2007/07/05/function-apply-and-function-call-in-javascript.aspx

Advertisements

3 thoughts on “jQuery hoverIntent untuk Injected Element

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s