published about 1 year ago (28.09.2007 11:03)
thai spoken from here on
google maps goes local. very cool. reminds me of this.
published about 1 year ago (28.09.2007 11:03)
google maps goes local. very cool. reminds me of this.
published about 1 year ago (09.09.2007 16:06)
i’ve long been skeptical of javascript libraries. web 1.0’s myriads of “dhtml” / cross browser libraries didn’t improve the javascript programming experience much. at least there was no library i found so useful that i’d use it in all my projects. so all i had was a couple of snippets picked up here and there, like addEvent() / removeEvent() by the good ole Scott Andrew.
web 2.0 brought a lot of new buzzwords, and more frontend fun. and frontend fun requires: new javascript libraries! fortunately, these libraries seem to be different:
as an experiment, i wanted to refactor a web page i created in 2002, thomasgraggaber.com, to use a current javascript library. since i’ve already used prototype.js, the library is well-established, well-documented, robust (and bundled with ruby on rails), i decided to use it for the experiment.
so here are the stats for the “application” javascript, i.e. everything that’s specific for the site:
of course you add 3271 lines of code for prototype.js (in v. 1.5.1). what’s important however: you usually don’t have to maintain, debug and completely understand the internals of prototype.js when creating your application.
the major code changes are:
before:
var allDivs = document.getElementsByTagName('DIV'); for (i=0; i < allDivs.length; i++) { // ... else if(allDivs[i].className == 'sidebar') { addEvent(allDivs[i],"mouseup",dragManager); addEvent(allDivs[i],"mousedown",dragManager); } // ... }
after:
$$('.sidebar').each(function(div) { Event.observe(div, 'mouseup', dragManager); Event.observe(div, 'mousedown', dragManager); });
another example. nothing new here, but it takes even more advantage of the iterators:
// photosThumbs viewer var photosThumbsNodeList = contentDivs['photosThumbs'].getElementsByTagName('IMG'); for (i=0; i < photosThumbsNodeList.length; i++) { addEvent(photosThumbsNodeList.item(i),"click",photoManager); addEvent(photosThumbsNodeList.item(i),"mouseover",photoManager); addEvent(photosThumbsNodeList.item(i),"mouseout",photoManager); } var newsThumbsNodeList = contentDivs['news'].getElementsByTagName('IMG'); for (i=0; i < newsThumbsNodeList.length; i++) { addEvent(newsThumbsNodeList.item(i),"click",photoManager); addEvent(newsThumbsNodeList.item(i),"mouseover",photoManager); addEvent(newsThumbsNodeList.item(i),"mouseout",photoManager); } var portraitThumbsNodeList = contentDivs['portrait'].getElementsByTagName('IMG'); for (i=0; i < portraitThumbsNodeList.length; i++) { addEvent(portraitThumbsNodeList.item(i),"click",photoManager); addEvent(portraitThumbsNodeList.item(i),"mouseover",photoManager); addEvent(portraitThumbsNodeList.item(i),"mouseout",photoManager); }
becomes
// photosThumbs viewer $w('photosThumbs news portrait').each(function(divName) { $$("div#" + divName + " img").each(function(img) { $w('click mouseover mouseout').each(function(eventName) { Event.observe(img, eventName, photoManager); }); }); });
before:
// add event handlers var naviDivs = document.getElementById('border').getElementsByTagName('DIV'); for (i=0; i < naviDivs.length; i++) { addEvent(naviDivs.item(i),"click",ggNaviManager); addEvent(naviDivs.item(i),"dblclick",ggNaviManager); addEvent(naviDivs.item(i),"mouseover",ggNaviManager); addEvent(naviDivs.item(i),"mouseout",ggNaviManager); addEvent(naviDivs.item(i),"mousedown",ggNaviManager); addEvent(naviDivs.item(i),"mouseup",ggNaviManager); }
after
// add event handlers $$('div#border div').each(function(naviDiv) { $w('click dblclick mouseover mouseout mousedown mouseup').each(function(eventName) { Event.observe(naviDiv, eventName, ggNaviManager); }); });
e = (e) ? e : ((window.event) ? window.event : ''); eTarget = e.srcElement ? e.srcElement : e.target; while(eTarget.nodeName != 'DIV') { eTarget = eTarget.parentNode; }
becomes
eTarget = Event.element(e);
nice.
scrolledDiv = first_child(node_after(eTarget.parentNode.parentNode));
becomes:
scrolledDiv = eTarget.up('.box').down('.content')
before:
function displayNavi() { document.getElementById('sponsorFlash').style.display = 'none'; document.getElementById('border').style.display = 'block'; }
after:
function displayNavi() { $('sponsorFlash').hide(); $('border').show(); }
prototype.js rocks, because it’s developed by smart people, and because javascript itself rocks!