This Blog

Syndication

News

Awards

Microsoft MVP Logo
Grab this badge here!

Certificates

Transcript ID#: 6724122
Brainbench ASP.NET Certificate
 
Brainbench ASP.NET 2.0 Certificate
 
Brainbench .NET Framework 2.0 Certificate

Ahmad Masykur

var myObject = { "languages" : [ "C#", "VB.NET", "ASP.NET", "Javascript", "SDCC", "Assembler" ] }; //

April 2009 - Posts

  • Analisis Performance Pemilu.TV dengan HttpWatch

    Z beberapa jam yang lalu telah mempublikasikan pemilu.tv dalam blog-nya di sini. Z menulis bahwa halaman tersebut memakan waktu cukup lama untuk membukanya. Saya coba analisis kenapa itu lama dan bagaimana cara memperbaikinya. Saya coba analisis singkat performance-nya dengan HttpWatch Pro yang baru saja saya dapat dari SimTec.

    image

    Dari data yang diambil dari HttpWatch bahwa terdapat dua kali request ke server pemilu.tv. Pertama adalah request page beserta javascript-nya. Yang kedua adalah request XAP file beserta datanya.

    imageimage 

    Pada request yang pertama terlihat bahwa Z menggunakan ScriptManager debug mode (lihat pada gambar di atas). Dari data tersebut, pada request pertama 11.164 detik digunakan untuk download javascript dari ASP.NET ScriptManager dan Silverlight control (javascript) sebesar 444359 bytes (sekitar 434KB).

    Perbaikan performance dapat dilakukan dengan tidak menggunakan ScriptManager. Jika tidak membutuhkan coding Silverlight dengan JavaScript tidak perlu include javascript untuk Silverlight. Dalam page bisa langsung menggunakan tag <embed....>. Dengan cara tersebut bisa menghemat file yang didownload 450KB. Page utamanya juga lebih ringan karena banyak tag yang bisa dibuang.

    Pada request yang kedua (gambar di bawah) total file yang didownload mencapai 1,4MB. Dalam request tersebut terdapat download dua buah file yang berukuran gede. File pertama adalah XAP file yang merupakan inti aplikasi Silverlight 2.0. File kedua sepertinya data peta pulau jawa dan bali. Selain itu juga terdapat request 404 terhadap file favicon.ico selama 0.7 detik.

    image

    Untuk memperbaiki performance pada request ini dapat dilakukan dengan.

    1. Hindari penggunaan embeded font
    2. Compile dengan release mode
    3. Gunakan data yang lebih ringan dibandingkan .shp. Misalnya untuk gambar peta bisa langsung dalam bentuk XAML atau JSON data.
    4. Buat file favicon.ico sehingga tidak ada lagi request 404.

    Cukup ini dulu analisis singkat dari saya. Semoga situs tersebut bisa lebih ringan dari sekarang. Dengan HttpWatch kita bisa analisis performance situs dan bagaimana melakukan improvement walaupun tidak tahu source-code-nya.

    Terima kasih kepada Simon Perkins yang telah memberikan license HttpWatch Pro kepada saya.

    Share this post: | | | |
  • IE8 Local Storage Support

    Local Storage merupakan salah satu dukungan dari HTML5. IE8 telah menerapkan beberapa dukungan HTML5 yang merupakan spesifikasi web masa depan. IE dari dulu selalu beberapa lebih maju dari browser lainnya dalam penerapan Ajax. Ajax pertama kali dikenalkan oleh Microsoft pada aplikasi Outlook Web Access dengan IE4. Kali ini Microsoft melangkah lebih maju lagi dalam penerapan local storage untuk mempercepat kinerja aplikasi Ajax.

    Local storage bukan barang baru dalam dunia web. Google telah mengenalkan produknya Google Gear untuk mendukung local storage. Adobe juga mengeluarkan AIR yang mendukung local storage. Microsoft Silverlight dan Adoba Flash juga memiliki kemampuan menyimpan dalam local storage. Semua kemampuan software tersebut menawarkan kemampuan untuk menyimpan dalam local PC dengan caranya masing-masing. Untuk menggunakan local storage juga membutuhkan plug-ins yang terinstall di PC. IE8 menawarkan kemampuan local storage dalam internal browser sehingga tidak memerlukan plug-ins tambahan yang dinamakan DOM Storage.

    Dulu untuk menyimpan nilai dalam local PC digunakan cookie. Keterbatasan cookie adalah tidak bisa menyimpan data dalam jumlah besar (max 4KB). Cookie juga disimpan dalam pasangan key dan value string yang selalu ditransmisikan ke server pada setiap request. Berbeda dengan DOM storage yang memiliki kapasitas penyimapanan lebih besar yaitu 10MB dan tidak mentransmisikan isinya pada setiap request ke server.

    Untuk menggunakan DOM storage cukup mudah hanya dengan perintah localStorage.setItem(key, value). Untuk mengambilnya dan menghapusnya juga mudah, cukup dengan localStorage.getItem(key) dan localStorage.removeItem(key). Untuk menghapus semua DOM storage cukup dengan perintah localStorage.clear()

    // Store a key-value pair. localStorage.setItem("Sean","Purcell"); // Retrieve value string for a given key. var storeditem = localStorage.getItem("Sean"); // Remove item from store. localStorage.removeItem("Sean"); // Clear the store. localStorage.clear();

    Sekarang coba kita praktekkan membuat halaman sederhana untuk menyimpan DOM storage.

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta content="IE=8" http-equiv="X-UA-Compatible"> <title>HTML 5.0 DOM Store</title> <script type="text/javascript"> var key1 = 'defaultkey'; function getValue() { if (window.localStorage) { var storeditem = localStorage.getItem(key1); if(storeditem != null) { document.getElementById("textinput").value = storeditem; } } else { window.alert('Your browser does not support localStorage'); } } function setValue() { var itemindex = document.getElementById('textinput').value; alert(itemindex); if (window.localStorage) { localStorage.setItem(key1,itemindex); } else { window.alert('Your browser does not support localStorage'); } } function clearItems() { localStorage.clear(); } function clear_text() { document.getElementById('textinput').value = ''; } </script> </head> <body onload="getValue();"> <h1>Type into the text area and retrieve your text from the local store in Internet Explorer 8.</h1> <div> Enter Text: <input id="textinput" onclick="clear_text();" size="60" type="text" value="Your message here"> <input onclick="setValue();" type="submit" value="Send to Store"> </div> <button onclick="clearItems();">Clear Stored selection</button> </body> </html>

    Dalam contoh kode di atas, ketika event onLoad akan mengambil nilai yang telah disimpan dalam DOM storage dan menampilkannya pada input box. Jika dalam PC Anda belum ada data, localStorage.getItem(key) akan mengembalikan nilai null.

    image

    Ketika teks telah disimpan dalam DOM storage, selamanya teks tersebut akan tersimpan walaupun browser telah ditutup.

    Dengan memanfaatkan DOM storage, aplikasi Ajax kita akan terasa lebih cepet karena beberapa data tidak perlu diambil lagi dari server.

    Share this post: | | | |
    Posted Apr 24 2009, 01:51 PM by cahnom with 1 comment(s)
    Filed under: ,
  • Blog Menarik mengenai Microsoft Ajax 4

    Siang ini saya menemukan blog menarik yang membahas teknologi Microsoft Ajax ke depan. Mulai dari ADO.NET Data Service, Microsoft Ajax Client Template hingga live binding dengan Microsoft Ajax. Lebih lengkapnya silakan kunjungi blog Politian di sini.

    Share this post: | | | |
  • Mengurutkan Table dengan jQuery Plugin: Table-Sorter

    Menyambung tulisan saya sebelumnya mengenai tabulasi data KPU dengan Ajax Client template. Halaman tersebut hanya berfungsi menampilkan data apa adanya dalam bentuk table. Dengan sedikit tambahan code dan plug-ins tablesorter, table yang ditambilkan dapat diurutkan dengan menekan klik pada header (No, Nama Parta dan Suara).

    image 

    Hasil seletelah diurutkan berdasarkan jumlah suara.

    image

    Cukup dengan dua baris code tambahan berikut

    <script type="text/javascript" src="http://tablesorter.com/jquery.tablesorter.js"> </script>

    dan

    $('#tabulasi').tablesorter();

    Dimana 'tabulasi' adalah id dari table yang digunakan. Code selengkapnya sebagai berikut.

    <html> <head> <title>Tabulasi KPU dengan Ajax Client Template</title> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></script> <script type="text/javascript" src="http://tablesorter.com/jquery.tablesorter.js"></script> <script type="text/javascript" src="MicrosoftAjax.js"></script> <script type="text/javascript" src="MicrosoftAjaxTemplates.js"></script> </head> <body xmlns:sys="BLOCKED SCRIPTSys" xmlns:dataview="BLOCKED SCRIPTSys.UI.DataView" sys:activate="*"> <table id="tabulasi"> <thead> <tr style="cursor:hand"><th>No</th><th>Nama Partai</th><th>Suara</th></tr> <tbody sys:attach="dataview" class="sys-template" dataview:data="{{ d }}"> <tr> <td>{{ no }}</td> <td>{{ name }}</td> <td>{{ value }}</td> </tr> </tbody> </table> <script type="text/javascript"> var d = []; Sys.Observer.makeObservable(d); $(document).ready(function() { $.getJSON('http://jania.pe.kr/u/jsonp.cgi?url=http://tnp.kpu.go.id/tab2009/update/dataindex/nasional.txt&callback=?', function(eArgs) { var i; var e = Sys.Serialization.JavaScriptSerializer.deserialize(eArgs.content); var vals = e.elements[0].values; for(i=0; i < vals.length; i++) { var _d = { no: e.x_axis.labels.labelsIdea, value: valsIdea.top.toString(), name: /\d{1,2}\s([a-zA-Z0-9\s\(\)]*)\x3Cbr\x3E/.exec(valsIdea.tip)[1] }; d.add(_d); } $('#tabulasi').tablesorter(); }); }); </script> </body>

    Kita juga bisa tambahkan CSS untuk mempermanis tambilan table. Dokumentasi selengkapnya mengenai penggunakaan table-sorter dapat dilihat di http://tablesorter.com/docs/. Demo halaman dengan table-sorter dapat dilihat di http://tnp.masykur.web.id/client-template-tablesorter.html

    Dengan kombinasi ASP.NET Ajax, jQuery dan plug-ins-nya kita bisa membuat halaman web yang ringan dan interaktif, dengan sedikit code.

    Share this post: | | | |
  • Tabulasi KPU dengan ASP.NET Ajax Client Template

    ASP.NET Ajax Client Template merupakan fitur baru dalam ASP.NET Ajax 4 (saat ini masih preview 4). Dengan menggunakan client template kita bisa membuat template layaknya dalam server side ASP.NET. Layout yang kompleks sekalipun dengan mudah dibuat menggunakan template. Dalam tulisan ini saya akan coba jelaskan bagaimana menggunakan client template untuk kasus tabulasi pemilu 2009. Dalam contoh program digunakan beberapa teklonogi antara lain

    1. jQuery
    2. ASP.NET Ajax 4 (MicrosoftAjax.js)
    3. ASP.NET Ajax Template (MicrosoftAjaxTemplate.js)
    4. JSONP proxy (http://jania.pe.kr/aw/moin.cgi/JsonpProxy). Digunakan untuk cross domain call.

    Data source pada tulisan ini tidak menggunakan service yang dibuat oleh Pak Tahir melainkan langsung diambil dari website KPU. Website KPU sebenarnya tidak membuka web service khusus yang dapat dipanggil dari luar. Dengan sedikit ketekunan kita bisa menemukan jalan untuk mengambil datanya secara langsung. Ketika kita bukan halaman muka situs tabulasi pemilu milik KPU, kita lihat bahwa situs tersebut menggunakan flash chart. Jika diintip source HTML-nya, kita bisa dapatkan bahwa chart tersebut mengambil data dari alamat http://tnp.kpu.go.id/tab2009/update/dataindex/nasional.txt. Data tersebut berupa JSON string yang dapat kita pake langsung dengan menggunakan JavaScript. Dengan berbekal informasi tersebut kita bisa manfaatkan Url tersebut sebagai dataasource.

    Langkah pertama yang perlu kita persiapkan adalah

    1. Download ASP.NET Ajax 4 di sini.
    2. Uraikan file ASP.NET Ajax Preview 4.zip dan ambil file MicrosoftAjax.js dan MicrosoftAjaxTemplate.js ke dalam folder kerja kita.
    3. Buat halaman HTML dan tambahkan referensi script jQuery (http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js) dan kedua file MicrosoftAjax.js dan MicrosoftAjaxTemplate.js

    Simak HTML berikut.

    <html> <head> <title>Tabulasi KPU dengan Ajax Client Template</title> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></script> <script type="text/javascript" src="MicrosoftAjax.js"></script> <script type="text/javascript" src="MicrosoftAjaxTemplates.js"></script> </head> <body xmlns:sys="BLOCKED SCRIPTSys" xmlns:dataview="BLOCKED SCRIPTSys.UI.DataView" sys:activate="*"> <table> <thead> <tr><th>No</th><th>Nama Partai</th><th>Suara</th></tr> <tbody sys:attach="dataview" class="sys-template" dataview:data="{{ d }}"> <tr> <td>{{ no }}</td> <td>{{ name }}</td> <td>{{ value }}</td> </tr> </tbody> </table> <script type="text/javascript"> var d = []; Sys.Observer.makeObservable(d); $(document).ready(function() { $.getJSON('http://jania.pe.kr/u/jsonp.cgi?url=http://tnp.kpu.go.id/tab2009/update/dataindex/nasional.txt&callback=?', function(eArgs) { var i; var e = Sys.Serialization.JavaScriptSerializer.deserialize(eArgs.content); var vals = e.elements[0].values; for(i=0; i < vals.length; i++) { var _d = { no: e.x_axis.labels.labelsIdea, value: valsIdea.top.toString(), name: /\d{1,2}\s([a-zA-Z0-9\s\(\)]*)\x3Cbr\x3E/.exec(valsIdea.tip)[1] }; d.add(_d); } }); }); </script> </body>

    Untuk membuat Ajax Client Template pada halaman HTML, yang perlu dipersiapkan adalah

    Tambahkan namespace pada BODY tag.
    <body xmlns:sys="BLOCKED SCRIPTSys" xmlns:dataview="BLOCKED SCRIPTSys.UI.DataView" sys:activate="*">
    Buat template

    <table> <thead> <tr><th>No</th><th>Nama Partai</th><th>Suara</th></tr> <tbody sys:attach="dataview" class="sys-template" dataview:data="{{ d }}"> <tr> <td>{{ no }}</td> <td>{{ name }}</td> <td>{{ value }}</td> </tr> </tbody> </table>

    Pada template kita butuh mendefinisikan attribute sys:attach="dataview" dan class="sys-template" untuk menggunakan object dataview. Sedangkan dataview:data="{{ d }}" digunakan untuk mengambil datasource dari observer data d. ASP.NET Ajax 4 telah mendukung observer pattern yaitu sebuah object array memiliki event trigger. Ketika ada perubahan data pada array akan memberitahukan kalo ada data yang diubah. Dengan pattern ini, apapun perubahan data akan otomatis merubah pada data yang di-render pada template.

    Ambil data dari KPU dengan jQuery

    Pada jQuery 1.2 dan versi yang lebih baru telah tersedia method yang digunakan untuk request data cross domain menggunakan teknik JSONP. Pada kenyataannya tidak semudah itu melakukan request cross domain. Tidak semua situs mendukung cross domain scripting. Karena situs KPU tidak menyediakan service resmi dan kita pake trik khusus untuk mendapatkan data dari KPU. Cross domain request ke situs KPU tidaklah mungkin. Untuk mengatasi hal ini diperlukan sebuat situs proxy yang menyediakan padding untuk JSONP. Saya gunakan http://jania.pe.kr/aw/moin.cgi/JsonpProxy sebagai jembatan antara KPU dan client scripting.

    var d = []; Sys.Observer.makeObservable(d); $(document).ready(function() { $.getJSON('http://jania.pe.kr/u/jsonp.cgi?url=http://tnp.kpu.go.id/tab2009/update/dataindex/nasional.txt&callback=?', function(eArgs) { var i; var e = Sys.Serialization.JavaScriptSerializer.deserialize(eArgs.content); var vals = e.elements[0].values; for(i=0; i < vals.length; i++) { var _d = { no: e.x_axis.labels.labelsIdea, value: valsIdea.top.toString(), name: /\d{1,2}\s([a-zA-Z0-9\s\(\)]*)\x3Cbr\x3E/.exec(valsIdea.tip)[1] }; d.add(_d); } }); });

    Pada javascript di atas, baris pertama adalah deklarasi object d yang digunakan sebagai datasource. Baris berikutnya kita register object d sebagai observer object. Untuk melakukan cross domain request, digunakan method $.getJSON pada jQuery. Hasilnya berupa JSON string yang harus di-deserialize terlebih dahulu ke JSON object dengan method ASP.NET Ajax Sys.Serialization.JavaScriptSerializer.deserialize.

    Setelah data diambil, data secara otomatis akan tampil dalam bentuk tabel. Demo kode tersebut dapat dilihat di http://tnp.masykur.web.id/client-template.html

    Semoga bermanfaat.

    Share this post: | | | |
  • Menggambar Jam Analog dengan JavaScript

    Pada posting sebelumnya saya pernah membahas bagaimana menggambar dengan JavaScript dan membuat chart tabulasi pemilu dengan JavaScript. Pada post tentang menggambar dengan JavaScript saya gunakan element DIV yang dirender berjejer membentuk garis dan lingkaran. Cara tersebut bukanlah best-practice. Sedangkan pada JavaScript chart tidak menggunakan element DIV melainkan element CANVAS yang ada pada spesifikasi HTML5.

    HTML5 sudah didukung oleh browser terkini seperti Firefox, Safari, Opera, dan Google Chrome. Dokumentasi pemprograman dengan CANVAS dapat dilihat di https://developer.mozilla.org/en/Canvas_tutorial. IE sendiri sampai versi 8 belum mendukung element CANVAS. Untuk mengantisipasi kebutuhan ini bisa digunakan Vector Markup Language (VML) dengan ActiveX object Microsoft Vector Graphics Rendering (vgx.dll) untuk menggambar dalam HTML sebagai ganti CANVAS. Bahasa antara VML dengan CANVAS tidak sama. Untuk menyamakan bahasa antara rendering CANVAS dan VML digunakan library bantu excanvas yang dapat diunduh di http://excanvas.sourceforge.net/

    Berikut adalah contoh penerapan penggunaan CANVAS untuk menggambar jam analog.

    <html> <head> <title>Canvas</title> <!--[if IE]><script type="text/javascript" src="excanvas.js"></script><![endif]--> </head> <body> <canvas id="clock" width="100" height="100"></canvas> <script type="text/javascript"> window.onload = function() { function draw() { var ctx = document.getElementById('clock').getContext('2d'); ctx.strokeStyle = "rgba(0, 0, 0, 1)"; ctx.clearRect(0, 0, 100, 100); ctx.beginPath(); ctx.lineWidth = 1; ctx.arc(50, 50, 48, 0, Math.PI * 2, true); ctx.stroke(); var i; for(i=0; i < 360; i+=6) { ctx.lineWidth = ((i % 30)==0)?3:1; ctx.strokeStyle = ((i % 30)==0)?"rgb(200,0,0)":"rgb(0,0,0)"; var r = i * Math.PI / 180; ctx.beginPath(); ctx.moveTo(50+(45 * Math.sin(r)), 50+(45 * Math.cos(r))); ctx.lineTo(50+((((i % 30)==0)?37:40) * Math.sin(r)), 50+((((i % 30)==0)?37:40) * Math.cos(r))); ctx.closePath(); ctx.stroke(); } ctx.strokeStyle = "rgba(32, 32, 32, 0.6)"; // hour var d = new Date(); var h = (d.getHours() % 12) + (d.getMinutes() / 60); ctx.lineWidth = 4; ctx.beginPath(); ctx.moveTo(50+(25 * Math.sin(h * 30 * Math.PI / 180)), 50+(-25 * Math.cos(h * 30 * Math.PI / 180))); ctx.lineTo(50+(5 * Math.sin((h+6) * 30 * Math.PI / 180)), 50+(-5 * Math.cos((h+6) * 30 * Math.PI / 180))); ctx.closePath(); ctx.stroke(); //minute var m = d.getMinutes() + (d.getSeconds() / 60); ctx.strokeStyle = "rgba(32, 32, 32, 0.8)"; ctx.lineWidth = 2; ctx.beginPath(); ctx.moveTo(50+(38 * Math.sin(m * 6 * Math.PI / 180)), 50+(-38 * Math.cos(m * 6 * Math.PI / 180))); ctx.lineTo(50+(3 * Math.sin((m+30) * 6 * Math.PI / 180)), 50+(-3 * Math.cos((m+30) * 6 * Math.PI / 180))); ctx.closePath(); ctx.stroke(); //second var s = d.getSeconds() + (d.getMilliseconds() / 1000); ctx.strokeStyle = "rgba(0, 255, 0, 0.7)"; ctx.lineWidth = 1; ctx.beginPath(); ctx.moveTo(50+(45 * Math.sin(s * 6 * Math.PI / 180)), 50+(-45 * Math.cos(s * 6 * Math.PI / 180))); ctx.lineTo(50+(10 * Math.sin((s+30) * 6 * Math.PI / 180)), 50+(-10 * Math.cos((s+30) * 6 * Math.PI / 180))); ctx.closePath(); ctx.stroke(); } setInterval(draw, 100); } </script> </body> </html>

    Dari contoh di atas, pada baris ke-4, akan menginclude excanvas.js apabila dibuka dengan browser IE sehingga apapun browsernya akan ditampilkan dengan benar.

    Setelah halaman tersebut dibuka akan tampil jam analog sebagai berikut.

    image

    Dengan menggunakan CANVAS tidak lagi membutuhkan plug-ins seperti Adobe SVG, Flash atau Microsoft Silverlight untuk menggambar vektor sederhana. Hal ini sangat berguna bagi developer yang ingin membangun aplikasi platform-independent sehingga dapat dijalankan baik di Windows, Mac maupun Linux platform tanpa memerlukan plug-ins tambahan.

    Tidak seperti pada tulisan Penggunaan CANVAS tidak memakan banyak resource CPU dan ini merupakan best-practice untuk menggambar Vector Graphics pada HTML.

    Share this post: | | | |
    Posted Apr 20 2009, 03:02 PM by cahnom with 3 comment(s)
    Filed under:
  • BlogEngine.NET 1.5 was released a few days ago

    BlogEngine.NET was released a few days ago as announced by Mads in his blog. In this release, blogengine.net now support some IIS7 features. New features in this release are:

    • Nested comments
    • Superb Windows Live Writer integration (including tags)
    • Latest TinyMCE text editor
    • Mono 2.4 support that just works
    • Doesn't screw with jQuery and Prototype anymore
    • Better database support out of the box
    • Higher performance
    • ...and of course a lot of general improvements, tweaks and bug fixes

    This release is claimed more stable than older.

    Al Nyveldt also posted installation screen cast in his blog.

    You can learn by watching this video to install BlogEngine.NET with XML or database data.

     

    This is release is probably be the last release supporting IIS6 and .NET 2.0. In the next release, BlogEngine will be only support II7 and upcoming IIS7.5 to give extra possibilities like extension-less URL even on hosted environment.

    Share this post: | | | |
    Posted Apr 18 2009, 07:01 AM by cahnom with no comments
    Filed under:
  • Membuat Javascript Chart Tabulasi Pemilu 2009

    Kemaren malam saya buat chart tabulasi pemilu 2009 dengan javascript murni. Datasource diambil dari service yang dibuat oleh Pak Tahir. Halaman chart dapat dilihat di http://tnp.masykur.web.id/. Pertanyaannya koq bisa javascript untuk bikin chart? Dengan HTML5 kita bisa menggambar vektor dengan javascript. HTML5 memiliki fitur baru yaitu Canvas yang dapat digunakan untuk membuat gambar vektor 2 dimensi. Dengan dukungan gambar ventor ini, kita bisa menggambar apapun di halaman HTML.

    image

    HTML5 telah didukung oleh sebagian besar browser modern seperti Firefox, Opera, Safari dan Google Chrome. Apakah IE juga telah mendukung HTML5? IE belum sepenuhnya mendukung HTML5. Dengan tidak adanya dukungan HTML5 pada IE, kita harus cari alternatif lain untuk menggambar pada IE. Caranya adalah dengan menggunakan Vector Markup Language yang didukung oleh IE. Untuk membuat chart saya gunakan library yang dapat diambil di http://www.jscharts.com/.

    Source code applikasi tersebut dapat diunduh di sini (20KB).

    Semoga bermanfaat

    Share this post: | | | |
  • Menggambar Garis dan Lingkaran dengan JavaScript and jQuery

    Browser poluler saat ini tidak semuanya mendukung gambar vektor kecuali Firefox dan Safari dengan fitur Canvas yang ada. Dengan sedikit trik kita dapat menggambar garis dan lingkaran pada halaman HTML. Namun perlu diingat bahwa trik ini bukanlah cara yang baik bahkan bisa dibilang buruk. Saya hanya ingin menunjukkan saja kalo dengan cara ini kita bisa menggambar garis dan lingkaran.

    Pada dasarnya trik ini menggunakan beberapa elemen DIV berukuran 1x1 piksel yang dirender sedemikian rupa sehingga membentuk garis dan lingkaran. DIV harus diisi dengan elemen lain supaya terlihat rapi. Jika DIV tanpa anak, ukuran elemen tersebut tidak bisa diatur menjadi 1x1 piksel. Untuk mengatasi masalah ini diisikan elemen IMG dengan gambar transparan sebesar 1x1 piksel.

    Berikut ini adalah script yang digunakan untuk menggambar garis dan lingkaran dengan JavaScript dan jQuery.

    <html> <head> <title>Drawing</title> <script type="text/javascript" src="jquery-1.3.2.min.js"></script> <script type="text/javascript"> $(document).ready(function() { line(50,30, 100, 150); circle(110,110, 100); }); function line(x1, y1, x2, y2) { c = $(document.body); var dx = Math.abs(x2-x1); var dy = Math.abs(y2-y1); var d = Math.max(dx, dy); var i=0; for(i=0; i < d; i++) { var img = $(document.createElement('img')).attr('src', 'blank.gif'); var div = $(document.createElement('div')).width(1).height(1).css({'background-color': '#f00', position: 'absolute', left: Math.min(x1,x2)+(i*dx/d), top: Math.min(y1,y2)+(i*dy/d) }); div.append(img); c.append(div); } } function circle(x, y, r) { c = $(document.body); var l = 2 * Math.PI * r; var i=0; for(i=0; i < l * (1+((10-Math.log(r+1))/10)); i++) { var x2 = r * Math.sin(360 * i/l); var y2 = r * Math.cos(360 * i/l); var img = $(document.createElement('img')).attr('src', 'blank.gif'); var div = $(document.createElement('div')).width(1).height(1).css({'background-color': '#f00', position: 'absolute', left: x+x2, top: y+y2 }); div.append(img); c.append(div); } } </script> </head> <body> </div> </body> </html>

    Hasil tampilan dari script di atas seperti terlihat pada gambar di bawah

    image

    Semoga tulisan ini bisa dijadikan wawasan alternatif untuk menggambar dalam HTML. Saya tidak menyarankan trik ini untuk dipake dalam aplikasi sebenarnya. Gunakan Canvas (untuk Firefox dan Safari) atau embeded object (Silverlight/Flash) untuk menggambar vektor yang lebih baik.

    Share this post: | | | |