Overkill

Op Man in Blue staat een hele mooie bookmarklet die een proper rekenmachientje tevoorschijn tovert. Compleet met dynamische text resizing en een sexy fade-out als je het ding sluit, klein en handig en mooi.

Een paar problemen: werkt enkel in Firefox (niet in IE, niet in Opera, niet in Safari), heeft een beperking op het aantal karakters dat je kan gebruiken, en staat niet alle mogelijke bewerkingen toe. En je moet er met de muis naar de bookmarks bar voor gaan, en klikken. Je zou kunnen verder optimaliseren, dat het in minder karakters past, en je zou er kunnen op blijven zoeken tot het nog beter werkt, maar je zou ook kunnen:

  • mijn favoriete methode: MSN Search gebruiken. Bij mij is dat ctrl-alt-m, berekening ingeven, shift-enter. Heeft het voordeel dat je ook complexere dingen kan ingeven dan gewoon plus en min: “20/sin e” lukt zonder problemen (48.687709), of “5x^3-3x^2=5” (x=1.245074)
  • Google gebruiken. In mijn Firefox is dat ctrl-T (nieuwe tab), ctrl-K (google search box), berekening ingeven, enter, hey presto. Heeft het voordeel dat je ook dingen als “5 meter per second in furlongs per fortnight” kunt opzoeken (30 064.4238).
  • Gewoon de ingebouwde rekenmachine gebruiken: windows-R, “calc”, enter, berekening. Je kunt er ook een andere sneltoets aan verbinden natuurlijk, of als je één van die newfangled keyboards hebt, zit er wellicht wel een rekenmachine-toets op.
  • Als het écht moet met een bookmarklet, waarom niet gewoon deze? Ziet er minder goed uit, maar werkt wel cross-browser en laat je alle mogelijke javascript-functies gebruiken.

De code van die laatste oplossing, die (behalve niet zo mooi) veel beter werkt:

javascript:alert(eval(prompt('berekening:')))

Dit is de code van de “mooie versie (met spaties voor leesbaarheid toegevoegd, dus zo zal het niet werken):

void(JSC()); function JSC() {var d=document; var b=d.getElementsByTagName('body')[0]; var dv=d.createElement('div'); dv2=d.createElement('div'); var inp=d.createElement('input'); var an=d.createElement('a'); dvs=dv.style; dvs.position='absolute'; dvs.top='50%'; dvs.left='50%'; dvs.width='300px'; dvs.height='60px'; dvs.margin='-50px 0 0 -170px'; dvs.border='3px double #999'; dvs.padding='20px'; dvs.opacity='0.95'; dvs.backgroundColor='#CCC'; dvs.fontSize='60px'; dvs.lineHeight='60px'; dvs.textAlign='right'; b.appendChild(dv); dv2s=dv2.style; dv2s.position='absolute'; dv2s.top='50%'; dv2s.left='50%'; dv2s.height='20px'; dv2s.margin='-70px 0 0 -170px'; dv2s.padding='0 10px'; dv2s.backgroundColor='#999'; dv2s.fontSize='10px'; dv2s.lineHeight='20px'; an.style.color='#FFF'; an.appendChild(d.createTextNode('JSCalc')); dv2.appendChild(an); b.appendChild(dv2); an.setAttribute('href','http://www.themaninblue.com/experiment/JSCalc/'); inp.type='text'; is=inp.style; is.position='absolute'; is.top='50%'; is.left='50%'; is.width='300px'; is.margin='-30px 0 0 -150px'; is.border='1px solid #CCC'; is.backgroundColor='#CCC'; is.font='60px Arial,Helvetica,sans-serif'; is.color='#FFF'; is.textAlign='right'; dv.appendChild(inp); va(inp,60); inp.focus(); inp.onkeypress=function(e) {var t=this; var a=false; var ak=[8,13,32,37,40,41,42,43,45,46,47,48,49,50,51,52,53,54,55,56,57,120,190,191]; var ck=[8,13,32,37,40,41,42,43,45,47,120,190,191]; if(!e) {e=event; } for(var i=0; i9) {c=c.substring(0,14); } va(t,30); } t.value=c; t.c=true; } } else if(e.keyCode!=8&&e.keyCode!=13) {if(t.value.length==8) {va(t,30)} else if(t.value.length>15) {return false; } } else if(t.value.length==9) {va(t,60)} } else {return false; } return true; } ; inp.onblur=function(e) {op(this.parentNode); } } ; function op(t) {var o=parseFloat(t.style.opacity); if(o<0.08) {t.parentnode.removechild(t.nextsibling); t.parentnode.removechild(t); } else {o -="" 0.07; t.style.opacity="o; t.nextSibling.style.opacity=o; setTimeout(function() {op(t); } ,50); } return" true; } ; function va(t,f) {t.parentnode.style.top="document.documentElement.scrollTop+window.innerHeight/2+'px'; t.style.fontSize=f+'px'; t.style.marginTop=-parseInt(t.clientHeight/2)+'px'; return" true; } ;

De verleiding om het wiel nutteloos opnieuw uit te vinden: been there, done that 🙂