Lion's Fart RSS Feed
home ‹‹

Kako napraviti bookmarklet

Utorak, 8. Travnja 2008.
Links2 Bookmarklet (ili favelet) se od normalnog bookmarka (ili favorita) razlikuje po tome što to nije link na neku stranicu nego Javascripta koja kad se na nju klikne nešto radi sa stranicom.

Za detaljno objašnjenje i primjere jednostavnih bookmarka pogledajte ovaj post u kojem sam početo piliti o tim stvarima.

Plus ovdje se nalazi opis nekih naprednih bookmarka.

U ovom postu objasnit ću kako se radi bookmarklet na konkretnom primjeru. Potrebno je osnovno poznavanje HTMLa i Javascripta.

• • • • •

PROBLEM

Kad unosiš lozinku na web stranicu ona se, zbog sigurnosti, prikazuje sa zvjezdicama umjesto sa normalnim znakovima. Ako si se već prije prijavio negdje stranica ti može unaprijed popuniti lozinku.

Problem je kad tu lozinku zaboraviš, a nakon nekog vremena ti zatreba. Tada je rješenje gledanje HTML koda stranice (View Source) da dođeš do lozinke.

Ideja je napraviti bookmarklet koji će na samoj formi umjesto zvjezdica ispisati lozinku slovima, da je možeš jednostavno prepisati ili napraviti copy&paste.

Rješenje bi bilo pretvoriti PASSWORD polje (INPUT TYPE="PASSWORD") u INPUT polje (INPUT TYPE="TEXT") koji će lozinku prikazati konkretnim znakovima.

Usput želimo i pokriti slučajeve kada (napredni) web preglednik nakon učitavanja stranice sam popuni polje za lozinku.

POSTAVLJANJE OKRUŽENJA

Bookmarklet se radi kao i svaki drugi Javascript: direktno na stranici. A kada smo zadovoljni rezultatom jednostavno ga prebacimo u bookmarklet (link tipa A HREF="javascript:...").

Zato ćemo si napraviti praznu stranicu i na nju postaviti tri forme - želimo da naš kod pronađe sve passworde u svim formama na stranici.

<html
<head>
<title>Bookmarklet</title>
</head>
<body>
<form name="form1">
<input type="text" name="text1" value="text1" />
<input type="password" name="password1" value="password1" />
</form>
<form name="form2">
<input type="text" name="text2" value="text2" />
<input type="password" name="password2" value="password2" />
</form>
<form name="form2">
<input type="text" name="text2" value="text3" />
<input type="password" name="password2" value="password3" />
</form>
</body>
</html>

Kako se bookmarklet okida na naš klik, napravit ćemo nešto takvo na stranci, neki ONCLICK događaj kojim ćemo testirati bookmarklet u toku razvoja.

<a href="#" onclick="javascript:reveal()">Revel</a>

I u HEAD ćemo staviti Javascript koji će biti radna verzija bookmarkleta:

<script type="text/javascript">
function reveal()
{
// ovdje ide kod
}
</script>

IDEJA

Password polje ne može prikazivati ništa osim zvjezdica ili točica ili koji je već znak kojim operacijski sustav ili browser maskiraju lozinku.

Idealna bi situacija bila da pretvorimo tip polja iz PASSWORD u TEXT:

if(element.type == 'PASSWORD') element.type = 'TEXT'

Ali to ne ide iz više razloga.

Zato ćemo napraviti nešto drugo, a to je kloniranje PASSWORD elementa u novi element, postavljanje type atributa na 'TEXT' i na kraju zamjena PASSWORDA TEXTom.

Kod bi išao ovako:

var e = password_polje.cloneNode(true)
e.setAttribute('type', 'text')
password_polje.parentNode.replaceChild(e, password_polje)

INTERNET EXPLORER

Znali ste, jelda? Ne možeš napisati jednu normalnu skriptu a da ne načneš Internet Explorer bube. Jebiga. Ali moramo i njega pokriti.

Na IE6 (i IE7 izgleda) cloneNode() je pokidan i ne radi.

Zato ćemo KREIRATI element INPUT i na njega iskopirati čim više atributa (PROPERTIES) PASSWORD polja.

var e = document.createElement('input')
e.setAttribute('type', 'text')
e.setAttribute('name', password_polje.getAttribute('name')
e.setAttribute('value', password_polje.getAttribute('value')
// itd po atributima
password_polje.parentNode.replaceChild(e, password_polje)

I radi! Ovaj kod radi u velikoj četvorki (IE, Firefox, Opera, Safari)

PETLJA

Kako nam je cilj zamijeniti SVA polja koja su PASSWORD tipa moramo napraviti pelju koja će izvući sve INPUT elemente i one kojima je TYPE="PASSWORD", iskopirati atribute u novo INPUT polje i zamijeniti ga s tim novim poljem.

var a = document.getElementsByTagName('input')
for(i = 0; i < a.length; i++)
{
if (a[i].getAttribute('type') == 'password')
{
// zamjena
}
}

ATRIBUTI

Atribute (osobine) treba iskopirati malo ljepše, jer ako napravimo niz tipa:

e.setAttribute('name', password_polje.getAttribute('name')
e.setAttribute('value', password_polje.getAttribute('value')
// itd po atributima

Netko će nas prijaviti da programiramo šampionski i onda imamo velike šanse da kad danas sutra idemo ulicom neki klinac na nas pokaže prstom i kaže:
"Gle mama ovog luzera, on programira šampionski!"

Zato ćemo si fino atribute nabiti u array i kopirati ih moderno:

var p = new Array('id', 'name', 'value', 'class', 'style', 'maxlength', 'size');
for (j = 0; j < p.length; j++) e.setAttribute(p[j], password_polje.getAttribute(p[j]));

SVE ZAJEDNO

Kad sve ovo spojimo, funkcija koja sve ovo radi izgleda ovako:

function reveal()
{
var e, i, j;
var p = new Array('id', 'name', 'value', 'class', 'style', 'maxlength', 'size');
var a = document.getElementsByTagName('input');
for (i = 0; i < a.length; i++)
{
if (a[i].getAttribute('type') == 'password')
{
e = document.createElement('input');
e.setAttribute('type', 'text');
for (j = 0; j < p.length; j++) e.setAttribute(p[j], a[i].getAttribute(p[j]));
a[i].parentNode.replaceChild(e, a[i]);
}
}
}

I sad ovo testiramo u svim browserima. Radi okej u sva četiri, ali još nismo gotovi.

PRETVARANJE U BOOKMARKLET

Primjećujete točka-zareze na kraju liniju? E oni su potrebni jer ćemo sad sve to prebaciti u jednu liniju.

Obrišemo "function reveal()" i prvu otvorenu i zadnju zatvorenu vitičastu liniju i maknemo sva NEWLINE mjesta tako da sve dobijemo u jednoj liniji.

Nakon toga link kojim smo testirali izmijenimo:

HREF="#" ONCLICK="javascipt:reveal()"

postaje

HREF="javascript:..."

pri čemu je "..." naša jednolinijska kobasica.

ZAVRŠNICA

Link uvijek nekud vodi, a mi imamo javascript: link koji ne smije voditi nikud.

Da bismo spriječili browser da ode tamo nekamo, moramo ga zaokružiti u funkciju. Jedan od načina da se to napravi je zarobljavanje u tijelo funkcije. To se radi ovako:

HREF="javascript:function(){...}()

pri čemu je "..." ista ona kobasica od Javascripta

Link koji smo ovako dobili na stranici odvučemo gore u toolbar, mjesto gdje imamo ove brze linkove koji su nam uvijek pri ruci.

Nakon jednostavne provjere u ona četiri browsera vidimo da sve radi kako spada.

Odlazimo do frižidera i uzimamo jedno hladno pivo. Nakon prvog gutljaja radosno uskliknemo: "Ja sam jebeni Javascript majstor".

• • • • •

Bookmarklet je ovdje (drag&dropajte ga gore u linkbar browsera):

Password Revealer.

Testna stranica:

password-revealer.zip (cca kilobajt).

Pozdrav Javascriptašima i ostalima koji se loše osjećaju.

Dodaj komentar

ime *

e-mail

www

Dozvoljeni tagovi su A, B, I, U i S. e-mail adresa se nigdje neće prikazati.

Control panel

Linkovi RSS feedDnevni linkovi

  1. New schedule for JDK 7
    JDK 7 delayed to mid 2012!
  2. What will Google Instant do to 'SEO' - and to its own AdWords system?
    Google Instant, AdWords i SEO.
  3. Where (On the Internet) To Watch Every Comedy This Season
    Gdje na netu gledati komedije?
  4. Trapped in a Chilean mine
    Zarobljeni rudari u Čileu. (The Big Picture, 42)
  5. Dogs on Logs
    Psi na panjevima.
  6. Good dancing may be sign of male health, scientists say
    Ako dobro plešeš - atraktivan si ženama. (BBC News)
  7. Ruby for PHP Developers
    Uvod u Ruby za PHPaše.
  8. Worlds Wackiest Wedding Photos
    Živjeli mladenci! (WackyOwl)
  9. Climate: New study slashes estimate of icecap loss
    "Ice caps are melting at approximately half the speed originally predicted."
  10. 10 Most Beautiful Snakes on Earth
    Najljepše zmije.
  11. Consoles VS PC
    Videoigre: konzole vs PC. (infografika)
  12. The 50 Best Mario Video Games of All Time
    Super Mario igre. (video clips)
  13. Live at Google's search event: Google Instant
    Google Instant - liveblog @ CNET.
  14. Detecting and Correcting Dead Shortcuts on Windows
    Skripte u Rubyju.
  15. Tractor beams come to life
    Ohoho.
  16. How 6 Memorable Tech Companies Got Their Names
    Go Daddy, Apple, Google, Fark, Asus, Yahoo.
  17. 8 of the Most Frustrating Relationships in Literature
    It's Complicated.
  18. Top 10 Zombie Shooting Games of all Time
    Naj videoigre sa zombijima.
  19. 20 Essential Facebook Apps For Creating Successful Business Fanpage
    Facebook aplikacije.
  20. 15 Creative and Unusual Sticky Notes
    Dizajn papirnatih podsjetnika.