<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Interfeţe Web</title>
	
	<link>http://www.interfete-web.ro</link>
	<description />
	<lastBuildDate>Tue, 16 Jun 2009 21:23:09 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/ro/</creativeCommons:license>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com" /><atom:link rel="hub" href="http://superfeedr.com/hubbub" /><link xmlns="http://www.w3.org/2005/Atom" rel="http://api.friendfeed.com/2008/03#sup" type="application/json" href="http://friendfeed.com/api/public-sup.json#8856ce8ed5" />		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Interfete-Web" /><feedburner:info uri="interfete-web" /><geo:lat>44.4325</geo:lat><geo:long>26.103889</geo:long><image><link>http://www.interfete-web.ro/blog/index/</link><url>http://www.interfete-web.ro/i/200x200/themes/zeke/images/logo.png</url><title>Interfete Web</title></image><feedburner:emailServiceId>Interfete-Web</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Google nu mai dezvolta Google Notebook + 2 alternative la Google Notebook</title>
		<link>http://feedproxy.google.com/~r/Interfete-Web/~3/WH3mDmz4xNU/google-nu-mai-dezvolta-google-notebook-2-alternative-la-google-notebook</link>
		<comments>http://www.interfete-web.ro/37/google-nu-mai-dezvolta-google-notebook-2-alternative-la-google-notebook#comments</comments>
		<pubDate>Tue, 20 Jan 2009 01:35:00 +0000</pubDate>
		<dc:creator>Cristi</dc:creator>
				<category><![CDATA[Ştiri]]></category>
		<category><![CDATA[evernote]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google notebook]]></category>
		<category><![CDATA[jaiku]]></category>
		<category><![CDATA[zoho]]></category>

		<guid isPermaLink="false">http://blog.interfete-web.ro/?p=37</guid>
		<description><![CDATA[In aceeasi zi in care a fost lansat jQuery 1.3, Google a facut 4 anunturi importante: au inchis Google Catalog Search, au oprit uploadurile pe Google Video (singurul avantaj fata de YouTube era ca nu exista o limita a duratei clipurilor), au inchis Dodgeball si vor inchide Google Mashup Editor, au oprit dezvoltarea Jaiku (un [...]]]></description>
			<content:encoded><![CDATA[<p>In aceeasi zi in care <a href="http://www.interfete-web.ro/blog/4835496069123182504-jquery-implineste-3-ani-si-lanseaza-versiunea-1-3/" title="jQuery implineste 3 ani si lanseaza versiunea 1.3">a fost lansat jQuery 1.3</a>, Google a facut 4 anunturi importante: <a href="http://booksearch.blogspot.com/2009/01/farewell-google-catalog-search.html" target="_blank">au inchis Google Catalog Search</a>, <a href="http://googlevideo.blogspot.com/2009/01/turning-down-uploads-at-google-video.html" target="_blank">au oprit uploadurile pe Google Video</a> (singurul avantaj fata de <a href="http://www.youtube.com/" target="_blank">YouTube</a> era ca nu exista o limita a duratei clipurilor), <a href="http://google-code-updates.blogspot.com/2009/01/changes-for-jaiku-and-farewell-to.html" target="_blank">au inchis Dodgeball si vor inchide Google Mashup Editor, au oprit dezvoltarea Jaiku</a> (un site de microblogging a la <a href="http://twitter.com/" target="_blank">Twitter</a>, care va deveni open-source) si <a href="http://googlenotebookblog.blogspot.com/2009/01/stopping-development-on-google-notebook.html" target="_blank">au oprit dezvoltarea Google Notebook</a>.</p>
<p><span id="more-37"></span></p>
<div class="fullpost">
<p>Asa cum se poate deduce din titlul acestui articol, pe mine cel mai mult m-a afectat oprirea dezvoltarii <a href="http://www.google.com/notebook/" target="_blank">Google Notebook</a>. Cat despre celelalte, <a href="http://catalogs.google.com/" target="_blank">Catalog Search</a> (link-ul duce acum catre prima pagina a Google) se pare ca a scazut foarte mult in popularitate in favoarea <a href="http://books.google.com/" target="_blank">Google Book Search</a>, <a href="http://video.google.com/" target="_blank">Google Video</a> era oricum redundant de cand au achizitionat <a href="http://www.youtube.com/" target="_blank">YouTube</a>, <a href="http://www.dodgeball.com/" target="_blank">Dodgeball</a> era o retea sociala mobila disponibila doar in SUA, <a href="http://editor.googlemashups.com/" target="_blank">Google Mashup Editor</a> pierde in favoarea <a href="http://code.google.com/appengine/" target="_blank">Google App Engine</a> &#8211; desi probabil ca era mai simplu de dezvoltat o aplicatie in XML decat in Python -, iar <a href="http://www.jaiku.com/" target="_blank">Jaiku</a> nu a avut parte de nicio noutate de cand a fost cumparat de Google, de atunci ramanand in private beta. Notebook este in top 5 al celor mai folosite aplicatii de catre mine, alaturi de <a href="http://mail.google.com/mail" target="_blank">GMail</a>, <a href="https://www.google.com/reader/view/" target="_blank">Google Reader</a>, <a href="http://www.rememberthemilk.com/" target="_blank">Remember the Milk</a> si <a href="http://friendfeed.com/" target="_blank">Friendfeed</a>.</p>
<p>Cu toate ca Notebook nu va fi inchis, inginerii de la Google nu vor mai dezvolta aplicatia, nici <a href="http://www.google.com/notebook/download" target="_blank">extensia pentru Firefox</a>, si probabil ca nu vor mai fi acceptati utilizatori noi. Probabil ca cel mai des Notebook <span style="text-decoration: line-through;">era</span> <em>este</em> folosit de utilizatori pe post de ToDo list, insa nu este chiar atat de simplu ca aplicatia Notepad din Windows sau editoarele de text Linux &#8211; are parte de formatare a textului &#8211; insa nu atat de avansata ca la <a href="http://docs.google.com/" target="_blank">Google Docs</a> -, fiecare notebook poate fi impartit in sectiuni si fiecare nota poate sa aiba atasate etichete si comentarii. Foarte utile sunt <a href="http://www.google.com/notebook/download" target="_blank">extensia pentru Firefox</a> si <a href="http://www.google.com/googlenotebook/bookmarklet.html" target="_blank">bookmarklet-ul</a> care permit crearea de note pe baza continutului dintr-o pagina web, impreuna cu o referinta la pagina respectiva. Insa add-on-ul nu va mai fi dezvoltat deci probabil ca intr-o versiune viitoare de Firefox nu va mai fi compatibil (bookmarklet-ul insa va putea fi folosit pentru multa vreme din moment ce este doar JavaScript).</p>
<p>Alternativa oficiala oferita de Google este Google Docs (si daca alegeti sa folositi Docs in loc de Notebook, este foarte simplu pentru ca notele din Notebook pot fi exportate automat ca document in Docs), insa nu se apropie nici pe departe de simplitatea Google Notebook, asa ca eu am doua alternative pe care le-am incercat.</p>
<p>Prima alternativa este oferita de <a href="http://www.zoho.com/" target="_blank">Zoho</a>, insa este vorba mai degraba de 3 aplicatii. Este vorba de Zoho Tasks, Zoho Notes (disponibile in <a href="http://personal.zoho.com/" target="_blank">Zoho Personal</a>) si <a href="http://notebook.zoho.com/" target="_blank">Zoho Notebook</a>. Mai exact, Zoho Tasks &#8211; asa cum ii spune numele &#8211; se ocupa de task management (insa pentru aceasta cred ca o alternativa mult mai buna este <a href="http://www.rememberthemilk.com/" target="_blank">Remember the Milk</a>), Zoho Notes permite crearea de note, insa acestea nu pot contine decat text simplu, si pot fi adaugate in categorii, dar nu au etichete. Cat despre Zoho Notebook, este mai degraba asemanator cu <a href="http://office.microsoft.com/en-us/onenote/default.aspx" target="_blank">Microsoft OneNote</a> decat cu ce ofera Google Notebook. Asadar, daca alegeti Zoho, o sa aveti 3 aplicatii diferite pentru a va descurca fara Google Notebook, toate 3 la un loc oferind cu mult mai mult decat Google Notebook, insa fiecare in parte neputand compensa lipsa sa. (Intamplator sau nu, la exact o zi dupa ce Google anunta ca Notebook nu va mai fi dezvoltat, <a href="http://blogs.zoho.com/notebook/multiple-enhancements-in-zoho-notebook/" target="_blank">Zoho a anuntat cateva noutati legate de Zoho Notebook</a>). Sincer sa fiu, aceasta nu este o alternativa buna decat pentru cei care folosesc <strong>intreaga</strong> suita Zoho, si nu doar pentru a gasi un inlocuitor pentru Notebook.</p>
<p>Ceea ce ne duce la cea de-a doua alternativa, cea pe care, sunt sigur, foarte multi utilizatori Notebook care chiar cauta o alternativa o vor alege: <a href="https://www.evernote.com/" target="_blank">Evernote</a>. Evernote chiar are toate trasaturile Google Notebook, si mult mai mult. Trasaturi comune cu Google Notebook ar fi formatarea simpla de text, Notebook-uri multiple, etichete pentru note, extensie pentru Firefox si bookmarklet. In plus, in orice nota pot fi introduse fisiere, si exista <a href="http://www.evernote.com/about/download/" target="_blank">aplicatii native</a> pentru Windows, Mac OS X, iPhone si Windows Mobile, care sincronizeaza notele cu cele de pe web. Are si un API, insa nu am intalnit pana acum nicio aplicatie care sa-l foloseasca. Poate partea proasta este ca exista reclame pentru conturile gratuite (dar, hei, serviciul <em>este</em> gratuit, si cel mai probabil motivul pentru care Google Notebook nu va mai fi dezvoltat este ca nu s-a gasit o modalitate de a monetiza serviciul), exista o limita lunara de 40MB pentru fisierele uploadate (dar in Notebook nici macar nu existau uploaduri) si ca dintre fisiere nu sunt sincronizate intre diversele aplicatii native decat cele de tip audio, text si PDF &#8211; toate acestea limitari si neajunsuri putand fi eliminate prin cumpararea unui <a href="https://www.evernote.com/about/premium/" target="_blank">cont PRO</a>.</p>
<p>Evernote a fost si alegerea mea, nu ca as fi fost <strong>obligat</strong> sa renunt la Google Notebook, dar acum ca nu va mai fi dezvoltat inseamna ca este posibil sa fie inchis in orice clipa. Dar voi, daca ar fi sa alegeti o alta solutie pentru Google Notebook, ce ati alege? Sau daca nu folositi deloc Evernote, ce folositi? Comentariile sunt binevenite.</p>
<p>Alte reactii la aceste stiri:</p>
<ul>
<li><a href="http://searchengineland.com/google-ends-google-video-uploads-shutters-notebook-catalog-search-dodgeball-jaiku-16166" target="_blank">Google Ends Google Video Uploads, Shutters Notebook, Catalog Search, Dodgeball &amp; Jaiku</a></li>
<li><a rel="bookmark" href="http://www.techcrunch.com/2009/01/14/google-axes-dodgeball-jaiku-video-and-more/" target="_blank">Google Axes Dodgeball, Jaiku, Video and More</a></li>
<li><a href="http://www.centernetworks.com/jaiku-dodgeball-google-video-closed" target="_blank">Google Video Uploads, Jaiku, Dodgeball All Closed; Is GrandCentral Next?</a></li>
<li><a href="http://googlesystem.blogspot.com/2009/01/google-closes-many-services.html" target="_blank">Google Closes Many Services</a></li>
<li><a href="http://www.readwriteweb.com/archives/google_giveth_and_it_taketh_away.php" target="_blank">Google Giveth, and Taketh Away: Google Video, Notebook, Catalog Search, Jaiku, and Dodgeball to Shut Down</a></li>
<li><a href="http://thenextweb.com/2009/01/15/goodbye-google-notebook-dodgeball-and-google-video-uploads-big-changes-for-jaiku-its-going-open-source/" target="_blank">Goodbye Google Notebook, Dodgeball and Google Video Uploads. Big Changes for Jaiku, It’s Going Open Source.</a></li>
</ul>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=WH3mDmz4xNU:B9MpebkG9YA:AMTxokU3cl4"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=WH3mDmz4xNU:B9MpebkG9YA:AMTxokU3cl4" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=WH3mDmz4xNU:B9MpebkG9YA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=WH3mDmz4xNU:B9MpebkG9YA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=WH3mDmz4xNU:B9MpebkG9YA:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=WH3mDmz4xNU:B9MpebkG9YA:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=WH3mDmz4xNU:B9MpebkG9YA:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=WH3mDmz4xNU:B9MpebkG9YA:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=WH3mDmz4xNU:B9MpebkG9YA:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=WH3mDmz4xNU:B9MpebkG9YA:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=WH3mDmz4xNU:B9MpebkG9YA:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Interfete-Web/~4/WH3mDmz4xNU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.interfete-web.ro/37/google-nu-mai-dezvolta-google-notebook-2-alternative-la-google-notebook/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/ro/</creativeCommons:license>
	<feedburner:origLink>http://www.interfete-web.ro/37/google-nu-mai-dezvolta-google-notebook-2-alternative-la-google-notebook</feedburner:origLink></item>
		<item>
		<title>jQuery implineste 3 ani si lanseaza versiunea 1.3</title>
		<link>http://feedproxy.google.com/~r/Interfete-Web/~3/Br3v4saq9r0/jquery-implineste-3-ani-si-lanseaza-versiunea-13</link>
		<comments>http://www.interfete-web.ro/36/jquery-implineste-3-ani-si-lanseaza-versiunea-13#comments</comments>
		<pubDate>Mon, 19 Jan 2009 00:47:00 +0000</pubDate>
		<dc:creator>Cristi</dc:creator>
				<category><![CDATA[Ştiri]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://blog.interfete-web.ro/?p=36</guid>
		<description><![CDATA[Stirea este un pic mai veche, insa merita mentionata: pe 14 ianuarie s-au implinit 3 ani de cand John Resig a lansat prima versiune de jQuery. Cu aceasta ocazie, a fost lansata versiunea 1.3 a celebrei biblioteci JavaScript.


Personal, nu am avut timp sa incerc practic ce aduce nou aceasta versiune, insa am aruncat o privire [...]]]></description>
			<content:encoded><![CDATA[<p>Stirea este un pic mai veche, insa merita mentionata: pe 14 ianuarie s-au implinit 3 ani de cand <a href="http://ejohn.org/" target="_blank">John Resig</a> a lansat prima versiune de <a href="http://jquery.com/" target="_blank">jQuery</a>. Cu aceasta ocazie, a fost lansata versiunea 1.3 a celebrei biblioteci JavaScript.</p>
<p><span id="more-36"></span></p>
<div class="fullpost">
<p>Personal, nu am avut timp sa incerc practic ce aduce nou aceasta versiune, insa am aruncat o privire pe <a href="http://docs.jquery.com/Release:jQuery_1.3" target="_blank">pagina in care este anuntata oficial noua versiune</a>, si pot spune ca mi s-au parut interesante castigurile de performanta datorate motorului de selectori <a href="http://sizzlejs.com/" target="_blank">Sizzle</a> (daca aruncati o privire pe graficele din articol o sa vedeti ca sunt cu adevarat semnificative in cazul Internet Explorer 6/7, pentru restul browserelor diferentele de performanta fiind destul de mici), si noile evenimente “live” (utile in special in cazul in care se creaza elemente DOM dupa ce s-a incarcat pagina, elemente la care e nevoie sa atasam ascultatori &#8211; chiar exista astfel de pagini, luati ca exemplu activitatea lui <a href="http://scobleizer.com/" target="_blank">Robert Scoble</a> si a <span style="text-decoration: line-through;">prietenilor sai</span> <em>contactelor sale</em> de pe <a href="http://friendfeed.com/" target="_blank">Friendfeed</a>, <a href="http://friendfeed.com/scobleizer/friends/realtime" target="_blank">vazuta in timp real</a>) realizate cu ajutorul delegarii de evenimente (ca o paranteza, si viitoarea versiune de MooTools <a href="http://www.clientcide.com/code-releases/event-delegation-take-2/" target="_blank">va avea parte de asa ceva</a>).</p>
<p>Evenimentul a fost primit cu mult entuziasm de blogosfera (o simpla cautare pe Google Blog Search intoarce mai mult de 15.000 de rezultate, si nu a trecut nici macar o saptamana intreaga de la lansare), asa ca daca vreti si alte pareri, articole pe care eu le-am gasit interesante:</p>
<ul>
<li><a href="http://ajaxian.com/archives/happy-birthday-jquery-v13-is-released" target="_blank">Happy Birthday jQuery! v1.3 is Released</a></li>
<li><a href="http://www.readwriteweb.com/archives/happy_3rd_birthday_jquery.php" target="_blank">Happy 3rd Birthday, jQuery</a></li>
<li><a href="http://blog.jquery.com/2009/01/14/jquery-13-and-the-jquery-foundation/" target="_blank">jQuery: » jQuery 1.3 and the jQuery Foundation</a></li>
</ul>
<p>Permalink: <a href="http://www.interfete-web.ro/blog/4835496069123182504-jquery-implineste-3-ani-si-lanseaza-versiunea-1-3/">jQuery implineste 3 ani si lanseaza versiunea 1.3</a></p>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=Br3v4saq9r0:r-umgGRnMTU:AMTxokU3cl4"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=Br3v4saq9r0:r-umgGRnMTU:AMTxokU3cl4" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=Br3v4saq9r0:r-umgGRnMTU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=Br3v4saq9r0:r-umgGRnMTU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=Br3v4saq9r0:r-umgGRnMTU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=Br3v4saq9r0:r-umgGRnMTU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=Br3v4saq9r0:r-umgGRnMTU:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=Br3v4saq9r0:r-umgGRnMTU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=Br3v4saq9r0:r-umgGRnMTU:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=Br3v4saq9r0:r-umgGRnMTU:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=Br3v4saq9r0:r-umgGRnMTU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Interfete-Web/~4/Br3v4saq9r0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.interfete-web.ro/36/jquery-implineste-3-ani-si-lanseaza-versiunea-13/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/ro/</creativeCommons:license>
	<feedburner:origLink>http://www.interfete-web.ro/36/jquery-implineste-3-ani-si-lanseaza-versiunea-13</feedburner:origLink></item>
		<item>
		<title>[Link] O definitie a "user experience"</title>
		<link>http://feedproxy.google.com/~r/Interfete-Web/~3/nVf4la0IdwE/link-o-definitie-a-user-experience</link>
		<comments>http://www.interfete-web.ro/35/link-o-definitie-a-user-experience#comments</comments>
		<pubDate>Wed, 14 Jan 2009 01:25:00 +0000</pubDate>
		<dc:creator>Cristi</dc:creator>
				<category><![CDATA[Legături]]></category>
		<category><![CDATA[links]]></category>
		<category><![CDATA[user experience]]></category>

		<guid isPermaLink="false">http://blog.interfete-web.ro/?p=35</guid>
		<description><![CDATA[A definition of &#8220;user experience&#8221; &#124; FatDUX &#124; blogging about user experiences
]]></description>
			<content:encoded><![CDATA[<p><a rel="nofollow" href="http://www.fatdux.com/blog/2009/01/10/a-definition-of-user-experience">A definition of &ldquo;user experience&rdquo; | FatDUX | blogging about user experiences</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=nVf4la0IdwE:zls5Dtk8jOM:AMTxokU3cl4"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=nVf4la0IdwE:zls5Dtk8jOM:AMTxokU3cl4" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=nVf4la0IdwE:zls5Dtk8jOM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=nVf4la0IdwE:zls5Dtk8jOM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=nVf4la0IdwE:zls5Dtk8jOM:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=nVf4la0IdwE:zls5Dtk8jOM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=nVf4la0IdwE:zls5Dtk8jOM:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=nVf4la0IdwE:zls5Dtk8jOM:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=nVf4la0IdwE:zls5Dtk8jOM:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=nVf4la0IdwE:zls5Dtk8jOM:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=nVf4la0IdwE:zls5Dtk8jOM:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Interfete-Web/~4/nVf4la0IdwE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.interfete-web.ro/35/link-o-definitie-a-user-experience/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/ro/</creativeCommons:license>
	<feedburner:origLink>http://www.interfete-web.ro/35/link-o-definitie-a-user-experience</feedburner:origLink></item>
		<item>
		<title>[Link] 10 conceptii gresite despre user experience design</title>
		<link>http://feedproxy.google.com/~r/Interfete-Web/~3/7YXCOja9SO8/link-10-conceptii-gresite-despre-user-experience-design</link>
		<comments>http://www.interfete-web.ro/34/link-10-conceptii-gresite-despre-user-experience-design#comments</comments>
		<pubDate>Mon, 12 Jan 2009 10:26:00 +0000</pubDate>
		<dc:creator>Cristi</dc:creator>
				<category><![CDATA[Legături]]></category>
		<category><![CDATA[interfete web]]></category>
		<category><![CDATA[links]]></category>
		<category><![CDATA[user experience]]></category>

		<guid isPermaLink="false">http://blog.interfete-web.ro/?p=34</guid>
		<description><![CDATA[Un articol interesant despre ce este si ce nu este UX:
10 Most Common Misconceptions About User Experience Design
]]></description>
			<content:encoded><![CDATA[<p>Un articol interesant despre ce este si ce nu este UX:</p>
<p><a href="http://mashable.com/2009/01/09/user-experience-design/" target="_blank">10 Most Common Misconceptions About User Experience Design</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=7YXCOja9SO8:Q3cjBWjLcFU:AMTxokU3cl4"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=7YXCOja9SO8:Q3cjBWjLcFU:AMTxokU3cl4" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=7YXCOja9SO8:Q3cjBWjLcFU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=7YXCOja9SO8:Q3cjBWjLcFU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=7YXCOja9SO8:Q3cjBWjLcFU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=7YXCOja9SO8:Q3cjBWjLcFU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=7YXCOja9SO8:Q3cjBWjLcFU:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=7YXCOja9SO8:Q3cjBWjLcFU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=7YXCOja9SO8:Q3cjBWjLcFU:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=7YXCOja9SO8:Q3cjBWjLcFU:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=7YXCOja9SO8:Q3cjBWjLcFU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Interfete-Web/~4/7YXCOja9SO8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.interfete-web.ro/34/link-10-conceptii-gresite-despre-user-experience-design/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/ro/</creativeCommons:license>
	<feedburner:origLink>http://www.interfete-web.ro/34/link-10-conceptii-gresite-despre-user-experience-design</feedburner:origLink></item>
		<item>
		<title>[Link] Greseli de utilizabilitate frecvente si enervante</title>
		<link>http://feedproxy.google.com/~r/Interfete-Web/~3/vEHlfU3vytU/link-greseli-de-utilizabilitate-frecvente-si-enervante</link>
		<comments>http://www.interfete-web.ro/33/link-greseli-de-utilizabilitate-frecvente-si-enervante#comments</comments>
		<pubDate>Sun, 11 Jan 2009 09:24:00 +0000</pubDate>
		<dc:creator>Cristi</dc:creator>
				<category><![CDATA[Legături]]></category>
		<category><![CDATA[interfete web]]></category>
		<category><![CDATA[links]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[utilizabilitate]]></category>

		<guid isPermaLink="false">http://blog.interfete-web.ro/?p=33</guid>
		<description><![CDATA[Un articol interesant despre greseli de utilizabilitate prezente in multe interfete web:
Web Usability Blunders That Still Piss Me Off

Permalink: Greseli de utilizabilitate frecvente si enervante
]]></description>
			<content:encoded><![CDATA[<p>Un articol interesant despre greseli de utilizabilitate prezente in <b>multe</b> <a href="http://www.interfete-web.ro/" rel="me">interfete web</a>:<br />
<a href="http://www.snipe.net/2009/01/usability-blunders-that-still-piss-me-off/">Web Usability Blunders That Still Piss Me Off</a></p>
<p><span id="more-33"></span></p>
<p>Permalink: <a href="http://www.interfete-web.ro/blog/3894272199016615845-greseli-de-utilizabilitate-frecvente-si-enervante/">Greseli de utilizabilitate frecvente si enervante</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=vEHlfU3vytU:GSujvhuZAjU:AMTxokU3cl4"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=vEHlfU3vytU:GSujvhuZAjU:AMTxokU3cl4" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=vEHlfU3vytU:GSujvhuZAjU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=vEHlfU3vytU:GSujvhuZAjU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=vEHlfU3vytU:GSujvhuZAjU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=vEHlfU3vytU:GSujvhuZAjU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=vEHlfU3vytU:GSujvhuZAjU:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=vEHlfU3vytU:GSujvhuZAjU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=vEHlfU3vytU:GSujvhuZAjU:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=vEHlfU3vytU:GSujvhuZAjU:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=vEHlfU3vytU:GSujvhuZAjU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Interfete-Web/~4/vEHlfU3vytU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.interfete-web.ro/33/link-greseli-de-utilizabilitate-frecvente-si-enervante/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/ro/</creativeCommons:license>
	<feedburner:origLink>http://www.interfete-web.ro/33/link-greseli-de-utilizabilitate-frecvente-si-enervante</feedburner:origLink></item>
		<item>
		<title>Sistem de rating-uri cu MooTools</title>
		<link>http://feedproxy.google.com/~r/Interfete-Web/~3/4wHWS2-ND-4/sistem-de-rating-uri-cu-mootools</link>
		<comments>http://www.interfete-web.ro/32/sistem-de-rating-uri-cu-mootools#comments</comments>
		<pubDate>Fri, 09 Jan 2009 08:17:00 +0000</pubDate>
		<dc:creator>Cristi</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[interfete web]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[W3C DOM]]></category>

		<guid isPermaLink="false">http://blog.interfete-web.ro/?p=32</guid>
		<description><![CDATA[Acum ca am vazut cateva detalii despre MooTools (mai exact, programarea orientata pe obiecte cu MooTools, putina programare functionala, manipularea DOM, lucrul cu evenimente si cereri AJAX), a venit timpul sa punem in practica toate aceste concepte. O sa incercam sa cream un sistem de rating-uri cu ajutorul MooTools, pornind de la un caz concret [...]]]></description>
			<content:encoded><![CDATA[<p>Acum ca am vazut cateva detalii despre MooTools (mai exact, <a title="Clase in MooTools" href="http://www.interfete-web.ro/blog/5475349360675561809-framework-uri-javascript-clase-in-mootools/">programarea orientata pe obiecte cu MooTools</a>, <a href="http://www.interfete-web.ro/blog/6631253096929106899-framework-uri-javascript-programare-functionala-in-mootools/">putina programare functionala</a>, <a href="http://www.interfete-web.ro/blog/3263912555982642754-framework-uri-javascript-manipularea-dom-cu-mootools/">manipularea DOM</a>, <a href="http://www.interfete-web.ro/blog/8335198568688189450-framework-uri-javascript-evenimente-in-mootools/">lucrul cu evenimente</a> si <a href="http://www.interfete-web.ro/blog/6199088438858325168-framework-uri-javascript-ajax-cu-mootools/">cereri AJAX</a>), a venit timpul sa punem in practica toate aceste concepte. O sa incercam sa cream un sistem de rating-uri cu ajutorul MooTools, pornind de la un caz concret si incercand ca in final sa obtinem o clasa cat mai generica si customizabila.</p>
<p><span id="more-32"></span><br />
Sa incepem cu markup-ul HTML. Vrem ca in final sa obtinem cod care sa fie utilizabil atat in absenta JavaScript, cat si chiar in absenta CSS (asa cum am vorbit in <a title="Cele mai bune practici JavaScript" href="http://www.interfete-web.ro/blog/384896297046271342-cele-mai-bune-practici-javascript/">articolul trecut</a>, acesta este modul in care ar trebui programate marea majoritate a <a href="http://www.interfete-web.ro/">interfetelor web</a>, cu mica exceptie a paginilor <acronym title="Rich Internet Applications">RIA</acronym>), asadar am ales urmatorul mark-up:</p>
<pre class="brush: xml;">&lt;ul class=&quot;rating&quot;&gt;
    &lt;li class=&quot;now&quot;&gt;Current rating: 2.4 stars&lt;/li&gt;
    &lt;li class=&quot;star star-5&quot;&gt;&lt;a href=&quot;rate.php?id=1&amp;amp;stars=5&quot;&gt;Give 5 stars&lt;/a&gt;&lt;/li&gt;
    &lt;li class=&quot;star star-4&quot;&gt;&lt;a href=&quot;rate.php?id=1&amp;amp;stars=4&quot;&gt;Give 4 stars&lt;/a&gt;&lt;/li&gt;
    &lt;li class=&quot;star star-3&quot;&gt;&lt;a href=&quot;rate.php?id=1&amp;amp;stars=3&quot;&gt;Give 3 stars&lt;/a&gt;&lt;/li&gt;
    &lt;li class=&quot;star star-2&quot;&gt;&lt;a href=&quot;rate.php?id=1&amp;amp;stars=2&quot;&gt;Give 2 stars&lt;/a&gt;&lt;/li&gt;
    &lt;li class=&quot;star star-1&quot;&gt;&lt;a href=&quot;rate.php?id=1&amp;amp;stars=1&quot;&gt;Give 1 star&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;message&quot;&gt;&lt;/p&gt;</pre>
<p>Este vorba asadar de o lista neordonata, al carei prim element este rating-ul curent, apoi in ordine descrescatoare valorile posibile ale voturilor. Rezultatul este disponibil <a rel="nofollow" href="http://www.interfete-web.ro/demo/stars/01.markup.html" target="_blank">aici</a>.</p>
<p>Sa trecem mai departe si sa stilizam acest markup cu ajutorul CSS. Nu o sa listez in articol intreg codul CSS, insa o sa fac un scurt rezumat al acestuia (fisierul este disponibil <a rel="nofollow" href="http://www.interfete-web.ro/demo/stars/stars.css" target="_blank">aici</a>, rezultatul obtinut &#8211; <a rel="nofollow" href="http://www.interfete-web.ro/demo/stars/02.styled.html" target="_blank">aici</a>). Daca va uitati atent pe pagina rezultata, sunt doua modificari:</p>
<ul>
<li>in primul rand, fiecarui element cu clasa <code>now</code> i-am adaugat, cu ajutorul atributului <code>style</code> (iar acesta este unul dintre <em>putinele</em> cazuri in care este preferat CSS inline), un width</li>
<li>apoi, am adaugat fisierul extern <code>stars.css</code></li>
</ul>
<p>In fisier am adaugat imaginile efective de stele &#8211; ca background-uri:</p>
<ul>
<li>background-ul elementelor <code>ul</code> este format din stele goale</li>
<li>background-ul elementelor cu clasa <code>now</code> este format din stele pline</li>
<li>background-ul elementelor cu clasa <code>star</code> este format din stele pline, insa este pozitionat in asa fel incat nu se vede cand mouse-ul nu este deasupra listei de stele</li>
<li>am folosit pseudo-clasa <code>:hover</code> ca sa:
<ul>
<li>ascundem rating-ul curent cand mouse-ul intra deasupra listei de stele (astfel ca daca vrem sa votam un numar mai mic de stele decat rating-ul curent, sa avem vizual imaginea numarului de stele &#8211; altfel, daca vrem sa acordam un numar mai mare de stele, acesta n-ar prezenta nicio problema)</li>
<li>sa afisam background-ul pentru fiecare link care duce catre rating-uri</li>
</ul>
</li>
</ul>
<p>O sa observati ca toate <code>li</code>-urile sunt pozitionate absolut &#8211; pentru ca stelele sa aiba acelasi punct de plecare. Restul codului CSS reseteaza margini si padding-uri, sau sunt clase ajutatoare care ne vor folosi cand implementam partea de JavaScript.</p>
<p><strong>Important!</strong> Internet Explorer 6 (ce surpriza!) nu suporta pseudo-clasa <code>:hover</code> decat pentru elemente de tip ancora. Astfel ca, desi restul incompatibilitatilor le-am eliminat prin mici trucuri, pentru acesta nu exista nicio solutie care sa nu foloseasca JavaScript &#8211; ori, scopul nostru declarat era ca pagina noastra sa fie utilizabila <strong>si</strong> in absenta JS, asadar nu a avut sens sa ne complicam cu rezolvarea acestei probleme. (Ca o nota, probabil ca pana la sfarsitul lui 2009 nu va mai trebui sa ne punem problema compatibilitatii site-urilor <em>si</em> cu IE6 pentru ca se pare ca <a href="http://weblogs.mozillazine.org/asa/archives/2009/01/ie6_on_the_way.html" target="_blank">in acest an va cobori sub cota de 10%</a>)</p>
<p>Sa incercam acum sa adaugam si partea de JavaScript: vrem sa facem votul efectiv cu ajutorul unei cereri AJAX si sa afisam informatii utilizatorului despre rezultatul votului (de exemplu, votul nu a reusit din diverse motive &#8211; poate utilizatorul a votat deja &#8211; sau, dimpotriva, s-a realizat cu succes, caz in care afisam un mesaj de succes). Sa incercam intai sa implementam functionalitatea dorita pentru cazul nostru particular, iar dupa sa incercam sa transformam acest cod intr-o clasa care sa poate fi folosita cat mai generic.</p>
<p>Pentru realizarea votului, ar fi sa adaugam ascultatori la click pe stele, iar in codul care trateaza aceste evenimente transmitem cererea JavaScript. Deoarece avem deja adresele la care se face votul in atributele <code>href</code>, va fi suficient sa facem cererea la acea adresa, insa va trebui sa transmitem o informatie suplimentara pentru ca scriptul din spate sa stie ca cererea a fost AJAX si nu un simplu click pe link (ca in cazul in care JS e dezactivat). Pentru cazul nostru, sa presupunem ca primim raspunsul in format JSON: un boolean <code>success</code> care va fi <code>true</code> daca votul s-a realizat cu succes, un mesaj care sa descrie rezultatul votului, si, daca cererea a fost un succes, noul rating si noua latime pentru elementul cu clasa <code>now</code>, care sa reflecte acest nou rating. La final, cand votul s-a incheiat, va trebui si sa eliminam toate elementele cu clasa <code>star</code> &#8211; nu mai are sens inca un vot (altfel rating-urile nu prea ar reflecta realitatea din moment ce un utilizator ar putea vota de o infinitate de ori). Atentie, scriptul PHP folosit pentru procesarea cererilor AJAX intoarce aceleasi rezultate de fiecare data &#8211; este doar un script dummy.</p>
<p>Iata si codul corespunzator (cu comentariile necesare; rezultatul e disponibil <a rel="nofollow" href="http://www.interfete-web.ro/demo/stars/03.javascript.html" target="_blank">aici</a>):</p>
<pre class="brush: jscript;">$$('.rating').each(function(container) {
    container.getElements('.star a').each(function(star) {
        // toate ancorele din li-uri cu clasa star, din container
        // sunt elementele cu ajutorul carora se fac voturile
        star.addEvent('click', function(event) {
            event.stop();
            // indica utilizatorului ca se petrece ceva
            container.addClass('busy');
            // votul se transmite printr-o cerere AJAX care va primi ca raspuns un JSON
            var req = new Request.JSON({
                // adaugam un parametru suplimentar pentru ca serverul sa stie ca cererea e AJAX
                url: this.get('href') + '&amp;amp;amp;amp;amp;ajax=true',
                onComplete: function(response) {
                    var messageContainer = container.getNext();
                    // elimin din container stelele - nu se mai pot face voturi
                    container.getElements('.star a').destroy();
                    // cererea s-a incheiat - nu mai e nevoie de indicatorul vizual
                    container.removeClass('busy');
                    // afisez utilizatorului rasounsul
                    messageContainer.set('html', response.message);
                    if (!response.success)
                        messageContainer.addClass('error');
                    else
                        container.getElement('.now').setStyle('width', response.width);
                    container.getElement('.now').addClass('voted');
                }
            });
            req.send();
        });
    });
});</pre>
<p>Ce observam din codul de mai sus este ca avem nevoie de urmatoarele:</p>
<ul>
<li>containerul in care sunt toate stelele,</li>
<li>un selector care sa gaseasca toate elementele dintr-un container care declanseaza un vot (i. e. <code>.star a</code>)</li>
<li>vrem sa facem totul cat mai generic, deci o functie care sa intoarca un <code>Request</code> (sau o subclasa a acestuia &#8211; sau, de fapt, orice obiect care sa aiba o metoda <code>send()</code> si caruia sa-i poate fi atasat un eveniment <code>complete</code>, care sa se ocupe de transmiterea catre server a votului) ar fi grozava</li>
<li>cele doua evenimente importante care se petrec in procesul votarii sunt votarea efectiva si finalizarea votului (finalizarea cererii AJAX si intoarcerea raspunsului), deci ar fi util sa putem sa atasam ascultatori acestor evenimente la fel de usor cum atasam ascultatori evenimentelor clasice (<code>click</code>, <code>mouseover</code>, etc.)</li>
<li>ca sa facem clasa cat mai usor de folosit, am putea oferi niste optiuni implicite decente, dar care sa poata fi modificate cu usurinta la instantierea clasei</li>
</ul>
<p>Vom crea o clasa MooTools (deci ar fi util sa revedeti articolul <a href="http://www.interfete-web.ro/blog/5475349360675561809-framework-uri-javascript-clase-in-mootools/">Clase in MooTools</a> si sa aveti la indemana <a href="http://mootools.net/docs/Class/Class" target="_blank">documentatia oficiala</a>), si ne vor fi extrem de utile clasele din <a href="http://mootools.net/docs/Class/Class.Extras" target="_blank"><code>Class.Extras</code></a> (vom implementa pentru clasa noastra, cele doua clase <code>Options</code> si <code>Events</code>), deci haideti sa vorbim pe scurt despre cele doua (documentatia fiind disponibila pentru orice alte nelamuriri).</p>
<p>Atunci cand o clasa MooTools implementeaza <code>Options</code>, acea clasa va capata un membru <code>options</code> (implicit un obiect gol), si o metoda <code>setOptions</code>. Optiunile implicite pot fi specificate intr-un membru <code>options</code> al clasei noastre ca un hash de optiuni, iar apeland <code>setOptions</code> cu un hash de noi optiuni ca parametru, vor fi suprascrise in membrul <code>options</code> doar acei membri care sunt prezenti in acel parametru. Pentru clasa noastra, vom primi in constructor un singur parametru, optional: un hash de optiuni, si vom specifica un set implicit de optiuni care sa fie cat mai generic.</p>
<p>Daca o clasa MooTools implementeaza <code>Events</code>, acelei clase ii devin disponibile o serie de metode &#8211; <code>addEvent</code>, <code>addEvents</code>, <code>removeEvent</code>, <code>removeEvents</code>, <code>fireEvent</code> &#8211; care sunt extrem de asemanatoare cu metodele cu acelasi nume de la <a href="http://www.interfete-web.ro/blog/8335198568688189450-framework-uri-javascript-evenimente-in-mootools/">evenimentele DOM</a>. Chiar mai mult, daca clasa implementeaza si <code>Options</code>, orice optiune care incepe cu <code>on</code> (de exemplu, <code>onVote</code>), va fi atasata ca ascultator la un eveniment de tipul acelei optiuni mai putin <code>on</code> (in cazul nostru, un eveniment <code>vote</code>).</p>
<p>Asadar, iata listarea codului clasei; am folosit un namespace <code>IW</code> pentru a nu crea conflicte &#8211; exista destul de multe alte scripturi pentru ratinguri cu MooTools:</p>
<pre class="brush: js">if (!$defined(window.IW)) {
    IW = {};
}
IW.Ratings = new Class({
    Implements: [Options, Events],
    options: {
        selector: '.rating',
        stars: '.star',
        getRequest: function(url, onComplete) {
            /* url este link-ul catre care ar trebui facuta cererea AJAX, fara parametrii suplimentari
            onComplete este functia care ar trebui atasata ca ascultator atunci cand cererea AJAX s-a terminat */
            return new Request.JSON({url: url + '&amp;amp;ajax=true', onComplete: onComplete})
        }
    },
    bind: function() {
        $$(this.options.selector).each(function(container) {
            container.getElements(this.options.stars).each(function(star){
                var self = this;
                star.addEvent('click', function(event) {
                    event.stop();
                    self.fireEvent('vote', star);
                });
            }.bind(this));
        }.bind(this));
    },
    initialize: function(options) {
        this.addEvent('vote', function(star) {
            var req = this.options.getRequest(
                star.getProperty("href"),
                function(r) {
                    this.self.fireEvent('complete',[r, this.star]);
                }.bind({star: star, self: this})
            );
            req.send();
        }, true);
        this.setOptions(options).bind();
    }
});</pre>
<p>Codul nu prea are nevoie de explicatii suplimentare daca ati urmarit prima implementare de mai sus (cea fara clase), ce ar fi de adaugat ar fi ca instantelor acestei clase ii pot fi atasate doua tipuri de ascultatori:</p>
<ul>
<li><code>vote</code>, care va fi declansat atunci cand se executa votul (in mod tipic, cand se face click pe un link), ai carei ascultatori primesc ca parametru elementul care a declansat evenimentul si al carei context este instanta clasei</li>
<li><code>complete</code>, care va fi declansat atunci cand cererea AJAX prin care s-a transmis votul catre server s-a incheiat. Primeste doi parametri: primul, raspunsul de la server, iar al doilea, elementul care declansase evenimentul. Contextul acestei functii va fi tot instanta clasei</li>
</ul>
<p>Ar trebui ca intotdeauna sa ii fie atasat clasei un ascultator la <code>complete</code> (pentru ca nu exista unul implicit).</p>
<p>Ca sa demonstram cum se comporta in practica clasa noastra, am lasat intentionat din vedere un lucru care tine de utilizabilitatea site-ului si de experienta utilizatorului: nicaieri in codul clasei, nu se anunta vizual utilizatorului ca se petrece ceva dupa ce a facut click pe o stea. Sa rezolvam asta adaugand ascultatori la <code>vote</code>, respectiv <code>complete</code>. Astfel, cand utilizatorul voteaza, vom anunta vizual acest lucru in doua moduri: containerul stelelor (in cazul nostru, listele cu clasa <code>rating</code>) va avea clasa <code>busy</code> in timp ce se efectueaza cererea (astfel, cursorul utilizatorului va indica “busy”), iar in campul in care afisam mesaje vom pune deja celebrul spinner AJAX. Cererea AJAX va dura cel putin doua secunde pentru ca scriptul din spatele acesteia asteapta doua secunde inainte sa intoarca raspunsul. Cand se termina cererea, eliminam clasa <code>busy</code> de la container (spinnerul va fi automat inlocuit cu mesajul primit ca raspuns de la server). Acesta ar fi codul:</p>
<pre class="brush: js">var ratings = new IW.Ratings({
    stars: '.star a',
    // adaugam o optiune care incepe cu on, deci va fi automat adaugata ca ascultator
    onComplete: function(response, element) {
        var parent = element.getParent(this.options.selector);
        var messageContainer = parent.getNext();
        parent.removeClass('busy');
        parent.getElements(this.options.stars).destroy();
        parent.getElement('.now').addClass("voted");
        if (!response.success)
            messageContainer.addClass('error');
        else
            parent.getElement('.now').setStyle('width', response.width);
        messageContainer.set("html",response.message);
    }
});
// putem adauga si explicit ascultatorul
ratings.addEvent('vote', function(star) {
    star.getParent(this.options.selector).getNext().set('html','&lt;img src="/images/loading.gif" alt="Asteptati..." /&gt;');
    star.getParent(this.options.selector).addClass('busy');
});</pre>
<p>Rezultatul este disponibil <a rel="nofollow" href="http://www.interfete-web.ro/demo/stars/" target="_blank">aici</a>.</p>
<p>Data viitoare vom implementa ratinguri ca plugin pentru jQuery.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=4wHWS2-ND-4:NbLUpu9sYsQ:AMTxokU3cl4"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=4wHWS2-ND-4:NbLUpu9sYsQ:AMTxokU3cl4" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=4wHWS2-ND-4:NbLUpu9sYsQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=4wHWS2-ND-4:NbLUpu9sYsQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=4wHWS2-ND-4:NbLUpu9sYsQ:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=4wHWS2-ND-4:NbLUpu9sYsQ:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=4wHWS2-ND-4:NbLUpu9sYsQ:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=4wHWS2-ND-4:NbLUpu9sYsQ:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=4wHWS2-ND-4:NbLUpu9sYsQ:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=4wHWS2-ND-4:NbLUpu9sYsQ:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=4wHWS2-ND-4:NbLUpu9sYsQ:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Interfete-Web/~4/4wHWS2-ND-4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.interfete-web.ro/32/sistem-de-rating-uri-cu-mootools/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/ro/</creativeCommons:license>
	<feedburner:origLink>http://www.interfete-web.ro/32/sistem-de-rating-uri-cu-mootools</feedburner:origLink></item>
		<item>
		<title>Cele mai bune practici JavaScript</title>
		<link>http://feedproxy.google.com/~r/Interfete-Web/~3/0yiEHA6sk2E/cele-mai-bune-practici-javascript</link>
		<comments>http://www.interfete-web.ro/31/cele-mai-bune-practici-javascript#comments</comments>
		<pubDate>Tue, 06 Jan 2009 12:36:00 +0000</pubDate>
		<dc:creator>Cristi</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[accesibilitate]]></category>
		<category><![CDATA[accesibility]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[cele mai bune practici]]></category>
		<category><![CDATA[interfete web]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[user experience]]></category>
		<category><![CDATA[utilizabilitate]]></category>

		<guid isPermaLink="false">http://blog.interfete-web.ro/?p=31</guid>
		<description><![CDATA[O sa vorbesc in acest articol despre cum influenteaza folosirea JavaScript utilizabilitatea, accesibilitatea si experienta utilizatorilor pentru interfete web, greseli facute atunci cand se foloseste JavaScript si cum pot fi ele evitate.

1. Utilizabilitate
In general, atunci cand vorbim de utilizabilitate si JavaScript, se poate spune ca atunci cand este folosit cum ar trebui, JavaScript sporeste foarte [...]]]></description>
			<content:encoded><![CDATA[<p>O sa vorbesc in acest articol despre cum influenteaza folosirea JavaScript utilizabilitatea, accesibilitatea si experienta utilizatorilor pentru <a title="Interfete Web" href="http://www.interfete-web.ro/">interfete web</a>, greseli facute atunci cand se foloseste JavaScript si cum pot fi ele evitate.</p>
<p><span id="more-31"></span></p>
<h5>1. Utilizabilitate</h5>
<p>In general, atunci cand vorbim de utilizabilitate si JavaScript, se poate spune ca atunci cand este folosit cum ar trebui, JavaScript sporeste foarte mult utilizabilitatea unei interfete. Totusi, odata cu aparitia framework-urilor JavaScript, si, astfel, usurinta cu care se pot folosi diverse animatii JavaScript (in general, mai toate librariile au un “motor” de animatii &#8211; care fie vine odata cu libraria, fie este disponibil ca un plugin separat), s-a ajuns la o abuzare a acestor efecte si, in loc ca ele sa usureze folosirea interfetei, mai degraba o ingreuneaza. Imi vine aici in minte exemplul unui site mare de torrente romanesc, care are implicit activata o optiune care duce la o tranzitie a culorii link-urilor atunci cand mouse-ul trece peste link-uri. Ca sa faca lucrurile sa stea si mai prost, durata acestei animatii este si destul de mare iar cele doua culori intre care se face tranzitia au nuante atat de diferite incat, pe langa faptul ca nu aduce absolut niciun beneficiu dpdv al utilizabilitatii, devine mai degraba deranjant si distrage atentia. Ca sa va faceti o idee, am pus <a href="http://www.interfete-web.ro/demo/bad_hovering.html" target="_blank">aici</a> un exemplu de astfel de efect.</p>
<p>Totusi, asta nu inseamna ca animatiile sunt rele si nu ar trebui folosite, doar ca acesta e un exemplu prost de folosire. Un mod de folosire util al animatiilor poate fi vazut pe prima pagina a blogului nostru (si pe prima pagina a fiecarui articol). Astfel, de multe ori, la urmarirea legaturilor catre ancore din acelasi document, uneori utilizatorii au impresia ca au ajuns pe o cu totul alta pagina. Insa o derulare a paginii pana in locul unde este ancora, il ajuta pe utilizator ca nu a intrat pe o pagina noua, ci ca a ramas pe aceeasi pagina.</p>
<p>Si daca tot vorbim de utilizabilitate, un site interesant este <a href="http://www.badusability.com/" target="_blank">Bad Usability Calendar</a> &#8211; niste exemple de folosire a unor concepte in speranta ca sporesc utilizabilitatea unei interfete (este folosit ca exemplu un calendar), dar care insa produc un efect opus.</p>
<h5>2. Accesibilitate</h5>
<p>Daca la utilizabilitate lucrurile stateau destul de ok &#8211; in general folosirea <em>corecta</em> a JS creste utilizabilitatea unei interfete -, la accesibilitate lucrurile stau destul de prost. Cea mai mare greseala pe care o fac designerii/programatorii de interfete web este faptul ca nu iau in vedere faptul ca exista utilizatori care <strong>nu</strong> au JS activat. Poate va intrebati cum se poate ca in ziua de azi sa existe persoane care sa nu aiba un browser care suporta JavaScript. Pe langa faptul ca sigur exista si astfel de persoane, nu trebuie ca browser-ul sa nu suporte JavaScript: exista utilizatori care dezactiveaza de buna voie JavaScript. Luati ca exemplu populara extensie Firefox <a href="https://addons.mozilla.org/en-US/firefox/addon/722" target="_blank">NoScript</a>, care in acest moment are mai mult de 36 de milioane de <span style="text-decoration: line-through;">instalari</span> descarcari in total si peste un milion de descarcari saptamanale.</p>
<p>In plus, chiar si Gmail &#8211; unul dintre cele mai populare exemple de aplicatii 2.0, care foloseste intensiv JS, ofera o varianta pur HTML pentru utilizatorii care nu au JS activat. Desigur, exista site-uri care chiar nu pot functiona fara JS &#8211; de exemplu, editoarele de documente online &#8211; dar pentru orice aplicatie care nu se defineste ca fiind <acronym title="Rich Internet Application">RIA</acronym>, ar trebui ca functionalitatea de baza sa fie disponibila fara JS.</p>
<p>Oricum, faptul ca sunt ignorati acesti utilizatori vine ca urmare a faptului ca nu este urmarita adaugarea progresiva de functionalitate (eng. <em>progressive enhancement</em>) interfetei: ar trebui inceput cu markup-ul html care ar trebui sa fie semantic, apoi acest markup sa fie sporit cu ajutorul CSS, si abia apoi adaugate functionalitati cu ajutorul JS. Exemple proaste de site-uri care nu sunt accesibile in lipsa de JavaScript ar fi (tineti minte ca NU vorbim despre cat de utile sau nu sunt site-urile, ne legam strict de accesarea lor cu JavaScript dezactivat):</p>
<ul>
<li>site-ul de stocare de fotografii <a href="http://www.ipernity.com/" target="_blank">Ipernity</a> nu permite nici macar logarea utilizatorilor in absenta JavaScript, sau inregistrarea de conturi folosind OpenID</li>
<li>site-ul Orange Romania (mai exact, <a href="http://www.orange.ro/thank-you/beneficii-silver-ro.html" target="_blank">aceasta pagina</a>) &#8211; contine div-uri ascunse cu detaliile beneficiilor, care erau afisate doar cu JS.</li>
</ul>
<p>Cum putem evita astfel de greseli? Mai intai, problema de la Ipernity (dar care poate fi intalnita pe o multime de site-uri) poate fi evitata setand legaturile ancorelor catre adrese reale &#8211; este posibil sa folosim, pe partea de server-side, un acelasi script si doua view-uri diferite pentru a implementa functionalitatea dorita, iar framework-urile de tip MVC pentru limbaje ca PHP, Python, Ruby, fac acest lucru aproape trivial &#8211; in loc de celebrele <code>#</code> si <code>javascript:void(0);</code>. Dar daca vrem sa implementam o functionalitate care are neaparat nevoie de JavaScript, putem macar sa nu afisam elementele respective de interfata atunci cand JS nu e activat. Avem aici cel putin doua posibilitati: le ascundem cu CSS (un simplu display: none ar trebui sa fie suficient) sau injectam elementele respective in DOM dinamic &#8211; deci numai daca JS este activ.</p>
<p>Cat despre a doua problema &#8211; continutul ascuns, care devine vizibil numai la declansarea unui eveniment &#8211; cu toate ca este folosit des si nu degeaba &#8211; se conserva foarte mult spatiu pe ecran daca nu afisam informatiile neesentiale decat atunci cand utilizatorul are nevoie de ele &#8211; solutia este tot simpla si am mai precizat-o mai sus: lasam elementul vizibil si il facem invizibil prin CSS. Ca sa fim clari, CSS-ul care face elementele invizibile ar trebui introdus in pagina tot cu JavaScript. Si pentru aceasta solutie avem doua posibilitati:</p>
<ul>
<li>putem crea un fisier separat CSS, pe care il inseram in pagina cu JavaScript &#8211; fie folosind document.write, fie manipuland DOM-ul:</li>
</ul>
<pre class="brush: jscript;">//intr-un tag script, in sectiunea head
document.write('&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;numai.daca.js.e.activ.css&quot;&gt;');
//sau oriunde in pagina, dar de preferat tot in head
var style = document.createElement('link');
style.type='text/css';
style.rel='stylesheet';
style.href='numai.daca.js.e.activ.css';
document.getElementsByTagName('head')[0].appendChild(style);
</pre>
<ul>
<li>sau, punem tot CSS-ul intr-un singur loc si adaugam o clasa elementului HTML, cu ajutorul JS:</li>
</ul>
<pre class="brush: css;">/* in stylesheet */
div.ascuns {
    /* daca nu avem JS, elementul e vizibil */
}

.js div.ascuns {
    /* numai daca avem JS, elementul va fi ascuns */
    display: none;
}
</pre>
<pre class="brush: jscript;">// intr-un tag script, in head-ul paginii
document.getElementsByTagName('html')[0].className='js';
</pre>
<p>O alta problema legata de utilizabilitatea interfetelor cand se foloseste JS este faptul ca se presupune ca utilizatorul are la dispozitie atat mouse (sau touchscreen, sau un alt dispozitiv cu ajutorul caruia se pot declansa evenimentele de tip click) cat si tastatura. Pentru situatii cand nu este disponibil decat unul dintre acestea nu exista intotdeauna solutii, insa in general &#8211; pentru formulare, in loc sa se adauge ascultatori la click pe butoanele de submit ar trebui sa se adauge ascultatori la submit pe form, iar pentru elementele care suporta evenimente de tip change, ar trebui folosit mai degraba onChange decat onKeyUp/onKeyDown. Exemple mai amanuntite in link-urile de la sfarsitul articolului</p>
<h5>3. Experienta utilizatorului</h5>
<p>In sfarsit, daca toate problemele legate de utilizabilitate si accesibilitate sunt rezolvate, exista in general un factor care poate afecta negativ experienta unui utilizator: viteza cu care se incarca o pagina in browser (<a title="Speed Still Matters" href="http://www.codinghorror.com/blog/archives/000722.html" target="_blank">un articol recent</a> spune ca o incarcare a unei pagini mai lunga cu jumatate de secunda duce la pierderea a 20% din trafic). Cum influenteaza JS asta? Toate browserele descarca in paralel elementele externe paginii, <strong>mai putin fisierele CSS si fisierele JS</strong>. Astfel, daca folositi prea multe fisiere JS diferite, si mai ales din alte domenii, timpii de incarcare ai paginii vor avea de suferit (si astfel, si numarul de utilizatori). Ca dovada aveti doua exemple (<a href="http://www.interfete-web.ro/demo/busy.html">primul</a>, <a href="http://www.interfete-web.ro/demo/not_busy.html">al doilea</a>) din care reiese ca fisierele JS nu sunt descarcate in paralele. In primul exemplu, durata de descarcare a fiecarui script va fi minim o secunda (este vorba de un script PHP care doarme o secunda dupa care intoarce cotinutul), iar in al doilea caz durata ar trebui sa fie mult mai mica (ca dovada ca in primul exemplu durata mare de incarcare nu este de la continutul/dimensiunea fisierului JS, ci din cauza ca la intalnirea unui fisier JS extern incarcarea paginii este oprita pana cand acesta este descarcat).</p>
<p>Solutia? Daca o pagina nu se bazeaza extensiv pe JS sau nu este RIA, ar trebui ca toate tag-urile script care duc catre fisiere externe sa fie puse in fisierul HTML cat mai jos in document (de preferat, inainte de <code>&lt;/body&gt;</code>).</p>
<p>Acestea fiind spuse, de data viitoare o sa trecem la crearea de plugin-uri MooTools si jQuery.</p>
<p>Link-uri utile:</p>
<ul>
<li><a href="http://james.padolsey.com/javascript/javascript-libraries-vs-usability/" target="_blank">JavaScript libraries vs. Usability</a></li>
<li><a href="http://www.webaim.org/techniques/javascript/" target="_blank">Creating Accessible JavaScript</a></li>
<li><a href="http://www.webaim.org/techniques/ajax/" target="_blank">Accessibility of AJAX Applications</a></li>
<li><a href="http://"></a><a href="http://www.robertnyman.com/2006/03/23/ajax-javascript-and-accessibility/" target="_blank">AJAX, JavaScript and accessibility</a></li>
<li><a href="http://www.drunkenfist.com/304/2008/12/29/why-front-end-performance-matters-to-everyone/" target="_blank">Why Front End Performance Matters to Everyone, Not Just the High Traffic Giants</a></li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=0yiEHA6sk2E:ZdnfPMZgUIo:AMTxokU3cl4"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=0yiEHA6sk2E:ZdnfPMZgUIo:AMTxokU3cl4" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=0yiEHA6sk2E:ZdnfPMZgUIo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=0yiEHA6sk2E:ZdnfPMZgUIo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=0yiEHA6sk2E:ZdnfPMZgUIo:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=0yiEHA6sk2E:ZdnfPMZgUIo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=0yiEHA6sk2E:ZdnfPMZgUIo:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=0yiEHA6sk2E:ZdnfPMZgUIo:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=0yiEHA6sk2E:ZdnfPMZgUIo:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=0yiEHA6sk2E:ZdnfPMZgUIo:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=0yiEHA6sk2E:ZdnfPMZgUIo:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Interfete-Web/~4/0yiEHA6sk2E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.interfete-web.ro/31/cele-mai-bune-practici-javascript/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/ro/</creativeCommons:license>
	<feedburner:origLink>http://www.interfete-web.ro/31/cele-mai-bune-practici-javascript</feedburner:origLink></item>
		<item>
		<title>Fun: Opera vs. Firefox vs. Internet Explorer</title>
		<link>http://feedproxy.google.com/~r/Interfete-Web/~3/GUm8JNzVG54/fun-opera-vs-firefox-vs-internet-explorer</link>
		<comments>http://www.interfete-web.ro/30/fun-opera-vs-firefox-vs-internet-explorer#comments</comments>
		<pubDate>Mon, 05 Jan 2009 10:59:00 +0000</pubDate>
		<dc:creator>Cristi</dc:creator>
				<category><![CDATA[Fun]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[funny]]></category>
		<category><![CDATA[interfete web]]></category>

		<guid isPermaLink="false">http://blog.interfete-web.ro/?p=30</guid>
		<description><![CDATA[

&#160;

&#160;&#160;

&#160;&#160;

&#160;&#160;

(Sursa: Opera vs. Firefox vs. Internet Explorer) 
]]></description>
			<content:encoded><![CDATA[<p><span id="more-30"></span></p>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://farm3.static.flickr.com/2171/1506172218_3171647acd.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://farm3.static.flickr.com/2171/1506172218_3171647acd.jpg" width="178" /></a>&nbsp;</div>
<div class="separator" style="clear: both; text-align: center;">
&nbsp;<a href="http://farm3.static.flickr.com/2025/1506172196_bca4f0b53d.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://farm3.static.flickr.com/2025/1506172196_bca4f0b53d.jpg" width="190" /></a>&nbsp;</div>
<div class="separator" style="clear: both; text-align: center;">
&nbsp;<a href="http://farm3.static.flickr.com/2383/1506172230_1692c33a1a.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://farm3.static.flickr.com/2383/1506172230_1692c33a1a.jpg" width="166" /></a>&nbsp;</div>
<div class="separator" style="clear: both; text-align: center;">
&nbsp;<a href="http://farm3.static.flickr.com/2059/1506172220_91023e8fe9.jpg?v=0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://farm3.static.flickr.com/2059/1506172220_91023e8fe9.jpg?v=0" width="124" /></a>&nbsp;</div>
<div class="separator" style="clear: both; text-align: left;">
(Sursa: <a href="http://www.techdo.com/opera-vs-firefox-vs-internet-explorer/">Opera vs. Firefox vs. Internet Explorer</a>) </div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=GUm8JNzVG54:5hHtATumM54:AMTxokU3cl4"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=GUm8JNzVG54:5hHtATumM54:AMTxokU3cl4" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=GUm8JNzVG54:5hHtATumM54:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=GUm8JNzVG54:5hHtATumM54:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=GUm8JNzVG54:5hHtATumM54:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=GUm8JNzVG54:5hHtATumM54:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=GUm8JNzVG54:5hHtATumM54:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=GUm8JNzVG54:5hHtATumM54:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=GUm8JNzVG54:5hHtATumM54:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=GUm8JNzVG54:5hHtATumM54:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=GUm8JNzVG54:5hHtATumM54:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Interfete-Web/~4/GUm8JNzVG54" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.interfete-web.ro/30/fun-opera-vs-firefox-vs-internet-explorer/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/ro/</creativeCommons:license>
	<feedburner:origLink>http://www.interfete-web.ro/30/fun-opera-vs-firefox-vs-internet-explorer</feedburner:origLink></item>
		<item>
		<title>Framework-uri JavaScript: AJAX cu jQuery</title>
		<link>http://feedproxy.google.com/~r/Interfete-Web/~3/lByPetr6wzQ/framework-uri-javascript-ajax-cu-jquery</link>
		<comments>http://www.interfete-web.ro/29/framework-uri-javascript-ajax-cu-jquery#comments</comments>
		<pubDate>Sun, 21 Dec 2008 07:43:00 +0000</pubDate>
		<dc:creator>Cristi</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[interfete web]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[XMLHttpRequest]]></category>

		<guid isPermaLink="false">http://blog.interfete-web.ro/?p=29</guid>
		<description><![CDATA[La fel cum MooTools avea un mod generic de a face cereri AJAX, dar si cateva scurtaturi pentru cazuri comune, la fel si jQuery ne ofera un mod generic si cateva scurtaturi.
In cazul cel mai generic, se foloseste metoda ajax din namespace-ul jQuery/&#36;: &#36;.ajax, care primeste ca parametru un hash de optiuni (cele mai multe [...]]]></description>
			<content:encoded><![CDATA[<p>La fel cum MooTools avea un mod generic de a face cereri AJAX, dar si cateva scurtaturi pentru cazuri comune, la fel si jQuery ne ofera un mod generic si cateva scurtaturi.</p>
<p>In cazul cel mai generic, se foloseste metoda <code>ajax</code> din namespace-ul <code>jQuery</code>/<code>&#36;</code>: <a title="jQuery.ajax" href="http://docs.jquery.com/Ajax/jQuery.ajax" target="_blank"><code>&#36;.ajax</code></a>, care primeste ca parametru un hash de optiuni (cele mai multe asemanatoare cu cele de la MooTools) si intoarce instanta de <acronym title="XMLHttpRequest">XHR</acronym> folosita pentru cererea creata (dar care in mod normal nu va fi folosita decat daca se vrea revocarea manuala a cererii &#8211; de exemplu la interactiunea cu utilizatorul). Aceste optiuni (vezi si <a title="jQuery.ajax: options" href="http://docs.jquery.com/Ajax/jQuery.ajax#toptions" target="_blank">documentatia</a>) sunt:</p>
<p><span id="more-29"></span></p>
<ul>
<li><code>url</code> reprezinta URL-ul catre care se face cererea</li>
<li><code>type</code> reprezinta tipul de cerere care se va face catre server (in mod uzual, <code>GET</code> sau <code>POST</code>). Implicit are valoarea <code>'GET'</code></li>
<li><code>data</code> sunt datele ce vor fi trimise in cererea AJAX. Poate fi un query string, sau un hash care va fi transformat in query string</li>
<li><code>async</code>, un boolean setat la <code>true</code> daca cererea va fi facuta asincron sau <code>false</code> altfel; implicit este <code>true</code></li>
<li><code>dataType</code> este un string care spune ce tip de raspuns asteptam de la server. Valorile pentru aceasta optiune ar trebui sa fie dintre urmatoarele: <code>'xml'</code> (daca raspunsul asteptat este un XML), <code>'html'</code> (daca raspunsul asteptat este un fragment de cod HTML; orice taguri <code>script</code> din raspuns sunt evaluate daca acest fragment este inserat in DOM), <code>'script'</code> (daca asteptam cod JavaScript), <code>'json'</code> (daca asteptam date in formatul JSON), <code>'jsonp'</code> (daca cererile se fac catre un server altul decat al site-ului nostru si se foloseste JSONP) sau <code>'text'</code> (daca raspunsul asteptat este pur si simplu text, fara sa aiba un format anume)</li>
<li><code>cache</code> este un boolean care spune daca datele primite vor fi cache-uite sau nu. Implicit este <code>true</code> (deci vor fi cache-uite) pentru orice <code>dataType</code> diferit de <code>'script'</code> si <code>false</code> daca <code>dataType</code> este <code>'script'</code></li>
<li><code>timeout</code> reprezinta intervalul de timp, in milisecunde, cat se asteapta raspunsul de la server. Daca serverul nu raspunde dupa acest interval de timp, cererea este anulata si se apeleaza functiile <code>error</code> si <code>complete</code></li>
<li><code>jsonp</code> este un string care da <em>numele</em> parametrului din query string pentru functia de callback, in cazul in care se face o cerere <a title="Remote JSON - JSONP" href="http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/" target="_blank">JSONP</a> (nu este nevoie de numele functiei pentru ca obiectul intors de raspuns este transmis ca parametru functiei <code>success</code> &#8211; in schimb se foloseste <code>?</code> pe post de nume al functiei si jQuery completeaza automat acest parametru; de exemplu daca vrem sa transmitem un parametru <code>nume</code> si numele parametrului pentru functia de callback este <code>callback</code>, optiunea <code>data</code> ar putea avea valoarea <code>'http://www.exemplu.com/script.php?nume=Test&amp;callback=?'</code>)</li>
<li><code>contentType</code> este un string care seteaza header-ul <code>Content-Type</code> al cererii. Implicit este <code>'application/x-www-form-urlencoded'</code> (ceea ce ar trebui sa fie ok pentru majoritatea cererilor)</li>
<li><code>scriptCharset</code> este un string care spune care este setul de caractere al raspunsului pentru cererile de tip <code>script</code>/<code>jsonp</code>, si este necesar daca setul de caractere din raspuns este diferit de cel al documentului curent</li>
<li><code>dataFilter</code> este o functie care va procesa raspunsul primit de la server si va intoarce raspunsul procesat. Acesta va fi raspunsul folosit in toate celelalte functii care folosesc raspunsul de la server. Functiei ii sunt transmisi ca parametri datele primite de la server si tipul datelor (optiunea <code>dataType</code> de care am vorbit mai sus).</li>
<li><code>global</code>, un boolean care spune daca vor fi generate evenimentele globale (vom vorbi de acestea mai jos). Implicit este <code>true</code> si evenimentele vor fi generate</li>
<li><code>ifModified</code>, un boolean care, daca e setat la <code>true</code> (iar implicit e <code>false</code>), spune ca cererea ar trebui sa se incheie cu eroare daca raspunsul nu a fost modificat de la ultima cerere, prin verificarea headerului <code>Last-Modified</code>.</li>
<li><code>username</code>, <code>password</code> sunt doi parametri folositi pe post de username si parola, daca URL-ul la care se face cererea are nevoie de autentificare HTTP</li>
<li><code>processData</code> este un boolean (implicit <code>true</code>) care spune daca, atunci cand optiunea <code>data</code> nu este un string ci un obiect, acesta ar trebui sau nu convertit intr-un query string</li>
<li><code>beforeSend</code>, o functie care este apelata <em>inainte</em> ca cererea sa fie trimisa catre server. Acesteia ii este transmis un singur parametru, instanta de XHR care va fi folosita pentru a face cererea AJAX. Daca vrem sa setam headere pentru cererea noastra, aici ar trebui setate. De asemenea, poate dorim sa anulam cererea &#8211; pentru aceasta este suficient sa returnam <code>false</code> din aceasta functie. Contextul functiei este hash-ul de optiuni ale cererii AJAX.</li>
<li><code>complete</code> este o functie care este apelata daca cererea s-a terminat. Ii sunt trimisi 2 parametri: instanta de XHR cu care a fost facuta cererea, si un string ce descrie status-ul cererii. Contextul functiei este hash-ul de optiuni ale cererii AJAX. Aceasta functie este apelata <em>dupa</em> ce au fost apelate functiile pentru cerere efectuata sau nu cu succes (adica optiunile <code>success</code> si <code>error</code>)</li>
<li><code>error</code> este o functie care va fi apelata daca cererea s-a terminat cu esec. Contextul functiei este hash-ul de optiuni al cererii AJAX. Parametrii transmisi sunt instanta XHR, textul care descriere status-ul cererii (si care poate fi <code>"timeout"</code> &#8211; daca cererea a depasit timpul setat ca timeout -, <code>"error"</code> &#8211; daca a fost vorba de o eroare de la server -, <code>"notmodified"</code> &#8211; daca raspunsul primit a fost not modified (deci s-a folosit optiunea <code>ifModified</code>) &#8211; sau <code>"parsererror"</code> &#8211; daca a aparut o eroare la procesarea datelor primite) si, optional, exceptia care a fost aruncata la eroare (daca a existat o astfel de exceptie)</li>
<li><code>success</code> este o functie care este apelata atunci cand cererea a fost efectuata cu succes. Ii sunt trimisi 2 parametri: datele primite de la server, <strong>procesate</strong> (deci daca am primit date in format JSON, parametrul va fi un obiect; daca am primit xml, va fi un document xml, daca am primit text va fi un string etc.), si un string care descrie statusul cererii (si care va fi intotdeauna <code>success</code>)</li>
<li><code>xhr</code> reprezinta o functie care va fi apelata pentru a obtine instanta de XHR cu care se face cererea.</li>
</ul>
<p>Este posibil sa setam valori implicite pentru <em>toate</em> cererile AJAX prin intermediul metodei <code>ajaxSetup</code> (<a title="jQuery.ajaxSetup" href="http://docs.jquery.com/Ajax/jQuery.ajaxSetup" target="_blank"><code>&#36;.ajaxSetup</code></a>) care primeste acelasi hash ca si <code>&#36;.ajax</code>, insa de aceasta data optiunile transmise ca parametri vor fi cele implicite, pentru orice cerere AJAX care va fi facuta dupa apelul acestei metode.</p>
<p>Cat despre evenimentele globale de care vorbeam mai sus, ar trebui spuse urmatoarele: in jQuery exista doua <a title="jQuery: AJAX Events" href="http://docs.jquery.com/Ajax_Events" target="_blank">tipuri de evenimente</a> care pot fi declansate atunci cand se fac cereri AJAX: evenimente locale (atasate cererii) si evenimente globale (pe care le vor primi toate elementele din DOM care au atasati ascultatori la astfel de evenimente). Evenimentele locale sunt cele de care am vorbit mai sus: functiile care sunt apelate inainte sau dupa ce s-a facut cererea AJAX: <code>beforeSend</code>, <code>complete</code>, <code>success</code>, <code>error</code>. Evenimentele globale se ataseaza elementelor din dom la fel ca orice alt tip de eveniment, si sunt:</p>
<ul>
<li><code>ajaxStart</code>, care este declansat atunci cand nu este in curs nicio alta cerere AJAX si inainte ca cererea care a generat evenimentul sa fie transmisa</li>
<li><code>ajaxSend</code>, care este declansat inainte sa fie transmisa o noua cerere AJAX (deosebirea fata de tipul anterior este ca acest eveniment se va declansa chiar daca erau alte cereri in curs)</li>
<li><code>ajaxComplete</code>, care este declansat cand o cerere AJAX s-a incheiat (cu succes sau nu)</li>
<li><code>ajaxSuccess</code>, care este declansat cand o cerere AJAX s-a incheiat cu succes</li>
<li><code>ajaxError</code>, care este declansat cand o cerere AJAX s-a incheiat fara succes</li>
<li><code>ajaxStop</code>, care este declansat atunci cand nu mai exista nicio cerere AJAX in curs de procesare</li>
</ul>
<p>Cat despre ajutorul pe care il ofera jQuery pentru cazuri comune de utilizare, avem la dispozitie urmatoarele:</p>
<ul>
<li><code>&#36;().load</code> trimite o cerere la server, iar raspunsul primit il injecteaza in fiecare element din setul jQuery. Primeste 3 parametri: primul, URL-ul la care se face cererea &#8211; acesta este un string care poate contine si un selector CSS dupa care va fi filtrat HTML-ul din raspuns (selectorul CSS ar trebui sa fie separat de URL printr-un spatiu); al doilea, optional, un hash care va fi transformat in query string si va fi trimis serverului; al treilea, tot optional, este o functie care va fi apelata cand cererea s-a terminat (<strong>cu succes sau nu</strong>) si care va primi ca parametri raspunsul de la server, un string care descrie statusul cererii, si instanta de XHR cu care s-a facut cererea (contextul acestei functii va fi elementul curent din set)</li>
<li><code>&#36;.get</code>, <code>&#36;.post</code> sunt niste scurtaturi pentru a face cereri cu <code>GET</code>/<code>POST</code> fara a avea nevoie de optiuni avansate ca la <code>&#36;.ajax</code>. Primeste ca parametri: URL-ul la care se face cererea (singurul parametru obligatoriu), un hash de date care va fi transformat intr-un query string, o functie care va fi apelata <strong>daca cererea s-a terminat cu succes</strong> (si care primeste ca parametri raspunsul serverului si un string care descrie statusul cererii &#8211; dar care va fi intotdeauna <code>'success'</code>; datele sunt in functie de tipul de raspuns asteptat, la fel ca la <code>&#36;.ajax</code>) si un string care reprezinta tipul de date asteptat de la server (vezi optiunea <code>dataType</code> de la <code>&#36;.ajax</code>)</li>
<li><code>&#36;.getJSON</code> face o cerere catre un URL si asteapta sa primeasca date in format JSON (este posibil sa se faca cereri catre un alt server decat cel curent, cu JSONP). Metoda primeste 3 parametri, dintre care doar primul este obligatoriu: URL-ul la care se face cererea (si care spuneam ca poate fi extern; daca serverul la care suporta cererea suporta JSONP, numele functiei de callback ar trebui sa fie ? &#8211; astfel va fi apelata functia de succes), un hash cu date ce va fi convertit la query string si o functie ce va fi apelata daca cererea s-a terminat cu succes, care va primi ca parametri obiectul intors de cerere si un string care descrie statusul cererii (dar care va fi intotdeauna <code>'success'</code>).</li>
<li><code>&#36;.getScript</code> face o cerere catre server si asteapta ca raspuns cod JavaScript (cererea poate fi facuta si catre un server extern), pe care il executa. Primeste 2 parametri: URL-ul la care se va face cererea, si, optional, o functie care va fi apelata daca cererea s-a efectuat cu succes (si care primeste ca parametri un string &#8211; codul JS intors de server &#8211; si un string care descrie status-ul, dar care va fi intotdeauna <code>'success'</code>)</li>
</ul>
<p>Ultimele doua metode care ajuta la cereri AJAX, sunt:</p>
<ul>
<li><code>&#36;().serialize()</code>, care intoarce un query string bazat pe valorile tuturor elementelor de tip form input (input, textarea, select) <strong>care au un atribut name</strong></li>
<li><code>&#36;().serializeArray()</code> lucreaza la fel ca <code>&#36;().serialize</code> dar nu intoarce un query string, ci un vector de obiecte &#8211; folositor pentru lucrul cu date in format JSON</li>
</ul>
<p>Articolul de azi a fost lipsit de exemple (desi sunt destule pe paginile de documentatie), insa urmatoarele cateva articole vor fi punerea in practica a tot ce am invatat pana acum despre MooTools si jQuery.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=lByPetr6wzQ:zltNa8kS8fE:AMTxokU3cl4"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=lByPetr6wzQ:zltNa8kS8fE:AMTxokU3cl4" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=lByPetr6wzQ:zltNa8kS8fE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=lByPetr6wzQ:zltNa8kS8fE:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=lByPetr6wzQ:zltNa8kS8fE:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=lByPetr6wzQ:zltNa8kS8fE:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=lByPetr6wzQ:zltNa8kS8fE:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=lByPetr6wzQ:zltNa8kS8fE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=lByPetr6wzQ:zltNa8kS8fE:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=lByPetr6wzQ:zltNa8kS8fE:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=lByPetr6wzQ:zltNa8kS8fE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Interfete-Web/~4/lByPetr6wzQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.interfete-web.ro/29/framework-uri-javascript-ajax-cu-jquery/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/ro/</creativeCommons:license>
	<feedburner:origLink>http://www.interfete-web.ro/29/framework-uri-javascript-ajax-cu-jquery</feedburner:origLink></item>
		<item>
		<title>Cheat Sheet-uri pentru MooTools si jQuery</title>
		<link>http://feedproxy.google.com/~r/Interfete-Web/~3/-9D-AqWAg7E/cheat-sheet-uri-pentru-mootools-si-jquery</link>
		<comments>http://www.interfete-web.ro/28/cheat-sheet-uri-pentru-mootools-si-jquery#comments</comments>
		<pubDate>Wed, 17 Dec 2008 10:14:00 +0000</pubDate>
		<dc:creator>Cristi</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[cheat sheets]]></category>
		<category><![CDATA[interfete web]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[mootools]]></category>

		<guid isPermaLink="false">http://blog.interfete-web.ro/?p=28</guid>
		<description><![CDATA[Disponibile aici (MooTools), respectiv aici (jQuery)
]]></description>
			<content:encoded><![CDATA[<p>Disponibile <a title="mootools 1.2 cheat sheet" href="http://mediavrog.net/blog/2008/06/11/mootools/mootools-12-cheat-sheet/" target="_blank">aici</a> (MooTools), respectiv <a title="jQuery Cheat Sheets" href="http://nettuts.com/freebies/cheat-sheets/jquery-cheat-sheet/">aici</a> (jQuery)</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=-9D-AqWAg7E:vFVUgHlexok:AMTxokU3cl4"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=-9D-AqWAg7E:vFVUgHlexok:AMTxokU3cl4" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=-9D-AqWAg7E:vFVUgHlexok:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=-9D-AqWAg7E:vFVUgHlexok:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=-9D-AqWAg7E:vFVUgHlexok:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=-9D-AqWAg7E:vFVUgHlexok:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=-9D-AqWAg7E:vFVUgHlexok:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=-9D-AqWAg7E:vFVUgHlexok:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?i=-9D-AqWAg7E:vFVUgHlexok:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=-9D-AqWAg7E:vFVUgHlexok:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Interfete-Web?a=-9D-AqWAg7E:vFVUgHlexok:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Interfete-Web?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Interfete-Web/~4/-9D-AqWAg7E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.interfete-web.ro/28/cheat-sheet-uri-pentru-mootools-si-jquery/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/ro/</creativeCommons:license>
	<feedburner:origLink>http://www.interfete-web.ro/28/cheat-sheet-uri-pentru-mootools-si-jquery</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 0.565 seconds. --><!-- Cached page generated by WP-Super-Cache on 2010-02-28 14:08:37 -->
