<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Staicu Ionuţ-Bogdan &#187; JavaScript</title>
	<atom:link href="http://www.iamntz.com/category/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.iamntz.com</link>
	<description>the Frontend Developer</description>
	<lastBuildDate>Mon, 23 Jan 2012 04:55:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Node.js Introducere – Module</title>
		<link>http://www.iamntz.com/2773/frontend-developer/node-js-introducere-%e2%80%93-module/?utm_source=subscriber&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://www.iamntz.com/2773/frontend-developer/node-js-introducere-%e2%80%93-module/#comments</comments>
		<pubDate>Sun, 20 Nov 2011 18:45:27 +0000</pubDate>
		<dc:creator>Eugen Tudorancea</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[guest post]]></category>
		<category><![CDATA[Node.js]]></category>

		<guid isPermaLink="false">http://www.iamntz.com/?p=2773</guid>
		<description><![CDATA[In articolul anterior am facut o scurta analiza a codului demo de pe site-ul Node.js. Specificatiile limbajului de programare JavaScript nu prezintă un mod robust pentru a scrie module, în timp s-au dezvoltat mai multe tipare, dar comunitatea avea nevoie de ceva general acceptat și deaceea s-a creat un sitem de standardizare a modulelor și [...]
	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/2773/frontend-developer/node-js-introducere-%e2%80%93-module/'>Node.js Introducere – Module</a>. <br/>
	<a href='http://www.iamntz.com/2773/frontend-developer/node-js-introducere-%e2%80%93-module/#postcomment'>Adaugă un comentariu!</a>]]></description>
			<content:encoded><![CDATA[<p>In <a title="Node.js introducere - Server HTTP" href="http://www.iamntz.com/2521/frontend-developer/node-js-introducere-server-http/">articolul anterior</a> am facut o scurta analiza a codului demo de pe site-ul Node.js.</p>
<p><a href="http://www.ecmascript.org/" title="ECMAscript">Specificatiile limbajului de programare JavaScript</a> nu prezintă un mod robust pentru a scrie module, în timp s-au dezvoltat mai multe tipare, dar comunitatea avea nevoie de ceva general acceptat și deaceea s-a creat un sitem de standardizare a modulelor și pachetelor, <a href="http://www.commonjs.org/" title="CommonJS - Standarde">CommonJS</a>.</p>
<p>Node.js a implementat standardul CommonJS pentru module. Să luăm următorul exemplu:</p>
<pre class="brush: bash; title: ; notranslate">
modulul_meu.js
</pre>
<pre class="brush: jscript; title: ; notranslate">
var Persoana = {}; // variabila privata
Persoana.nume = 'necunoscut';
Persoana.membru = true;

// functie privata
var filtru = function (attr) {
  if (typeof( attr ) === 'string') return attr;
  return null;
};

// API-ul modulului, functiile publice
exports.getNume = function () {
  return Persoana.nume;
};
exports.setNume = function (nume) {
  Persoana.nume = nume;
};
exports.isMembru = function () {
  return Persoana.membru;
};
exports.VERSIUNE = &quot;0.0.1&quot;;
</pre>
<pre class="brush: bash; title: ; notranslate">
app.js
</pre>
<pre class="brush: jscript; title: ; notranslate">
var modulul_meu = require('./modulul_meu.js'); // includem modulul

if (modulul_meu.isMembru) {
  modulul_meu.setNume( 'Andrei' );
};

console.log( modulul_meu.getNume() );
</pre>
<p>Modulul se află într-un fișier separat, funcția require() citește fișierul &#8220;modulul_meu.js&#8221;, îl evaluează și rezultatul este un obiect de forma: </p>
<pre class="brush: jscript; title: ; notranslate">
{
  getNume: [Function],
  setNume: [Function],
  isMembru: [Function],
  VERSIUNE: &quot;0.0.1&quot;
}
</pre>
<p>Funcția require() are un mod puțin mai complicat de a căuta modulele:<br />
<strong>require(&#8216;modulul_meu&#8217;):</strong></p>
<ol>
<li>caută în modulele incluse în Node.js, dacă nu este găsit,</li>
<li>caută în modulele globale  (../node/node_modules/modulul_meu/index.js), dacă nu este găsit,</li>
<li>caută în modulele locale (./node_modules/modulul_meu/index.js)</li>
</ol>
<p><strong>require(&#8216;./modulul_meu.js&#8217;):</strong> caută în directorul curent<br />
<strong>require(&#8216;../modulul_meu.js&#8217;):</strong> caută în directorul precedent<br />
<strong>require(&#8216;./module/modulul_meu.js&#8217;):</strong> caută în directorul &#8216;module&#8217;, aflat în directorul curent</p>
<p>Managerul pentru module este <a href="http://npmjs.org" title="Node.js Package Manager">NPM (Node.js Package Manager)</a>. <a href="http://search.npmjs.org" title="Cauta module Node.js">Aici</a> puteți găsi o mulțime de module utile. Instalați NPM pentru a putea instala mai simplu modulele. </p>
<p>Dacă aveți întrebări sau sugestii lăsati un comentariu. </p>
<p><strong>Edit:</strong><br />
Ascultand podcast-ul <a href="https://twitter.com/#!/NodeUp" title="Node.js podcast show - NodeUp" target="_blank">NodeUp</a>, am aflat ca mai este un site unde sunt prezentate modulele si resurse: <a href="http://toolbox.no.de" title="Node.js Toolbox" target="_blank">toolbox.no.de</a></p>

	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/2773/frontend-developer/node-js-introducere-%e2%80%93-module/'>Node.js Introducere – Module</a>. <br/>
	<a href='http://www.iamntz.com/2773/frontend-developer/node-js-introducere-%e2%80%93-module/#postcomment'>Adaugă un comentariu!</a>]]></content:encoded>
			<wfw:commentRss>http://www.iamntz.com/2773/frontend-developer/node-js-introducere-%e2%80%93-module/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Node.js Introducere – Server HTTP</title>
		<link>http://www.iamntz.com/2597/frontend-developer/node-js-introducere-server-http/?utm_source=subscriber&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://www.iamntz.com/2597/frontend-developer/node-js-introducere-server-http/#comments</comments>
		<pubDate>Wed, 19 Oct 2011 12:34:15 +0000</pubDate>
		<dc:creator>Eugen Tudorancea</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[guest post]]></category>
		<category><![CDATA[Node.js]]></category>

		<guid isPermaLink="false">http://www.iamntz.com/?p=2597</guid>
		<description><![CDATA[In articolul anterior am discutat despre diferența dintre modul de programare sincron și asincron. Pentru cine nu are instalată o versiune Node.js, accesați pagină de download. Pentru începători recomand ultima versiune (unstable), că să puteți învăța și beneficia de toate funcțiile care au fost adăugate și să evitați folosirea celor care au fost scoase. Vom [...]
	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/2597/frontend-developer/node-js-introducere-server-http/'>Node.js Introducere – Server HTTP</a>. <br/>
	<a href='http://www.iamntz.com/2597/frontend-developer/node-js-introducere-server-http/#postcomment'>Adaugă un comentariu!</a>]]></description>
			<content:encoded><![CDATA[<p>In <a title="Node.js introducere - Sincron vs Asincron" href="http://www.iamntz.com/2521/frontend-developer/node-js-introducere-sincron-vs-asincron/">articolul anterior</a> am discutat despre diferența dintre modul de programare sincron și asincron.</p>
<p>Pentru cine nu are instalată o versiune Node.js, accesați pagină de <a title="Node.js download" href="http://nodejs.org/#download" target="_blank">download</a>. Pentru începători recomand ultima versiune (unstable), că să puteți învăța și beneficia de toate funcțiile care au fost adăugate și să evitați folosirea celor care au fost scoase.</p>
<p>Vom folosi <a title="Node.js Server HTTP" href="http://nodejs.org/#introduction">exemplul de pe site-ul oficial</a>, îl vom restructura pentru a facilita explicarea lui și vom crea fișierul <code>exemplu.js</code>, ce conține:</p>
<pre class="brush: jscript; title: ; notranslate">
var http = require('http');

var port = 9090;
var mesaj = &quot;&lt;h2&gt;Node.js - exemplu server HTTP&lt;/h2&gt;&quot;;

var userConectat = function (request, response) {
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.write( mesaj );
  response.end();
};

var server = http.createServer( userConectat );
server.listen( port );

console.log('Accesati serverul: http://127.0.0.1:9090');
</pre>
<p>Ca să rulam fisierul:<span id="more-2597"></span></p>
<pre class="brush: bash; title: ; notranslate">
node exemplu.js
</pre>
<p>Să disecam codul:</p>
<pre class="brush: jscript; title: ; notranslate">
var http = require('http');
</pre>
<p>Funcția <a title="require()" href="http://nodejs.org/docs/latest/api/all.html#require">&#8216;require&#8217;</a> se folosește la încărcarea modulelor, în cazul nostru modulul &#8216;http&#8217;, care face parte din <a title="Node.js documentatie" href="http://nodejs.org/docs/latest/api/index.html">modulele standard</a>.</p>
<pre class="brush: jscript; title: ; notranslate">
var userConectat = function (request, response) { ... };
</pre>
<p>Funcția &#8216;userConectat&#8217; în cazul nostru va fi un &#8216;callback&#8217;. Pe scurt va fi executată în interiorul altei funcții. Pentru cei familiarizați cu jQuery: $(&#8216;button&#8217;).click( callback );</p>
<p>Funcția are 2 obiecte, <code>request</code> (care conține &#8216;HTTP Request&#8217;), respectiv <code>response</code> (care conține &#8216;HTTP Response&#8217;).</p>
<p>Vom folosi obiectul <a title="http.ServerResponse" href="http://nodejs.org/docs/latest/api/all.html#http.ServerResponse"><code>response</code></a> pentru a transmite un mesaj userului:</p>
<pre class="brush: jscript; title: ; notranslate">
  response.writeHead(200, {'Content-Type': 'text/plain'});
</pre>
<p>Trimitem codul 200 (HTTP status code), care reprezintă recepția cu succes a transmisiei, apoi informăm browserul despre tipul de codare al conținutului (MIME media type), în cazul nostru fiind <code>text/plain</code>. Dacă am fi trimis un string <acronym title="JavaScript Object Notation">JSON</acronym> foloseam <code>application/json</code>.</p>
<pre class="brush: jscript; title: ; notranslate">
  response.write( mesaj );
  response.end();
</pre>
<p>Scriem mesajul nostru <a title="response.write" href="http://nodejs.org/docs/latest/api/all.html#response.write">(<code>response.write</code>)</a>, apoi închidem conexiunea <a title="response.end" href="http://nodejs.org/docs/latest/api/all.html#response.write">(<code>response.end</code>)</a>. Dacă nu închidem conexiunea browserul va rămâne suspendat până la încheierea transmisiei și nu va afișa mesajul.</p>
<pre class="brush: jscript; title: ; notranslate">
var server = http.createServer( userConectat );
</pre>
<p>Funcția <a title="http.createServer" href="http://nodejs.org/docs/latest/api/all.html#http.createServer"><code>http.createServer</code></a> creează un server HTTP în mod asincron (în afara loop-ului principal). Pentru fiecare user conectat la server se va executa funcția <code>userConectat</code>; funcția este executată în loop-ul principal, nu în mod asincron. <strong>Rețineți</strong>, totul în Node.js lucrează în paralel, mai puțin codul vostru.</p>
<pre class="brush: jscript; title: ; notranslate">
server.listen( port );
</pre>
<p>Funcția <code>server.listen</code> menține serverul activ și așteaptă evenimente, în cazul nostru conexiunea pe portul &#8217;9090&#8242;. Dacă nu atașăm un <code>event listner</code> Node.js va termina execuția fișierului.</p>
<p>Spuneam că programarea în mod asincron prezintă un loop principal (Node.js), detectarea evenimentelor, în cazul nostru <code>server.listen( port )</code> și manipularea evenimentelor <code>userConectat</code>.</p>
<p>Node.js este un mediu bazat pe evenimente, prin urmare, evenimentele sunt emise și recepționate pe diferite <em>canale</em>. În exemplul de mai sus, recepționarea unui eveniment este efectuată de către <code>server.listen</code> pe canalul &#8217;9090&#8242;. Fiecare conexiune emite evenimente, de aceea putem rescrie <code>server = http.createServer( userConectat )</code> în felul următor:</p>
<pre class="brush: jscript; title: ; notranslate">
var server = http.createServer();
server.on( 'request',  userConectat );
</pre>
<p><strong>Urmeaza: Module și EventEmitter</strong></p>

	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/2597/frontend-developer/node-js-introducere-server-http/'>Node.js Introducere – Server HTTP</a>. <br/>
	<a href='http://www.iamntz.com/2597/frontend-developer/node-js-introducere-server-http/#postcomment'>Adaugă un comentariu!</a>]]></content:encoded>
			<wfw:commentRss>http://www.iamntz.com/2597/frontend-developer/node-js-introducere-server-http/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Node.js Introducere – Sincron vs Asincron</title>
		<link>http://www.iamntz.com/2521/frontend-developer/node-js-introducere-%e2%80%93-partea-a-doua/?utm_source=subscriber&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://www.iamntz.com/2521/frontend-developer/node-js-introducere-%e2%80%93-partea-a-doua/#comments</comments>
		<pubDate>Tue, 11 Oct 2011 11:11:05 +0000</pubDate>
		<dc:creator>Eugen Tudorancea</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[guest post]]></category>
		<category><![CDATA[Node.js]]></category>

		<guid isPermaLink="false">http://www.iamntz.com/?p=2521</guid>
		<description><![CDATA[În articolul anterior am făcut o scurtă paralelă între Thread-uri și Events; am precizat că modelul Evented are un loop principal și 2 componente: detectarea evenimentelor (event detection) și manipularea evenimentelor (event handlers). De ce modelul evented este mai eficient pentru server? În mare parte serverele sunt proiectate pt. , ceea ce înseamnă că, în [...]
	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/2521/frontend-developer/node-js-introducere-%e2%80%93-partea-a-doua/'>Node.js Introducere – Sincron vs Asincron</a>. <br/>
	<a href='http://www.iamntz.com/2521/frontend-developer/node-js-introducere-%e2%80%93-partea-a-doua/#postcomment'>Adaugă un comentariu!</a>]]></description>
			<content:encoded><![CDATA[<p>În <a href="http://www.iamntz.com/2436/frontend-developer/node-js-introducere-partea-intai/" rel="Node.js Introducere - Thread-uri vs Evenimente">articolul anterior</a> am făcut o scurtă paralelă între Thread-uri și Events; am precizat că modelul Evented are un loop principal și 2 componente: detectarea evenimentelor (event detection) și manipularea evenimentelor (event handlers). </p>
<h4>De ce modelul evented este mai eficient pentru server?</h4>
<p>În mare parte serverele sunt proiectate pt. <acronym title="Input/Output">I/O</acronym>, ceea ce înseamnă că, în majoritatea timpului, așteaptă operațiile I/O (conexiune la server, accesarea unei baze de date, citirea unui fișier de pe <acronym title="Hard Disk Drive">HDD</acronym>, comunicarea cu un serviciu web extern, etc). </p>
<p>Să luăm un exemplu: după ce a terminat de redactat cartea, una din damele din articolul anterior intenționează să o trimită editorului. Se conectează la <code>www.paginalui.ro</code>, face upload la PDF și apăsa submit. </p>
<p>Serverul editorului este programat să ruleze următoarea rutină:<span id="more-2521"></span></p>
<ol>
<li>primește PDF-ul, salvează-l în folderul: <code>/cărți_needitate/</code>; </li>
<li>salvează în baza de date autorul și datele personale;</li>
<li>trimite notificare prin sms editorului;</li>
<li>după salvarea fișierului trimite răspuns: „<em>Material adăugat cu succes!</em>”;</li>
</ol>
<p><a href="http://content.iamntz.com/wp-content/uploads/2011/10/SynchronousvsAsynchronous.jpg"><img src="http://content.iamntz.com/wp-content/uploads/2011/10/SynchronousvsAsynchronous.jpg" alt="" width="600" class="aligncenter wp-image-2523" /></a></p>
<p>În modul sincron totul se execută în ordine, de sus până jos, fiecare pas fiind evaluat și procesat, iar utilizatorul primește răspunsul la finalizarea proceselor. </p>
<p>În modul asincron fiecare pas este evaluat, dar nu se așteaptă procesarea pașilor. Fiecare pas este procesat in paralel (în afara loop-ului principal), iar la finalizarea fiecăruia se întorc răspunsurile. </p>
<p>De aceea se poate observă că răspunsul pentru pasul &#8216;B&#8217; s-a întors înaintea răspunsului pentru pasul &#8216;A&#8217;, deoarece procesarea lui a durat mai puțin. </p>
<p>Trimiterea mesajului prin SMS este mai rapida decat in modul sincron, deoarece că nu se asteaptă ca celelalte procese să termine.</p>
<p>Să zicem că serviciul extern nu a putut trimite SMS-ul și răspunde cu o întrebare &#8220;Reîncerc trimiterea?&#8221;, iar chestia asta se întâmplă de vreo 40 de ori. </p>
<p>În modul sincron utilizatorul așteaptă procesarea celor 40 de incercari apoi primeste răspunsul HTTP, altfel finalizarea execuției fișierului (ex: process.php) va înceta comunicarea cu serviciul extern de SMS. </p>
<p>În modul asincron, utilizatorul i se livrează răspunsul HTTP și în continuare serverul se va ocupa de trimiterea mesajului.</p>
<p><strong>În Node.js toate operațiile sunt asincron, iar <em>totul rulează în paralel, mai puțin codul tău!</em></strong></p>
<p>Codul tău este evaluat și procesat în loop-ul principal, nu extern acestuia.</p>
<p>Spre exemplu, dacă se creează o funcție delay(1min) și este procesată în loop-ul principal, în acel interval de 1 minut, loop este blocat (implicit serverul). </p>
<p>În articolul următor vom începe să scriem primele linii de cod și deci.. </p>
<p><strong>Urmează: Asynchronous și Callbacks </strong></p>

	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/2521/frontend-developer/node-js-introducere-%e2%80%93-partea-a-doua/'>Node.js Introducere – Sincron vs Asincron</a>. <br/>
	<a href='http://www.iamntz.com/2521/frontend-developer/node-js-introducere-%e2%80%93-partea-a-doua/#postcomment'>Adaugă un comentariu!</a>]]></content:encoded>
			<wfw:commentRss>http://www.iamntz.com/2521/frontend-developer/node-js-introducere-%e2%80%93-partea-a-doua/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Node.js Introducere &#8211; Thread-uri vs Evenimente</title>
		<link>http://www.iamntz.com/2436/frontend-developer/node-js-introducere-partea-intai/?utm_source=subscriber&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://www.iamntz.com/2436/frontend-developer/node-js-introducere-partea-intai/#comments</comments>
		<pubDate>Sun, 02 Oct 2011 17:22:30 +0000</pubDate>
		<dc:creator>Eugen Tudorancea</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[guest post]]></category>
		<category><![CDATA[Node.js]]></category>

		<guid isPermaLink="false">http://www.iamntz.com/?p=2436</guid>
		<description><![CDATA[Într-un sistem complex, interacțiunea și colaborarea dintre componentele sistemului prezintă principalele structuri când este vorba de efciența. Web-ul (Internetul) este un sistem (global) complex de rețele, servere interconectate care folosesc un protocol (set de reguli) standard, TCP/IP. O persoană care utilizează un Browser comunică cu serverele printr-un alt protocol standard, HTTP. Datorită evoluției rapide a [...]
	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/2436/frontend-developer/node-js-introducere-partea-intai/'>Node.js Introducere &#8211; Thread-uri vs Evenimente</a>. <br/>
	<a href='http://www.iamntz.com/2436/frontend-developer/node-js-introducere-partea-intai/#postcomment'>Adaugă un comentariu!</a>]]></description>
			<content:encoded><![CDATA[<p><img src="http://content.iamntz.com/wp-content/uploads/2011/10/node-js1-e1317577746142.jpg" alt="" width="200" height="86" class="alignright size-full wp-image-2498" />Într-un sistem complex, interacțiunea și colaborarea dintre componentele sistemului prezintă principalele structuri când este vorba de efciența. Web-ul (Internetul) este un sistem (global) complex de rețele, servere interconectate care folosesc un protocol (set de reguli) standard, TCP/IP. O persoană care utilizează un Browser comunică cu serverele printr-un alt protocol standard, HTTP.</p>
<p>Datorită evoluției rapide a web-ului și dorinței de comunicare în timp real, serverele HTTP sunt nevoite să evolueze. O soluție eficientă pentru îmbunătățirea comunicării (interacțiunii) dintre utilizator și server o prezintă <a href="http://nodejs.org">Node.js</a> &#8211; evented I/O bazat pe V8 &#8211; JavaScript engine-ul de la Google.</p>
<h4>Thread vs Evented</h4>
<p>Să luăm un exemplu: 3 persoane se conectează simultan la www.paginata.ro</p>
<p>Site-ul este hostat pe un server cu Apache2, PHP, Linux (LAMP).</p>
<p>Serverul HTTP (Apache2) preia conexiunile și deschide un thread pentru fiecare conexiune. Fiecare thread va rula o instanță a fișierului index.php, îl va evalua integral, de sus până jos (synchronous).<span id="more-2436"></span></p>
<p>Acum partea importantă: un core al unui CPU nu poate rula mai mult de o instrucțiune odată, pur și simplu așa sunt proiectate. Deci core-ul unui CPU nu poate rula simultan instrucțiunile celor 3 instanțe ale fișierului index.php. Aici intervin thread-urile care împart instrucțiunile fișierelor în diviziuni de timp, ce vor fi procesate de un core.</p>
<p>Imaginați-vă 3 dame sofisticate care vor să scrie o carte, fiecare la aceeași mașină de scris. Simultan nu pot, dar împărțind paginile în diviziuni de timp, fiecare reușește să scrie câteva pagini, apoi cedează rândul și tot așa până se termină dactilografierea cărților.</p>
<p>Thread-urile prezintă o soluție deficitară pt. web, nu o să întru în detalii, cine este interesat poate citi: <a href="http://mmcgrana.github.com/2010/07/threaded-vs-evented-servers.html">Threaded vs Evented Servers</a>.</p>
<p>Reluăm exemplul: 3 persoane se conectează simultan la www.paginata.ro<br />
Site-ul este hostat pe un server cu Node.js, Linux.</p>
<p>Serverul HTTP (Node.js) preia conexiunile și inițiază un eveniment (ex: &#8220;connected&#8221;) pt. fiecare conexiune, pe rând. Fiecare eveniment inițiază o serie de evenimente (asynchronous).</p>
<p>Pentru că un core (CPU) nu poate rula decât o instrucțiune odată, în orice moment din timp, un singur eveniment este procesat (dintr-o serie de evenimente).</p>
<p>Programarea evented (asynchronous) are un loop principal (Event loop) și prezintă 2 componente, detectarea evenimentelor (event detection) și manipularea evenimentelor (event handlers).</p>
<p>Browser-ele sunt Evented, prin urmare au un loop principal pt. detectarea evenimentelor. De aceea întâlnim sintaxa: onClick( afiseazaCeva ). Loop-ul principal detectează evenimentul &#8220;click&#8221; și rulează funcția &#8220;afiseazaCeva&#8221;, care este un event handler (callback).</p>
<p>NGINX™ si lighthttpd sunt event based ceea ce le face sa fie mult mai performante ca Apache2.</p>
<h4>De ce Node.js?</h4>
<p><strong>1. JavaScript</strong><br />
Dacă vrei să scrii aplicații pt. web, inevitabil trebuie să înveți JavaScript și programarea pe evenimente. Datorită V8-ului JavaScript-ul pe server este o bestie!</p>
<p>Engine-ul V8 implementează ECMAScript (ECMA-262, 5th edition) (în prezent) este cel rapid VM pt. JavaScript (folosit și în Google Chrome).</p>
<p>Cei care sunt interesați să <em><strong>învețe</strong></em> JavaScript recomand:<br />
<a href="http://www.amazon.co.uk/gp/product/0596805527/ref=as_li_ss_tl?ie=UTF8&amp;tag=staiionu-21&amp;linkCode=as2&amp;camp=1634&amp;creative=19450&amp;creativeASIN=0596805527">JavaScript the Definitive Guide </a>(a 6-a ediție) apoi <a href="http://www.amazon.co.uk/gp/product/0596517742/ref=as_li_ss_tl?ie=UTF8&amp;tag=staiionu-21&amp;linkCode=as2&amp;camp=1634&amp;creative=19450&amp;creativeASIN=0596517742">JavaScript the Good Parts</a></p>
<p>2. <strong>Comunitatea</strong><br />
Proiectul are jur de 2 ani și jumătate și are 3000+ de module scrise. Nu toate sunt excelente, dar sunt open-source și poți să faci cam orice ai avea nevoie, chiar dacă vrei să-ți aprinzi lumina din cameră (serios vb).</p>
<p>3. <strong>Modulele / librăriile și <a href="http://npmjs.org/" target="_blank">NPM (Node.js Package Manager)</a></strong></p>
<p>Un lucru <a href="http://wiki.commonjs.org/wiki/CommonJS" target="_blank">foarte important</a> pe care comunitatea a reușit să-l facă, este să creeze <a href="http://wiki.commonjs.org/wiki/CommonJS" target="_blank">standarde</a>. Cât de importante sunt standardele?! Limbajul este un standard, scrisul este un standard; nu am fi evoluat niciodată dacă nu reuşeam să ne conformăm unor seturi de reguli acceptate în comunitate.</p>
<p>Mai sunt și alte lucruri importante dar ar fi articolul prea lung să le trec pe toate.</p>
<p><strong>Urmează: Synchronous (Blocking) și Asynchronous (Non-Blocking)</strong></p>

	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/2436/frontend-developer/node-js-introducere-partea-intai/'>Node.js Introducere &#8211; Thread-uri vs Evenimente</a>. <br/>
	<a href='http://www.iamntz.com/2436/frontend-developer/node-js-introducere-partea-intai/#postcomment'>Adaugă un comentariu!</a>]]></content:encoded>
			<wfw:commentRss>http://www.iamntz.com/2436/frontend-developer/node-js-introducere-partea-intai/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>jQuery vs window.setInterval vs requestAnimationFrame</title>
		<link>http://www.iamntz.com/2206/frontend-developer/jquery-vs-window-setinterval-vs-requestanimationframe/?utm_source=subscriber&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://www.iamntz.com/2206/frontend-developer/jquery-vs-window-setinterval-vs-requestanimationframe/#comments</comments>
		<pubDate>Sat, 06 Aug 2011 05:28:35 +0000</pubDate>
		<dc:creator>Staicu Ionuț-Bogdan</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.iamntz.com/?p=2206</guid>
		<description><![CDATA[Ieri am avut deosebita plăcere să constant că am o problemă la ultimele 14 site-uri la care am lucrat și am folosit window.setInterval. Problema zice așa: dacă setez un timer să facă ceva (în cazul meu o animație) și schimb tabul, după câteva secunde timerul meu o cam ia razna. Iar problema asta se întâmplă [...]
	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/2206/frontend-developer/jquery-vs-window-setinterval-vs-requestanimationframe/'>jQuery vs window.setInterval vs requestAnimationFrame</a>. <br/>
	<a href='http://www.iamntz.com/2206/frontend-developer/jquery-vs-window-setinterval-vs-requestanimationframe/#postcomment'>Adaugă un comentariu!</a>]]></description>
			<content:encoded><![CDATA[<p>Ieri am avut deosebita plăcere să constant că am o problemă la ultimele 14 site-uri la care am lucrat și am folosit <code>window.setInterval</code>. Problema zice așa: dacă setez un timer să facă ceva (în cazul meu o animație) și schimb tabul, după câteva secunde timerul meu o cam ia razna. Iar problema asta se întâmplă fix în toate browserele ce suportă <code>requestAnimationFrame</code>.</p>
<p>Problema este că prin utlimele versiuni de jQuery a apărut următorul cod:<span id="more-2206"></span></p>
<p><script src="https://gist.github.com/1129043.js?file=gistfile1.js"></script></p>
<p>Iar <code>requestAnimationFrame</code> pare că funcționează ușor diferit, mai ales în momentul în care se schimbă tabul activ.</p>
<h3>Soluția</h3>
<p>După ce am încercat inclusiv tămâia și aghiazma, am zis să încerc următoarele chestii:</p>
<pre class="brush: jscript; title: ; notranslate">
slide.filter(function(){ return !$(this).is(':animated'); }).animate({ // http://goo.gl/ycCiz
//some awesome animation
});
</pre>
<p>Merge. Doar că toată povestea aia din filter nu prea îmi place. Prea mare cârnatu&#8217;, iar pseudoselectorii de genul <code>:animated</code> pot fi destul de lenți câteodată. Și am încercat și <code>stop()</code>:</p>
<pre class="brush: jscript; title: ; notranslate">
slide.stop(1,1).animate({ // http://goo.gl/TFRbF
//same awesome animation
});
</pre>
<p>Merge și asta fără probleme. </p>
<p><a href="http://hacks.mozilla.org/2011/08/animating-with-javascript-from-setinterval-to-requestanimationframe/">Aici</a> găsești o explicație mai detaliată a problemei.</p>

	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/2206/frontend-developer/jquery-vs-window-setinterval-vs-requestanimationframe/'>jQuery vs window.setInterval vs requestAnimationFrame</a>. <br/>
	<a href='http://www.iamntz.com/2206/frontend-developer/jquery-vs-window-setinterval-vs-requestanimationframe/#postcomment'>Adaugă un comentariu!</a>]]></content:encoded>
			<wfw:commentRss>http://www.iamntz.com/2206/frontend-developer/jquery-vs-window-setinterval-vs-requestanimationframe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Parametri opționali în funcțiile JavaScript</title>
		<link>http://www.iamntz.com/1977/frontend-developer/parametri-optionali-in-functiile-javascript/?utm_source=subscriber&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://www.iamntz.com/1977/frontend-developer/parametri-optionali-in-functiile-javascript/#comments</comments>
		<pubDate>Tue, 07 Jun 2011 04:41:04 +0000</pubDate>
		<dc:creator>Staicu Ionuț-Bogdan</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.iamntz.com/?p=1977</guid>
		<description><![CDATA[Înainte să fac front end am încercat &#8211; printre altele &#8211; și PHP. Prin urmare, când am început cu , mi-a fost relativ ușor să înțeleg sintaxa. Ce nu am înțeles pe moment au fost funcțiile. Dacă în PHP puteam face: În JS nu știam nici o modalitate de a pune o valoare implicită pentru [...]
	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/1977/frontend-developer/parametri-optionali-in-functiile-javascript/'>Parametri opționali în funcțiile JavaScript</a>. <br/>
	<a href='http://www.iamntz.com/1977/frontend-developer/parametri-optionali-in-functiile-javascript/#postcomment'>Adaugă un comentariu!</a>]]></description>
			<content:encoded><![CDATA[<p>Înainte să fac front end am încercat &#8211; printre altele &#8211; și PHP. Prin urmare, când am început cu <acronym title="Javascript - http://w3.org">JS</acronym>, mi-a fost relativ ușor să înțeleg sintaxa. Ce nu am înțeles pe moment au fost funcțiile. Dacă în PHP puteam face:</p>
<pre class="brush: php; title: ; notranslate">
function foo($bar = 0){ // dacă nu este specificată nici o valoare, $bar are valoarea 0

}
</pre>
<p>În JS nu știam nici o modalitate de a pune o valoare implicită pentru parametri trimiși funcțiilor. Cu toate astea, soluția este destul de simplă:</p>
<pre class="brush: jscript; title: ; notranslate">
function foo(bar){
var bar = bar || 0;

}
</pre>
<h3>Mai mulți parametri</h3>
<p>Ok, dacă am stabilit cum să setăm o valoare implicită, hai să vedem cum facem dacă avem mai mulți parametri.</p>
<p>Soluția clasică ar fi:<span id="more-1977"></span></p>
<pre class="brush: jscript; title: ; notranslate">
function foo(a, b, c, d, e, f, g, h){

}
</pre>
<p>Merge, e ok, toată lumea e fericită. Dar&#8230; poți uita repede ce reprezintă fiecare parametru și mai ales ORDINEA lor, astfel încât folosirea unei funcții după câteva zile poate fi destul de problematică.</p>
<p>Dacă folosești jQuery, poți abuza liniștit de <a href="http://api.jquery.com/jQuery.extend/"><code>jQuery.extend()</code></a>. În loc să trimiți un șir aiurea de argumente, faci frumușel un obiect și&#8230;</p>
<pre class="brush: jscript; title: ; notranslate">
var params = {
	currency:	'euro',
	price	:	200
};
foo(params);

function foo(params) {
	var o = { // o is for options
		currency:	'USD',
		price	:	0,
		default_param	:	'bar'
	}
	$.extend(o, params);

	console.dir(o);

}
</pre>
<p>Acum nu mai contează în ce ordine specifici argumentele. Simplu, nu?</p>

	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/1977/frontend-developer/parametri-optionali-in-functiile-javascript/'>Parametri opționali în funcțiile JavaScript</a>. <br/>
	<a href='http://www.iamntz.com/1977/frontend-developer/parametri-optionali-in-functiile-javascript/#postcomment'>Adaugă un comentariu!</a>]]></content:encoded>
			<wfw:commentRss>http://www.iamntz.com/1977/frontend-developer/parametri-optionali-in-functiile-javascript/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>input type=&#8221;placeholder&#8221; v.2</title>
		<link>http://www.iamntz.com/1841/frontend-developer/input-typeplaceholder-v-2/?utm_source=subscriber&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://www.iamntz.com/1841/frontend-developer/input-typeplaceholder-v-2/#comments</comments>
		<pubDate>Mon, 02 May 2011 15:10:20 +0000</pubDate>
		<dc:creator>Staicu Ionuț-Bogdan</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[ie9sucks]]></category>

		<guid isPermaLink="false">http://www.iamntz.com/?p=1841</guid>
		<description><![CDATA[În urmă cu ceva timp am postat un cod ce activa atributul placeholder și pe browsere mai vechi. Tot folosind scriptul în diverse proiecte am observat (și reparat) mici probleme. Iată o versiune actualizată cu următoarele modificări: Am adăugat clasa placeholder pentru elemente. Astfel, poți stiliza diferit respectivul element în funcție de ce conține (valoare [...]
	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/1841/frontend-developer/input-typeplaceholder-v-2/'>input type=&#8221;placeholder&#8221; v.2</a>. <br/>
	<a href='http://www.iamntz.com/1841/frontend-developer/input-typeplaceholder-v-2/#postcomment'>Adaugă un comentariu!</a>]]></description>
			<content:encoded><![CDATA[<p>În urmă cu ceva timp am postat <a href="http://www.iamntz.com/1502/frontend-developer/input-placeholder/">un cod</a> ce activa atributul <code>placeholder</code> și pe browsere mai vechi. Tot folosind scriptul în diverse proiecte am observat (și reparat) mici probleme. Iată o versiune actualizată cu următoarele modificări:</p>
<ol>
<li>Am adăugat clasa <code>placeholder</code> pentru elemente. Astfel, poți stiliza diferit respectivul element în funcție de ce conține (valoare legitimă sau placeholder);</li>
<li>Am adăugat un <em>container</em>, ce-ți permite să activezi suportul pentru <code>placeholder</code> și pentru elementele injectate în <acronym title="Document Object Model - http://w3.org">DOM</acronym> (sau doar pentru anumite elemente; exemplu: <code>enablePlaceholderSupport('#header')</code>). Dacă nu e specificat niciun container, <code>placeholder</code> este activat pentru toate elementele din <code>body</code>;</li>
<li>Am îmbunătățit modul în care se afișează atributele <code>value</code> vs <code>placeholder</code>;</li>
<li>Și cred că atât.</li>
</ol>
<p>Enjoy! <span id="more-1841"></span></p>
<pre class="brush: jscript; title: ; notranslate">
function enablePlaceholderSupport(wrap){
	var $ = jQuery,
			wrap = wrap || 'body',
			fakeInput = document.createElement(&quot;input&quot;),
			placeHolderSupport = (&quot;placeholder&quot; in fakeInput),
			clearValue = function (e) { if ($(e).val() === $(e).data('placeholder')) { $(e).val(''); } };

	if (!placeHolderSupport) {
		$('input[placeholder]', wrap).each(function(){

			var searchField = $(this),
					originalText = searchField.attr('placeholder'),
					val = $.trim(this.value);
			if(typeof searchField.data('placeholder') !== 'undefined') { return; }

			searchField.data('placeholder', originalText);
			if(val == '') { $(this).val(originalText).addClass(&quot;placeholder&quot;); }

			searchField.bind(&quot;focus.ntz_placeholder&quot;, function () { if(this.value == $(this).data('placeholder')){ $(this).val('').removeClass('placeholder'); } }).bind(&quot;blur.ntz_placeholder&quot;, function () {
				if (this.value.length === 0) {
					$(this).val(originalText).addClass(&quot;placeholder&quot;);
				}
			});
		});

		$(&quot;form&quot;).bind(&quot;submit.ntz_placeholder&quot;, function () { $('input[placeholder]', this).each(function(){ clearValue(this); });	});

		$(window).bind(&quot;unload.ntz_placeholder&quot;, function () { clearValue($('input[placeholder]', this)); });
	}
}

jQuery(document).ready(function($){ enablePlaceholderSupport(); });
</pre>
<p><a href="https://gist.github.com/c8e3d2577c9e95fc48e1">Aici</a> este varianta minified.</p>

	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/1841/frontend-developer/input-typeplaceholder-v-2/'>input type=&#8221;placeholder&#8221; v.2</a>. <br/>
	<a href='http://www.iamntz.com/1841/frontend-developer/input-typeplaceholder-v-2/#postcomment'>Adaugă un comentariu!</a>]]></content:encoded>
			<wfw:commentRss>http://www.iamntz.com/1841/frontend-developer/input-typeplaceholder-v-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>jQuery Lightbox</title>
		<link>http://www.iamntz.com/1828/frontend-developer/jquery-lightbox/?utm_source=subscriber&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://www.iamntz.com/1828/frontend-developer/jquery-lightbox/#comments</comments>
		<pubDate>Thu, 28 Apr 2011 05:40:12 +0000</pubDate>
		<dc:creator>Staicu Ionuț-Bogdan</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Lighbox]]></category>
		<category><![CDATA[Slimbox]]></category>

		<guid isPermaLink="false">http://www.iamntz.com/?p=1828</guid>
		<description><![CDATA[Chiar dacă unora nu le place „fenomenul” Lightbox, sunt unii clienți care vor așa ceva cu orice preț. La o adică, ce contează un user nemulțumit dacă stăpânul este fericit? Prin urmare, am purces la căutarea unui script suficient de light pentru a se încărca rapid (având în vedere că toți clienții mei nu au [...]
	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/1828/frontend-developer/jquery-lightbox/'>jQuery Lightbox</a>. <br/>
	<a href='http://www.iamntz.com/1828/frontend-developer/jquery-lightbox/#postcomment'>Adaugă un comentariu!</a>]]></description>
			<content:encoded><![CDATA[<p>Chiar dacă <a href="http://37signals.com/svn/posts/592-been-lightboxed-lately">unora nu le place</a> „fenomenul” Lightbox, sunt unii clienți care vor așa ceva cu orice preț. La o adică, ce contează un user nemulțumit dacă stăpânul este fericit? <img src='http://www.iamntz.com/wp-includes/images/smilies/biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Prin urmare, am purces la căutarea unui script suficient de light pentru a se încărca rapid (având în vedere că toți clienții mei nu au conexiuni rapide &#8211; deh, ăsta e dezavantajul de a nu lucra cu români&#8230;) dar cu suficiente opțiuni pentru a satisface și cele mai exigente cerințe. De cele mai multe ori, „cele mai exigente cerințe” înseamnă <em>image sets</em>, deci nu am avut nevoie de mare șmecherie.</p>
<h4>Slimbox 2</h4>
<p>Și am dat peste <a href="http://www.digitalia.be/software/slimbox2">Slimbox</a>. Ultima actualizare e de prin 2010, dar nu-i problemă, pentru că funcționează excelent cu ultima versiune de jQuery.</p>
<h4>Să optimizăm!</h4>
<p>Așa cum am precizat, avem nevoie de viteză. Pagina trebuie să se încarce rapid, iar artificiile mai puțin importante pot aștepta.<span id="more-1828"></span></p>
<p>Prin urmare, toată povestea asta este executată dacă există link-uri spre fișiere imagine, dacă sistemul de operare e suficient de inteligent să nu impună restricții de CSS (cum ar fi <code>position:fixed</code>) și doar după ce s-a terminat pagina de încărcat (DOM ready):</p>
<pre class="brush: jscript; title: ; notranslate">
if (!/android|iphone|ipod|series60|symbian|windows ce|blackberry/i.test(navigator.userAgent)) {
	var links2img = $('a[href$=jpg], a[href$=gif], a[href$=png]');
	if(links2img.length&gt;0){
		if(typeof $.slimbox == 'undefined'){
			$.getScript('js/slimbox2.js', function(){
				links2img.slimbox();
			});
		}else {
			links2img.slimbox();
		}
	}
}
</pre>
<p>Pentru a evita probleme neplăcute (de exemplu încărcarea slimbox de mai multe ori), am inserat și condiția <code>typeof $.slimbox ....</code>.</p>
<h4>OK, și dacă folosesc alt script?</h4>
<p>E o țară liberă, poți folosi orice script dorești. Fie că e Slimbox, Lighbox, *box, toată treaba de mai sus va funcționa. Sigur, va trebui să înlocuiești numele funcției <code>slimbox()</code>, dar în rest va funcționa fără probleme.</p>

	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/1828/frontend-developer/jquery-lightbox/'>jQuery Lightbox</a>. <br/>
	<a href='http://www.iamntz.com/1828/frontend-developer/jquery-lightbox/#postcomment'>Adaugă un comentariu!</a>]]></content:encoded>
			<wfw:commentRss>http://www.iamntz.com/1828/frontend-developer/jquery-lightbox/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>IE7 &amp; IE8 vs. HTML5</title>
		<link>http://www.iamntz.com/1816/frontend-developer/ie7-ie8-vs-html5/?utm_source=subscriber&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://www.iamntz.com/1816/frontend-developer/ie7-ie8-vs-html5/#comments</comments>
		<pubDate>Fri, 15 Apr 2011 17:18:28 +0000</pubDate>
		<dc:creator>Staicu Ionuț-Bogdan</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[DOM Manipulation]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://www.iamntz.com/?p=1816</guid>
		<description><![CDATA[Se știe că, by default, versiunile mai vechi ale Internet Explorer (6, 7, 8 ) nu recunosc nativ tag-urile introduse în HTML 5 (section, article etc). Pentru a rezolva problema asta se apelează la un snippet : Eu prefer să pun toată șmecheria asta direct în head, nu în fișier extern pentru că este destul [...]
	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/1816/frontend-developer/ie7-ie8-vs-html5/'>IE7 &#038; IE8 vs. HTML5</a>. <br/>
	<a href='http://www.iamntz.com/1816/frontend-developer/ie7-ie8-vs-html5/#postcomment'>Adaugă un comentariu!</a>]]></description>
			<content:encoded><![CDATA[<p>Se știe că, by default, versiunile mai vechi ale Internet Explorer (6, 7, 8 ) nu recunosc nativ tag-urile introduse în HTML 5 (<code>section</code>, <code>article</code> etc). Pentru a rezolva problema asta se apelează la un snippet <acronym title="Javascript - http://w3.org">js</acronym>:</p>
<p><!--[if lte IE 8 ]> <script type="text/javascript" charset="utf-8"> /* <![CDATA[ */ var htmlForIe = ["abbr" ,"article" ,"aside" ,"audio" ,"canvas" ,"details" ,"figcaption" ,"figure" ,"footer" ,"header" ,"hgroup" ,"mark" ,"meter" ,"nav" ,"output" ,"progress" ,"section" ,"summary" ,"time" ,"video"], htmlForIeLen = htmlForIe.length; for(i=0;i<htmlForIeLen;i++){ document.createElement(htmlForIe[i]); } /* ]]&gt; */ </script> <![endif]--></p>
<p>Eu prefer să pun toată șmecheria asta direct în <code>head</code>, nu în fișier extern pentru că este destul de mic și nu <em>se</em> merită să blochez încărcarea paginii cu un request razna. Cu toată povestea asta de mai sus se rezolvă pagina curentă. DAR&#8230;<span id="more-1816"></span></p>
<h4>Ce se întâmplă dacă adaugi elemente în DOM cu js?</h4>
<p><em>Ex: încarci o parte dintr-o pagină cu <acronym title="Asynchronous JavaScript + XML  - http://w3.org">AJAX</acronym>?</em></p>
<p>Evident, IE ne-o trage masiv. Și ce am învățat despre HTML acum zece ani se aplică: atunci când browserul nu recunoaște un tag îl ignoră (de cele mai multe ori asta înseamnă că nu i se afișează conținutul).</p>
<h4>Cum se rezolvă?</h4>
<p>Dacă scriptul prezentat anterior se numește <a href="https://github.com/craigbarnes/html5-shiv">HTML 5 Shiv</a> (ușor modificat, but still), rezolvarea vine cu&#8230; <a href="http://jdbartlett.github.com/innershiv/">innerShiv</a>. Nu mă interesează cum se comportă cu alte librării (sau chiar fără), dar cu jQuery treaba stă în felul următor:</p>
<pre class="brush: jscript; title: ; notranslate">
$.get('html5test.html', function(data){ // html5test.html este un fișier ce conține diverse tag-uri html... 5
    if($.browser.msie &amp;&amp; $.browser.version &lt; 9){
        $(innerShiv(data, false)).appendTo('body');
    }else {
        $(data).appendTo('body');
    }
});
</pre>
<p>Și&#8230; Cam atât. <img src='http://www.iamntz.com/wp-includes/images/smilies/smile.gif' alt=':)' class='wp-smiley' /> </p>

	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/1816/frontend-developer/ie7-ie8-vs-html5/'>IE7 &#038; IE8 vs. HTML5</a>. <br/>
	<a href='http://www.iamntz.com/1816/frontend-developer/ie7-ie8-vs-html5/#postcomment'>Adaugă un comentariu!</a>]]></content:encoded>
			<wfw:commentRss>http://www.iamntz.com/1816/frontend-developer/ie7-ie8-vs-html5/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>input placeholder</title>
		<link>http://www.iamntz.com/1502/frontend-developer/input-placeholder/?utm_source=subscriber&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://www.iamntz.com/1502/frontend-developer/input-placeholder/#comments</comments>
		<pubDate>Fri, 18 Feb 2011 05:29:55 +0000</pubDate>
		<dc:creator>Staicu Ionuț-Bogdan</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[ie9suck]]></category>

		<guid isPermaLink="false">http://www.iamntz.com/?p=1502</guid>
		<description><![CDATA[Una din treburile bune introduse de HTML5 este atributul placeholder pentru input-uri. Long story short, afișezi un soi de label în interiorul unui input sau textarea. Sigur, browserele vechi (sau alea de căcat, să includem și IE9) nu știu să afișeze chestii d&#8217;astea exotice. Prin urmare, este nevoie de un mic script js. Tot cârnatul [...]
	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/1502/frontend-developer/input-placeholder/'>input placeholder</a>. <br/>
	<a href='http://www.iamntz.com/1502/frontend-developer/input-placeholder/#postcomment'>Adaugă un comentariu!</a>]]></description>
			<content:encoded><![CDATA[<p>Una din treburile bune introduse de HTML5 este atributul <code>placeholder</code> pentru <code>input</code>-uri. <a href="http://diveintohtml5.org/forms.html">Long story short</a>, afișezi un soi de <code>label</code> în interiorul unui <code>input</code> sau <code>textarea</code>. Sigur, browserele vechi (sau alea de căcat, să includem și IE9) nu știu să afișeze chestii d&#8217;astea exotice. Prin urmare, este nevoie de un mic script <code>js</code>. </p>
<p>Tot cârnatul ăsta este o adaptare a unui alt cârnat găsit cu ceva timp în urmă, pentru care am adăugat suport pentru <code>textarea</code> și am eliminat <code>input type="file"</code> din ecuație deoarece trântește erori de securitate.<span id="more-1502"></span></p>
<pre class="brush: jscript; title: ; notranslate">
var fakeInput = document.createElement(&quot;input&quot;),
		placeHolderSupport = (&quot;placeholder&quot; in fakeInput),
		clearValue = function (e) {
			if ($(e).val() === $(e).data('placeholder')) {
				$(e).val('');
			}
		};
if (!placeHolderSupport) {
	$('input[placeholder], textarea[placeholder]').each(function(){
		var searchField = $(this),
				originalText = searchField.attr('placeholder'),
				val = this.value;
		if(this.type.toLowerCase()=='file') {return ;}
		searchField.data('placeholder', originalText);

		if(val == '') { this.value = originalText; }else {
			searchField.addClass(&quot;placeholder&quot;)
		}

		searchField.bind(&quot;focus blur&quot;, function (e) {
			var t = this;
			switch(e.type){
				case &quot;blur&quot;:
				default:
					if (t.value.length === 0) { $(t).val(originalText).addClass(&quot;placeholder&quot;); }
				break;
				case &quot;focus&quot;:
					if(t.value == originalText ) {t.value = '';}
				break;
			}
		});
	});

	$(&quot;form&quot;).bind(&quot;submit&quot;, function () {
		clearValue($('input[placeholder]', this));
	});

	$(window).bind(&quot;unload&quot;, function () {
		clearValue($('input[placeholder]', this));
	});
}
</pre>
<p>Varianta minified este <a href="https://gist.github.com/833295">aici</a>.</p>

	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/1502/frontend-developer/input-placeholder/'>input placeholder</a>. <br/>
	<a href='http://www.iamntz.com/1502/frontend-developer/input-placeholder/#postcomment'>Adaugă un comentariu!</a>]]></content:encoded>
			<wfw:commentRss>http://www.iamntz.com/1502/frontend-developer/input-placeholder/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

