<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;D0YFQHw7eSp7ImA9WhBaFkU.&quot;"><id>tag:blogger.com,1999:blog-9211347223120402317</id><updated>2013-05-27T21:05:11.201+01:00</updated><category term="jquery" /><category term="url" /><category term="dom" /><category term="feature" /><category term="webkit" /><category term="javascript" /><category term="google maps" /><category term="javascript tips" /><category term="html5" /><category term="tips" /><category term="nodejs" /><category term="placeholder" /><category term="api" /><category term="gecko" /><category term="wc3" /><category term="npm" /><category term="tuenti" /><title>yeikos</title><subtitle type="html">Desarrollo Web y programación en general.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.yeikos.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.yeikos.com/" /><author><name>yeikos grayhat</name><uri>https://plus.google.com/118329424965123371259</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-xmiH1NogZow/AAAAAAAAAAI/AAAAAAAAAd8/BIaTWvlNzRk/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Yeikos" /><feedburner:info uri="yeikos" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;Ck8AQ3Y4cSp7ImA9WhBUGEg.&quot;"><id>tag:blogger.com,1999:blog-9211347223120402317.post-8046552282207723305</id><published>2013-05-06T15:27:00.001+01:00</published><updated>2013-05-06T15:34:02.839+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-06T15:34:02.839+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="nodejs" /><title>JavaScript/NodeJS Merge: combinando objetos</title><content type="html">JavaScript/NodeJS Merge es una función para mezclar múltiples objetos en uno solo, con la posibilidad de crear un nuevo objeto clonado. Su funcionamiento es muy similar a la función &lt;a href="http://api.jquery.com/jQuery.extend/" target="_blank"&gt;jQuery.extend&lt;/a&gt;&amp;nbsp;pero con una serie de ventajas:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Más flexible, pudiendo introducir argumentos que no sean objetos planos (son ignorados).&lt;/li&gt;
&lt;li&gt;Compatible con NodeJS (npm install merge).&lt;/li&gt;
&lt;li&gt;Compatible con JavaScript desde el navegador (&lt;a href="http://yeikos.googlecode.com/files/merge.js" target="_blank"&gt;http://yeikos.googlecode.com/files/merge.js&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
El repositorio del código se encuentra en:&amp;nbsp;&lt;a href="https://github.com/yeikos/js.merge" target="_blank"&gt;https://github.com/yeikos/js.merge&lt;/a&gt;, junto a una breve documentación con ejemplos y unas pruebas unitarias.&lt;br /&gt;
&lt;div style="clear: both;"&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/Yeikos/~4/Kvvq7usCWIQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.yeikos.com/feeds/8046552282207723305/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.yeikos.com/2013/05/javscript-nodejs-combinar-mezclar-extender-objetos.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/8046552282207723305?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/8046552282207723305?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Yeikos/~3/Kvvq7usCWIQ/javscript-nodejs-combinar-mezclar-extender-objetos.html" title="JavaScript/NodeJS Merge: combinando objetos" /><author><name>yeikos grayhat</name><uri>https://plus.google.com/118329424965123371259</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-xmiH1NogZow/AAAAAAAAAAI/AAAAAAAAAd8/BIaTWvlNzRk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.yeikos.com/2013/05/javscript-nodejs-combinar-mezclar-extender-objetos.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08MRXgyfSp7ImA9WhBXEkk.&quot;"><id>tag:blogger.com,1999:blog-9211347223120402317.post-7806720605851326292</id><published>2013-01-15T01:25:00.000Z</published><updated>2013-03-25T20:04:44.695Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-25T20:04:44.695Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript tips" /><title>JavaScript tips: cadena aleatoria</title><content type="html">&lt;script src="https://gist.github.com/4535183.js"&gt;&lt;/script&gt;&lt;img src="http://feeds.feedburner.com/~r/Yeikos/~4/aotcRxLClvU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.yeikos.com/feeds/7806720605851326292/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.yeikos.com/2013/01/javascript-tips-cadena-aleatoria.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/7806720605851326292?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/7806720605851326292?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Yeikos/~3/aotcRxLClvU/javascript-tips-cadena-aleatoria.html" title="JavaScript tips: cadena aleatoria" /><author><name>yeikos grayhat</name><uri>https://plus.google.com/118329424965123371259</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-xmiH1NogZow/AAAAAAAAAAI/AAAAAAAAAd8/BIaTWvlNzRk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.yeikos.com/2013/01/javascript-tips-cadena-aleatoria.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MMQ34zcSp7ImA9WhNUGUs.&quot;"><id>tag:blogger.com,1999:blog-9211347223120402317.post-3286665123571545660</id><published>2013-01-12T03:27:00.001Z</published><updated>2013-01-12T03:31:22.089Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-12T03:31:22.089Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="javascript tips" /><title>Revitalizando la creación de instancias en JavaScript</title><content type="html">Lo que hoy os traigo es un modelo de código a seguir para revitalizar la creación de instancias en JavaScript. Entre sus características más destacadas tenemos:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;No es necesario el uso del operador &lt;i&gt;new &lt;/i&gt;para la creación de una instancia.&lt;/li&gt;
&lt;li&gt;Prescindiendo del operador &lt;i&gt;new &lt;/i&gt;para la creación de la instancia, podemos pasar una lista de argumentos en forma de matriz al constructor.&lt;/li&gt;
&lt;li&gt;Es posible interactuar con la instancia antes de que se llame al constructor original.&lt;/li&gt;
&lt;/ul&gt;
Todo ello se traduce en una ligera comodidad a la hora de escribir, reducción de código y más flexibilidad antes y durante la creación de la instancia.&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
Os preguntareis qué tiene de especial el poder interactuar con la instancia antes de que se llame al constructor original. Muy sencillo, esta funcionalidad nos permitirá, entre otras cosas, crear otra instancia durante la creación de una instancia, y todo ello dentro del mismo constructor. A groso modo, sin las medidas adecuadas, realizar lo anterior nos llevaría a un bucle infinito.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
La solución &lt;i&gt;sucia &lt;/i&gt;a lo anterior sería pasarle al constructor un argumento especial que sirva de marcador para que no siga creando otra instancia cada vez que se llame al constructor. Digo &lt;i&gt;sucia&lt;/i&gt;, porque no podemos garantizar que se introduzca, por accidente, tal argumento especial en el constructor, ofreciéndonos resultados no esperados.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Lo correcto, a resumidas cuentas, es preparar una nueva clase y asignarle el prototipo original, de este modo podemos crear instancias sin que éstas hayan tenido que pasar por su constructor original. Llegados a este punto podemos interactuar con la instancia y crear un marcador, y a continuación llamar al constructor original de la instancia.&lt;br /&gt;
&lt;br /&gt;
Por último adjunto el código fuente sobre lo comentado anteriormente (Animal.instance).&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;script src="https://gist.github.com/4515882.js"&gt;&lt;/script&gt;&lt;img src="http://feeds.feedburner.com/~r/Yeikos/~4/Qc5LtDsR__U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.yeikos.com/feeds/3286665123571545660/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.yeikos.com/2013/01/revitalizando-instancias-javascript.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/3286665123571545660?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/3286665123571545660?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Yeikos/~3/Qc5LtDsR__U/revitalizando-instancias-javascript.html" title="Revitalizando la creación de instancias en JavaScript" /><author><name>yeikos grayhat</name><uri>https://plus.google.com/118329424965123371259</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-xmiH1NogZow/AAAAAAAAAAI/AAAAAAAAAd8/BIaTWvlNzRk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.yeikos.com/2013/01/revitalizando-instancias-javascript.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0ICSXo-fyp7ImA9WhNbFEw.&quot;"><id>tag:blogger.com,1999:blog-9211347223120402317.post-7196576963523801118</id><published>2013-01-07T15:17:00.000Z</published><updated>2013-01-17T10:46:08.457Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-17T10:46:08.457Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="url" /><category scheme="http://www.blogger.com/atom/ns#" term="nodejs" /><title>JavaScript/NodeJS URL parser: Analizador de URL - Actualizado 17/01/13</title><content type="html">Bien es sabido lo tedioso que puede resultar lidiar con las direcciones URL, especialmente en JavaScript, que no posee ninguna función de ayuda robusta para manipularlas, cosa que si sucede en algunas de sus derivadas como&amp;nbsp;NodeJS con su módulo &lt;a href="http://nodejs.org/api/url.html" target="_blank"&gt;url&lt;/a&gt;, aunque en este caso, la solución que traigo pueda ser más potente que la que ofrece NodeJS.&lt;br /&gt;
&lt;br /&gt;
Las distintas alternativas disponibles para JavaScript no me han parecido suficientemente potentes y ello me llevó a desarrollar&amp;nbsp;este analizador de URL, o también&amp;nbsp;conocido como URL parser.&lt;br /&gt;
&lt;br /&gt;
Cuidado al detalle, con numerosas funcionalidades, siguiendo al dedillo la normativa &lt;a href="http://tools.ietf.org/html/rfc3986" target="_blank"&gt;RFC3986&lt;/a&gt;&amp;nbsp;que dicta la&amp;nbsp;sintaxis&amp;nbsp;general de los identificadores uniformes de recursos (&lt;a href="http://es.wikipedia.org/wiki/Uniform_Resource_Identifier" target="_blank"&gt;URI&lt;/a&gt;) y con muchas posibilidades más:&amp;nbsp;JavaScript/NodeJS URL.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Actualizado&lt;/b&gt;: desde la versión inicial, hace poco más de una semana, se han corregido varios fallos, añadido nuevas funcionalidades y optimizado el código. También se ha añadido una ligera documentación en español sobre los métodos de la instancia en esta misma entrada. Para más información sobre los cambios, visite la sección &lt;a href="https://github.com/yeikos/js.url#changelog" target="_blank"&gt;changelog&lt;/a&gt;&amp;nbsp;de la documentación.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: large;"&gt;¿Qué es JavaScript/NodeJS URL?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Es una clase escrita en JavaScript que permite analizar y manipular muy&amp;nbsp;fácilmente&amp;nbsp;una URL. Además, tiene soporte para trabajar sobre NodeJS (&lt;a href="https://npmjs.org/package/kurl" target="_blank"&gt;kurl&lt;/a&gt;), por lo que se convierte en una buena herramienta de trabajo.&lt;br /&gt;
&lt;br /&gt;
JavaScript/NodeJS URL se caracteriza por su manera de analizar las direcciones URL, ya que su misión no es validar la misma como una única entrada entera, sino que primero divine la URL en atributos para luego ir validando y normalizando cada uno de ellos. De esta manera podemos mantener la integridad de la URL a pesar de que haya un atributo erróneo, y así comprobar más tarde si dicho atributo se encuentra vacío o no.&lt;br /&gt;
&lt;br /&gt;
La clase URL cuenta con una suite de herramientas que nos permitirán operar con la dirección a nuestro antojo y con una característica a destacar, llamada localización, lo que nos permitirá formar direcciones completas a partir de una incompleta.&lt;br /&gt;
&lt;br /&gt;
Esto sucede por ejemplo con las carpetas relativas, si un enlace tiene como dirección &lt;i&gt;sublevel.html&lt;/i&gt;&lt;b&gt; &lt;/b&gt;(nótese que no empieza con una barra) y la dirección sobre la que se encuentra el navegador es http://localhost/level&lt;b&gt;/&lt;/b&gt; (nótese la última barra), la dirección resultante será http://localhost/level/sublevel.html.&lt;br /&gt;
&lt;br /&gt;
Lo mismo sucede con direcciones que comienzan con doble barra (//localhost), que que adoptarán el protocolo actual de la página o con las direcciones que comienzan con signo interrogación o almohadilla.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;¿Cómo se utiliza?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Los métodos disponibles se encuentran documentados en el propio repositorio:&amp;nbsp;&lt;a href="https://github.com/yeikos/js.url" target="_blank"&gt;https://github.com/yeikos/js.url&lt;/a&gt;.&amp;nbsp;También hay a vuestra disposición unos &lt;a href="https://github.com/yeikos/js.URL/tree/master/examples" target="_blank"&gt;ejemplos&lt;/a&gt;&amp;nbsp;y una serie de &lt;a href="https://github.com/yeikos/js.URL/blob/master/test/index.html" target="_blank"&gt;pruebas unitarias&lt;/a&gt;, las cuales recomiendo echar un ojo, que os permitirán entender cada uno de los métodos disponibles.&amp;nbsp;Aún así haré un breve resumen sobre su utilización.&lt;br /&gt;
&lt;br /&gt;
La función URL puede recibir dos parámetros: dirección y localización. La primera es simplemente la dirección URL que queremos manejar, y el segundo parámetro es el que se comentó anteriormente. Ambos parámetros pueden ser introducidos en forma de cadena de texto o en forma de objeto de atributos (seguir leyendo).&lt;br /&gt;
&lt;br /&gt;
Las diferentes partes de la dirección URL son clasificadas en atributos, cuyos nombres coinciden en parte con los del objeto &lt;a href="http://www.w3schools.com/jsref/obj_location.asp" target="_blank"&gt;Location&lt;/a&gt;:&amp;nbsp;protocol, auth, host, hostname, port, pathname, search, hash.&lt;br /&gt;
&lt;br /&gt;
Estos atributos pueden ser manipulados mediante el método &lt;i&gt;attr&lt;/i&gt;, cuyo comportamiento es similar al de jQuery. Ademas, durante el establecimiento del valor de un atributo, éste pasará por un proceso de validación y normalización basado en el&amp;nbsp;estándar&amp;nbsp;&lt;a href="http://tools.ietf.org/html/rfc3986" target="_blank"&gt;RFC3986&lt;/a&gt;, y en caso de incumplimiento el valor guardado pasará a ser una cadena vacía. Cada atributo recibe su normalización especial y esta se realiza en segundo plano.&lt;br /&gt;
&lt;br /&gt;
Finalmente la reconstrucción de la URL viene dada con el método &lt;i&gt;href&lt;/i&gt;, que concatenará los atributos adecuadamente para dar como resultado la dirección URL en forma de cadena de texto.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
URL('//www.yeikos.com').attr('pathanme', '/2013/01/javascript-nodejs-url-parser.html').attr({ protocol: 'http' }).href();&lt;/blockquote&gt;
Además también provee una serie de métodos para una manipulación más rápida y exhaustiva de la dirección URL, y de los que se habla a continuación.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Métodos&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
A continuación se detallan los métodos disponibles de la instancia, partiendo de que &lt;i&gt;url &lt;/i&gt;es una instancia de URL ya creada.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;url.location&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Es una instancia URL añadida por el constructor y cuyos atributos serán usados internamente para calcular la dirección en base la la localización.&lt;br /&gt;
&lt;br /&gt;
retorna la instancia de la localización.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;url.href()&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Construye una dirección URL en base a los atributos establecidos.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
retorna una dirección URL como cadena de texto.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;url.href(url)&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
- url: cadena de texto, objeto de atributos o elemento DOM.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Establece una nueva dirección reemplazando todos los atributos.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
retorna la instancia.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;url.attr()&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Obtiene todos los atributos.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
retorna objeto de atributos&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;url.attr(name)&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
- name: nombre del atributo (cadena de texto)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Obtiene el valor del atributo.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
retorna el valor del atributo como cadena de texto.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;url.attr(name, value)&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
- name: nombre de atributo.&lt;/div&gt;
&lt;div&gt;
- value: valor del atributo.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Establece un nuevo valor al atributo.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
retorna la instancia.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;url.attr(object)&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
- object: objeto de atributos.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Establece múltiples valores de atributos.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
retorna la instancia.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;url.search()&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Obtiene el atributo `search` en forma de objeto.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
retorna un objeto.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;url.search(name)&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
- name: nombre del componente.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Obtiene el valor del componente.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
retorna el valor del componente (cadena de texto).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;url.search(name, value)&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
- name: nombre del componente.&lt;/div&gt;
&lt;div&gt;
- value: valor del componente. Si es `null` el componente será eliminado.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Establece un nuevo valor al componente.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
retorna la instancia.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;b&gt;url.hash()&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Obtiene el atributo `hash` en forma de objeto.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
retorna un objeto.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;url.&lt;/b&gt;&lt;b&gt;hash&lt;/b&gt;&lt;b&gt;(name)&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
- name: nombre del componente.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Obtiene el valor del componente.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
retorna el valor del componente (cadena de texto).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;url.&lt;/b&gt;&lt;b&gt;hash&lt;/b&gt;&lt;b&gt;(name, value)&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
- name: nombre del componente.&lt;/div&gt;
&lt;div&gt;
- value: valor del componente. Si es `null` el componente será eliminado.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Establece un nuevo valor al componente.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
retorna la instancia.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;url.isExternal()&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Comprueba si la dirección es externa basándose en la localización definida, y si esta no se encuentra definida, lo determinará comprobando si la dirección es una carpeta o no (si es una carpeta se considerará no externa).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
retorna `true` o `false`.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;url.select(name, name, ...)&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
- name: nombre del atributo.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Construye una dirección URL utilizando solamente los atributos seleccionados.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
retorna la dirección URL (cadena de texto).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;url.unselect(name, name, ...)&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
- name: nombre del atributo.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Construye una dirección URL excluyendo los atributos seleccionados.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
retorna la dirección URL (cadena de texto).&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;url.from(name)&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
- name: nombre del atributo.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Construye una dirección URL empezando desde el atributo seleccionado.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
retorna la dirección URL (cadena de texto).&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;url.to(name)&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
- name: nombre del atributo.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Construye una dirección URL empezando desde el primer atributo hasta el seleccionado.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
retorna la dirección URL (cadena de texto).&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span style="font-size: large;"&gt;Colabora&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Para más información recomiendo que visite la documentación extendida del &lt;a href="https://github.com/yeikos/js.url" target="_blank"&gt;repositorio&lt;/a&gt; y los ejemplos. Y si desea ver todo el potencia de esta suite revise las&amp;nbsp;&lt;a href="https://github.com/yeikos/js.URL/blob/master/test/index.html" target="_blank"&gt;pruebas unitarias&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/Yeikos/~4/BIpH9WY4ohs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.yeikos.com/feeds/7196576963523801118/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.yeikos.com/2013/01/javascript-nodejs-url-parser.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/7196576963523801118?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/7196576963523801118?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Yeikos/~3/BIpH9WY4ohs/javascript-nodejs-url-parser.html" title="JavaScript/NodeJS URL parser: Analizador de URL - Actualizado 17/01/13" /><author><name>yeikos grayhat</name><uri>https://plus.google.com/118329424965123371259</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-xmiH1NogZow/AAAAAAAAAAI/AAAAAAAAAd8/BIaTWvlNzRk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.yeikos.com/2013/01/javascript-nodejs-url-parser.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAASXk_fSp7ImA9WhJRFkQ.&quot;"><id>tag:blogger.com,1999:blog-9211347223120402317.post-8713358494934398436</id><published>2012-07-18T13:06:00.001+01:00</published><updated>2012-07-19T11:29:08.745+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-19T11:29:08.745+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="jquery" /><title>Controlando la ejecución simultánea de los eventos click y focus</title><content type="html">Puede que el título resulte algo confuso, así que trataré de explicarlo detalladamente.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;div&gt;
Tenemos una serie de campos de texto y queremos intervenir el evento &lt;i&gt;focus &lt;/i&gt;y &lt;i&gt;click &lt;/i&gt;de uno de ellos para que realicen una misma acción. El problema llega cuando pulsamos sobre susodicho campo, no&amp;nbsp;encontrándose&amp;nbsp;éste enfocado, lo cual causa la doble ejecución de nuestra acción. Esto se debe a que al pulsar sobre el campo, además de llamar al evento &lt;i&gt;click&lt;/i&gt;, se llama al evento &lt;i&gt;focus&lt;/i&gt;, y este último en primer lugar. Tal escenario lo podéis encontrar en&amp;nbsp;&lt;a href="http://jsfiddle.net/yeikos/F4Ewe/" target="_blank"&gt;http://jsfiddle.net/yeikos/F4Ewe/&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Para controlar la ejecución simultánea de los eventos &lt;i&gt;click &lt;/i&gt;y &lt;i&gt;focus &lt;/i&gt;(ahora sí jeje), podemos implementar una sencilla solución, a la vez que eficaz, y que consiste en intervenir el evento &lt;i&gt;mousedown&lt;/i&gt;, que es llamado antes que &lt;i&gt;focus&lt;/i&gt; y &lt;i&gt;click&lt;/i&gt;, para poder tener cierto control sobre la ejecución.
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
El escenario con la solución ya implementada se encuentra en&amp;nbsp;&lt;a href="http://jsfiddle.net/yeikos/hWkAK/" target="_blank"&gt;http://jsfiddle.net/yeikos/hWkAK/&lt;/a&gt;, y el código fuente de la solución en&amp;nbsp;&lt;a href="https://gist.github.com/3135853" target="_blank"&gt;https://gist.github.com/3135853&lt;/a&gt;.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Yeikos/~4/zRL0UljNk4k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.yeikos.com/feeds/8713358494934398436/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.yeikos.com/2012/07/controlando-la-ejecucion-simultanea-de-los-eventos-click-y-focus.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/8713358494934398436?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/8713358494934398436?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Yeikos/~3/zRL0UljNk4k/controlando-la-ejecucion-simultanea-de-los-eventos-click-y-focus.html" title="Controlando la ejecución simultánea de los eventos click y focus" /><author><name>yeikos grayhat</name><uri>https://plus.google.com/118329424965123371259</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-xmiH1NogZow/AAAAAAAAAAI/AAAAAAAAAd8/BIaTWvlNzRk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.yeikos.com/2012/07/controlando-la-ejecucion-simultanea-de-los-eventos-click-y-focus.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0AMQnsycSp7ImA9WhJTF0w.&quot;"><id>tag:blogger.com,1999:blog-9211347223120402317.post-6294330534561493955</id><published>2012-06-25T22:47:00.001+01:00</published><updated>2012-06-26T12:56:23.599+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-26T12:56:23.599+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="npm" /><category scheme="http://www.blogger.com/atom/ns#" term="nodejs" /><title>NPM: Error, cannot find module</title><content type="html">&lt;a href="http://npmjs.org/" target="_blank"&gt;NPM&lt;/a&gt; (Node Package Manager) es el controlador de paquetes de NodeJS y es utilizado, entre otras muchas cosas, para instalar y publicar librerías&amp;nbsp;(paquetes). Además permite controlar exhaustivamente las dependencias de las&amp;nbsp;librerías para que no haya conflictos.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
El controlador de paquetes al que hacemos mención viene instalado de serie junto a NodeJS, así que no deberemos instalarlo aparte. No posee interfaz gráfica, por lo que tendremos que manejarlo mediante la consola de comandos (npm),&amp;nbsp;sin embargo si posee un &lt;a href="http://search.npmjs.org/" target="_blank"&gt;repositorio web&lt;/a&gt; donde podremos consultar las&amp;nbsp;librerías&amp;nbsp;que han sido publicadas.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;/div&gt;
Uno de los comandos más utilizados en NPM es &lt;i&gt;install&lt;/i&gt;, el cual nos permitirá instalar las librerías que más tarde podremos incluir desde nuestros &lt;i&gt;scripts &lt;/i&gt;a través de la función &lt;a href="http://nodejs.org/docs/latest/api/globals.html#globals_require"&gt;require&lt;/a&gt; de NodeJS. A continuación se muestra un ejemplo que servirá para instalar, en este caso, la librería &lt;a href="http://www.yeikos.com/2011/09/tuenti-api-nodejs.html"&gt;tuenti&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
npm install tuenti&lt;/blockquote&gt;
De esta manera instalaremos dicha&amp;nbsp;librería&amp;nbsp;en la ruta donde nos encontremos (éstas son guardadas dentro de la carpeta &lt;i&gt;/node_modules/&lt;/i&gt; de la ruta actual), por lo que tendrá un ámbito local y tal libreria solamente podrá incluirse si el &lt;i&gt;script &lt;/i&gt;ejecutado se encuentra dentro de esa ruta.&lt;br /&gt;
&lt;br /&gt;
Como es de esperar esto puede acarrear diversos quebraderos de cabeza al querer mantener actualizadas todas nuestras librerias, pues los &lt;i&gt;scripts &lt;/i&gt;pueden encontrarse en carpetas diferentes, utilizando cada uno de ello sus propias&amp;nbsp;librerías, sin ninguna centralización.&lt;br /&gt;
&lt;br /&gt;
Afortunadamente, el comando install de NPM posee un marcador para realizar una instalación bajo un ámbito global, es decir, que todas las instalaciones de librerías que se realicen con dicho marcador irán a parar a una carpeta en común, que forma parte del sistema y ya no será la ruta actual.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
npm install tuenti -g&lt;/blockquote&gt;
Para conocer la carpeta en la que son guardadas todas estás librerias con ámbito global podemos hacer uso del comando prefix y del marcador global.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
npm prefix -g&lt;/blockquote&gt;
Tan solo hay un inconveniente, y es que, al menos en Windows, NodeJS no tiene definida por defecto la carpeta anterior como global para la inclusión de sus librerías mediante &lt;i&gt;require&lt;/i&gt;. Por lo que si intentamos incluir una libreria global obtendremos el siguiente error:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;b&gt;Error: Cannot find module&lt;/b&gt;&lt;/blockquote&gt;
Para solucionarlo deberemos definir la variable del sistema NODE_PATH, dándole el valor de la ruta global de NPM (devuelta anteriormente) y añadiéndole la carpeta &lt;i&gt;\node_modules\&lt;/i&gt; al final.&lt;br /&gt;
&lt;br /&gt;
En Windows 7 la ruta de instalación global de NPM es &lt;i&gt;C:\Users\USER\AppData\Roaming\npm\&lt;/i&gt;, por lo que el valor de NODE_PATH será &lt;i&gt;C:\Users\USER\AppData\Roaming\npm\node_modules\&lt;/i&gt;, o lo que es lo mismo &lt;i&gt;%APPDATA%\npm\node_modules\&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;b&gt;set NODE_PATH=%APPDATA%\npm\node_modules\&lt;/b&gt;&lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/Yeikos/~4/btalU2fUnG8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.yeikos.com/feeds/6294330534561493955/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.yeikos.com/2012/06/npm-error-cannot-find-module.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/6294330534561493955?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/6294330534561493955?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Yeikos/~3/btalU2fUnG8/npm-error-cannot-find-module.html" title="NPM: Error, cannot find module" /><author><name>yeikos grayhat</name><uri>https://plus.google.com/118329424965123371259</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-xmiH1NogZow/AAAAAAAAAAI/AAAAAAAAAd8/BIaTWvlNzRk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.yeikos.com/2012/06/npm-error-cannot-find-module.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04HSX85eSp7ImA9WhVbE0o.&quot;"><id>tag:blogger.com,1999:blog-9211347223120402317.post-5728905916834356201</id><published>2012-05-30T12:04:00.000+01:00</published><updated>2012-05-30T12:05:38.121+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-30T12:05:38.121+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="google maps" /><title>¿Cómo obtener la latitud y longitud en Google Maps?</title><content type="html">&lt;ol&gt;
&lt;li&gt;Dirigirse a la página Web de&amp;nbsp;&lt;a href="https://maps.google.es/" target="_blank"&gt;Google Maps&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Pulsar&amp;nbsp;con el botón derecho del&amp;nbsp;ratón&amp;nbsp;sobre un punto dentro del mapa.&lt;/li&gt;
&lt;li&gt;Seleccionar la opción&amp;nbsp;&lt;i&gt;¿Qué hay aquí? &lt;/i&gt;del menú contextual.&lt;/li&gt;
&lt;li&gt;Las coordenadas geográficas (latitud y longitud respectivamente) quedarán guardadas y visibles en el campo de búsqueda de la misma página.&lt;/li&gt;
&lt;/ol&gt;&lt;img src="http://feeds.feedburner.com/~r/Yeikos/~4/PRoBUGMMN5Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.yeikos.com/feeds/5728905916834356201/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.yeikos.com/2012/05/obtener-latitud-longitud-google-maps.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/5728905916834356201?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/5728905916834356201?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Yeikos/~3/PRoBUGMMN5Y/obtener-latitud-longitud-google-maps.html" title="¿Cómo obtener la latitud y longitud en Google Maps?" /><author><name>yeikos grayhat</name><uri>https://plus.google.com/118329424965123371259</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-xmiH1NogZow/AAAAAAAAAAI/AAAAAAAAAd8/BIaTWvlNzRk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.yeikos.com/2012/05/obtener-latitud-longitud-google-maps.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcGSXgyeip7ImA9WhVbEkg.&quot;"><id>tag:blogger.com,1999:blog-9211347223120402317.post-4159570912192844461</id><published>2012-05-29T01:07:00.000+01:00</published><updated>2012-05-29T01:07:08.692+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-29T01:07:08.692+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="placeholder" /><category scheme="http://www.blogger.com/atom/ns#" term="jquery" /><category scheme="http://www.blogger.com/atom/ns#" term="html5" /><title>jQuery placeholder v1.5.0</title><content type="html">Actualización de jQuery.placeholder v1.5.0.&lt;br /&gt;
&lt;br /&gt;
Ahora más eficiente y un 25% más ligero.&lt;br /&gt;
&lt;br /&gt;
Más información:&amp;nbsp;&lt;a href="http://www.yeikos.com/2011/07/jquery-placeholder.html"&gt;http://www.yeikos.com/2011/07/jquery-placeholder.html&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/Yeikos/~4/VhG_ljUWUh4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.yeikos.com/feeds/4159570912192844461/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.yeikos.com/2012/05/jquery-placeholder-v150.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/4159570912192844461?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/4159570912192844461?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Yeikos/~3/VhG_ljUWUh4/jquery-placeholder-v150.html" title="jQuery placeholder v1.5.0" /><author><name>yeikos grayhat</name><uri>https://plus.google.com/118329424965123371259</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-xmiH1NogZow/AAAAAAAAAAI/AAAAAAAAAd8/BIaTWvlNzRk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.yeikos.com/2012/05/jquery-placeholder-v150.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08ARH86eip7ImA9WhVbEkk.&quot;"><id>tag:blogger.com,1999:blog-9211347223120402317.post-7736525472657668328</id><published>2012-05-09T13:33:00.004+01:00</published><updated>2012-05-29T01:04:05.112+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-29T01:04:05.112+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="jquery" /><title>jQuery unparam: función inversa de jQuery param</title><content type="html">jQuery posee una función llamada &lt;a href="http://api.jquery.com/jQuery.param/" target="_blank"&gt;param&lt;/a&gt;, la cual&amp;nbsp;transforma un objeto en una cadena de texto en formato URL de datos. El problema se presenta cuando nos encontramos en la situación contraria, tenemos una URL de datos y queremos convertirlo en un objeto, es entonces cuando no tenemos ninguna función que realice el proceso descrito.&lt;br /&gt;
&lt;br /&gt;
Hay diversas alternativas por Internet y las que he probado no me han convencido, ya que no funcionan como deberían. Algunas de esas alternativas no leen recursivamente los objetos dentro de objetos (data[a][b]=c) y otras lo hacen malamente, obteniendo un resultado que para nada es el esperado.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: large;"&gt;¿Qué es jQuery unparam?&lt;/span&gt;
&lt;br /&gt;
&lt;br /&gt;
jQuery.unparam es la función inversa de jQuery.param y nos permitirá transformar una URL de datos en un objeto.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;¿Cómo se utiliza?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Tan solo debemos introducirle como único parámetro la cadena de texto en formato URL, por ejemplo:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
var str = 'a=one&amp;amp;b[]=two&amp;amp;b[]=three&amp;amp;b[c]=four';&lt;br /&gt;
console.log($.unparam(str)); // {"a":"one","b":{"0":"two","1":"three","c":"four"}}&lt;/blockquote&gt;
&lt;br /&gt;
En la siguiente dirección podéis acceder a una demostración para ver su funcionamiento con datos más complejos:&amp;nbsp;&lt;a href="http://jsfiddle.net/yeikos/9Sv3p/" target="_blank"&gt;http://jsfiddle.net/yeikos/9Sv3p/&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Código fuente:&amp;nbsp;&lt;a href="https://raw.github.com/yeikos/jquery.unparam/master/jquery.unparam.js" target="_blank"&gt;https://raw.github.com/yeikos/jquery.unparam/master/jquery.unparam.js&lt;/a&gt;&lt;br /&gt;
Repositorio Github:&amp;nbsp;&lt;a href="https://github.com/yeikos/jquery.unparam" target="_blank"&gt;https://github.com/yeikos/jquery.unparam&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Descarga (&lt;/b&gt;&lt;b&gt;versión comprimida)&lt;/b&gt;:&amp;nbsp;&lt;a href="https://raw.github.com/yeikos/jquery.unparam/master/jquery.unparam.min.js" target="_blank"&gt;https://raw.github.com/yeikos/jquery.unparam/master/jquery.unparam.min.js&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/Yeikos/~4/gLaO-LqBiB4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.yeikos.com/feeds/7736525472657668328/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.yeikos.com/2012/05/jquery-unparam-inversa-de-jquery-param.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/7736525472657668328?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/7736525472657668328?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Yeikos/~3/gLaO-LqBiB4/jquery-unparam-inversa-de-jquery-param.html" title="jQuery unparam: función inversa de jQuery param" /><author><name>yeikos grayhat</name><uri>https://plus.google.com/118329424965123371259</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-xmiH1NogZow/AAAAAAAAAAI/AAAAAAAAAd8/BIaTWvlNzRk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.yeikos.com/2012/05/jquery-unparam-inversa-de-jquery-param.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcFRX89eyp7ImA9WhVbE0o.&quot;"><id>tag:blogger.com,1999:blog-9211347223120402317.post-3680601624192481897</id><published>2012-05-09T12:26:00.000+01:00</published><updated>2012-05-30T12:06:54.163+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-30T12:06:54.163+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="jquery" /><title>jQuery pushevent: Cambiando el orden de los eventos</title><content type="html">Los eventos en jQuery, al igual que en JavaScript, son ejecutados en el mismo orden por el cual fueron creados. A priori&amp;nbsp;no es posible cambiar el orden de ejecución de los eventos una vez que estos son creados, lo cual puede mermar la escalabilidad cuando se ha de manejar un entorno con numerosos eventos.&lt;br /&gt;
&lt;br /&gt;
Como bien dije, de primera mano y bajo las condiciones que nos brinda jQuery, alterar el orden de ejecución de los eventos a nuestro antojo puede suponer una tarea&amp;nbsp;laboriosa, pero gracias a jQuery.pushevent será coser y cantar.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: large;"&gt;¿Qué es jQuery pushevent?&lt;/span&gt;
&lt;br /&gt;
&lt;br /&gt;
Es propiamente un plugin de jQuery que nos permitirá cambiar el orden de ejecución de los eventos muy&amp;nbsp;fácilmente y sin ninguna complicación.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;¿Cómo se utiliza?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
El plugin consta de una única función con tres argumentos, uno de los cuales es opcional.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
$(selector).pushEvent(eventNames, selector, position);&lt;/blockquote&gt;
El primer selector hace referencia al elemento o elementos sobre los cuales se desea alterar el orden de los eventos. El primer parámetro de la función (eventNames) es el nombre del evento, que pueden ser múltiples separados por espacios, y siempre utilizando un marcador (namespace) para poder localizar el evento, de lo contrario lo ignorará (&lt;a href="http://api.jquery.com/event.namespace/" target="_blank"&gt;http://api.jquery.com/event.namespace/&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
El segundo parámetro es otro selector y solo será necesario si queremos actuar sobre un evento delegado. Si es así, el primer selector será el contexto, y este segundo selector será el elemento o elementos en cuestión que pertenece al contexto anterior (&lt;a href="http://api.jquery.com/delegate/" target="_blank"&gt;http://api.jquery.com/delegate/&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
Por último, tenemos el parámetro posición, que será un número entero y servirá para trasladar los eventos especificados a dicha posición. Por defecto, si no se define la posición ésta será cero, siendo cero la primera posición, y por consiguiente el primer evento en ser ejecutado. También acepta valores negativos, siendo por ejemplo, -1 la última posición.&lt;br /&gt;
&lt;br /&gt;
Podéis acceder a una demostración online para ver su funcionamiento (&lt;a href="http://jsfiddle.net/yeikos/uTQT8/" target="_blank"&gt;http://jsfiddle.net/yeikos/uTQT8/&lt;/a&gt;), o si prefereis el código fuente de la demostración, se encuentra en el repositorio de jQuery.pushevent, como demo.html (&lt;a href="https://github.com/yeikos/jquery.pushevent/blob/master/demo.html" target="_blank"&gt;https://github.com/yeikos/jquery.pushevent/blob/master/demo.html&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
Código fuente:&amp;nbsp;&lt;a href="https://raw.github.com/yeikos/jquery.pushevent/master/jquery.pushevent.min.js" target="_blank"&gt;https://raw.github.com/yeikos/jquery.pushevent/master/jquery.pushevent.js&lt;/a&gt;&lt;br /&gt;
Repositorio Github:&amp;nbsp;&lt;a href="https://github.com/yeikos/jquery.pushevent" target="_blank"&gt;https://github.com/yeikos/jquery.pushevent&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Descarga (&lt;/b&gt;&lt;b&gt;versión comprimida)&lt;/b&gt;:&amp;nbsp;&lt;a href="https://raw.github.com/yeikos/jquery.pushevent/master/jquery.pushevent.min.js" target="_blank"&gt;https://raw.github.com/yeikos/jquery.pushevent/master/jquery.pushevent.min.js&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/Yeikos/~4/MzuPo5WhtGA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.yeikos.com/feeds/3680601624192481897/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.yeikos.com/2012/05/jquery-pushevent-orden-de-los-eventos.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/3680601624192481897?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/3680601624192481897?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Yeikos/~3/MzuPo5WhtGA/jquery-pushevent-orden-de-los-eventos.html" title="jQuery pushevent: Cambiando el orden de los eventos" /><author><name>yeikos grayhat</name><uri>https://plus.google.com/118329424965123371259</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-xmiH1NogZow/AAAAAAAAAAI/AAAAAAAAAd8/BIaTWvlNzRk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.yeikos.com/2012/05/jquery-pushevent-orden-de-los-eventos.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QGR3g5eip7ImA9WhVVFUo.&quot;"><id>tag:blogger.com,1999:blog-9211347223120402317.post-5744198338425438482</id><published>2012-03-28T00:52:00.001+01:00</published><updated>2012-05-09T15:55:26.622+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-09T15:55:26.622+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="gecko" /><category scheme="http://www.blogger.com/atom/ns#" term="dom" /><category scheme="http://www.blogger.com/atom/ns#" term="wc3" /><category scheme="http://www.blogger.com/atom/ns#" term="jquery" /><title>Especificaciones privativas: DOM y JavaScript - Actualizado 09/05/12</title><content type="html">La falta de control sobre las especificaciones puede suponer un auténtico rompecabezas para los desarrolladores, pues en muchos casos éstas no se encuentran disponibles en todos los ámbitos.&lt;br /&gt;
&lt;br /&gt;
El &lt;a href="http://es.wikipedia.org/wiki/Document_Object_Model" target="_blank"&gt;DOM&lt;/a&gt;, modelo de objeto del documento, es a resumidas cuentas, un marco de trabajo con el que podemos interactuar con objetos para ofrecer así una vista del documento al usuario.&lt;br /&gt;
&lt;br /&gt;
El responsable de su control, como en muchos otros estándares, es el consorcio WC3, y sus &lt;a href="http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/" target="_blank"&gt;especificaciones&lt;/a&gt;&amp;nbsp;se encuentra bajo el nivel 2. Esta versión de las especificaciones del DOM lleva dando guerra casi 12 años, pero de vez en cuando surgen necesidades y, mientras su versión renovada siga bajo un &lt;a href="http://www.w3.org/TR/2011/WD-DOM-Level-3-Events-20110531/" target="_blank"&gt;borrador&lt;/a&gt;, queda en manos de los navegadores, o más bien de los motores de renderización,&amp;nbsp;actuar para adaptar éstas a sus necesidad.&lt;br /&gt;
&lt;br /&gt;
Los motores de renderización son el corazón (¡Que poético!) de los navegadores. Quizá los que más repercusión estén teniendo sean Webkit, utilizado por Chrome y Safari entre todos, y Gecko, perteneciente a la fundación Mozilla. Bajo estos motores se encuentran diversas especificaciones, de la mano de WC3, relacionadas con HTML, DOM, JavaScript, CSS, además de las propias incluidas por estos motores, llamadas especificaciones propias.&lt;br /&gt;
&lt;br /&gt;
Llegados a este último punto no hay control que valga y cada motor entra al trapo con sus especificaciones propias para rellenar esos huecos&amp;nbsp;vacíos&amp;nbsp;que deja la ineficacia de la WC3.&lt;br /&gt;
&lt;br /&gt;
Entre esas especificaciones propias tenemos&amp;nbsp;los &lt;i&gt;vendor-specific&lt;/i&gt; de CSS (&lt;i&gt;-moz&lt;/i&gt;-,&amp;nbsp;&lt;i&gt;-webkit-&lt;/i&gt;,&amp;nbsp;&lt;i&gt;-ms-,&amp;nbsp;&lt;/i&gt;etcétera) o en el caso del DOM, pequeñas joyas escondidas como la que os comento a continuación.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Bajo el motor Gecko, y dentro de la especifiación del DOM, tenemos el objeto&amp;nbsp;&lt;i&gt;events&lt;/i&gt;, y a su vez, dentro de éste la propiedad&amp;nbsp;&lt;a href="https://developer.mozilla.org/en/DOM/event.explicitOriginalTarget" style="font-style: italic;" target="_blank"&gt;explicitOriginalTarget&lt;/a&gt;, que es exclusiva de Gecko y no se encuentra disponible en los demás motores de renderización.&lt;br /&gt;
&lt;br /&gt;
Esta propiedad hace referencia al elemento desde el cual se originó la llamada al evento, y a&amp;nbsp;diferencia de &lt;i&gt;target &lt;/i&gt;o &lt;i&gt;currentTarget&lt;/i&gt;,&amp;nbsp;&lt;i&gt;explicitOriginalTarget&lt;/i&gt;&amp;nbsp;tiene la peculiaridad de que, a pesar de que el evento sea reorientado internamente, consigue llegar al final de la cadena para obtener el elemento desde el que se inició dicho evento.&lt;br /&gt;
&lt;br /&gt;
Esa reorientación del evento sucede, por ejemplo, en el evento &lt;i&gt;submit &lt;/i&gt;de los formularios. Así, la propiedad a la que hacemos mención nos permitirá averiguar, en el ámbito de un formulario, bien, si nos&amp;nbsp;encontrábamos&amp;nbsp;dentro de un campo de texto cuando pulsamos la tecla intro o qué botón de envío pulsamos.&lt;br /&gt;
&lt;br /&gt;
La falta de esta propiedad en la especificación original de la WC3 nos imposibilita todo lo anterior en el resto de navegadores, pero podemos recuperar parte de su funcionalidad mediante unas pocas líneas de código, ya que el hecho de añadir una capa de abstracción completa para simular dicha propiedad, y de este modo poseer toda su funcionalidad, puede poner en peligro la integridad del sitio.&lt;br /&gt;
&lt;br /&gt;
Al pulsar sobre el botón de envío de un formulario, si este botón tiene asignado el atributo&amp;nbsp;&lt;i&gt;name&lt;/i&gt;, su nombre y valor serán incluidos en los datos a enviar del formulario. Tal resultado lo podemos apreciar en la siguiente dirección&amp;nbsp;&lt;a href="http://fiddle.jshell.net/GqQ9E/show/" target="_blank"&gt;http://fiddle.jshell.net/GqQ9E/show/&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
El problema aparece cuando intervenimos mediante JavaScript el evento &lt;i&gt;submit &lt;/i&gt;y deseamos &amp;nbsp;recuperar los datos de envío, especialmente los del botón que accionó la petición.&lt;br /&gt;
&lt;br /&gt;
Para recrear dichas situaciones recurriremos a jQuery y su función &lt;a href="http://api.jquery.com/serialize/" target="_blank"&gt;serialize&lt;/a&gt;, la cual obtiene los datos del formulario a enviar, tal como se muestra en el siguiente ejemplo&amp;nbsp;&lt;a href="http://fiddle.jshell.net/yeikos/4U3SX/" target="_blank"&gt;http://fiddle.jshell.net/yeikos/4U3SX/&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Como podréis observar, al pulsar sobre cualquiera de los dos botones, tan sólo obtendremos los datos del campo de texto, pues la misión de la función &lt;i&gt;serialize &lt;/i&gt;se limita a obtener los datos de los elementos (input, select, textarea, etcétera) del formulario y no los pertenecientes al&amp;nbsp;botón&amp;nbsp;de envío.&lt;br /&gt;
&lt;br /&gt;
Para que en el ejemplo anterior obtengamos el resultado esperado, deberemos añadir una pequeña capa de abstracción que resuelva dicho problema y que podemos encontrar en la siguiente dirección&amp;nbsp;&lt;a href="https://gist.github.com/1261574#file_fix_eo_target.js" target="_blank"&gt;https://gist.github.com/1261574#file_fix_eo_target.js&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
De esta manera, intervendremos el evento click de todos los botones para que cuando éstos sean pulsados, añadamos sus datos al formulario antes de que el evento submit sea llamado.&lt;br /&gt;
&lt;br /&gt;
El ejemplo funcional, ya con la capa de abstracción, lo podéis encontrar en la siguiente dirección &lt;a href="http://jsfiddle.net/yeikos/yE8zB/" target="_blank"&gt;http://jsfiddle.net/yeikos/yE8zB/&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/Yeikos/~4/4bcJ_z-X8rE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.yeikos.com/feeds/5744198338425438482/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.yeikos.com/2012/03/especificaciones-dom-y-javascript.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/5744198338425438482?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/5744198338425438482?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Yeikos/~3/4bcJ_z-X8rE/especificaciones-dom-y-javascript.html" title="Especificaciones privativas: DOM y JavaScript - Actualizado 09/05/12" /><author><name>yeikos grayhat</name><uri>https://plus.google.com/118329424965123371259</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-xmiH1NogZow/AAAAAAAAAAI/AAAAAAAAAd8/BIaTWvlNzRk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.yeikos.com/2012/03/especificaciones-dom-y-javascript.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYMRHc7eyp7ImA9WhRaEUU.&quot;"><id>tag:blogger.com,1999:blog-9211347223120402317.post-7167709664895389960</id><published>2012-02-13T23:59:00.000Z</published><updated>2012-02-14T02:23:05.903Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-14T02:23:05.903Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tuenti" /><category scheme="http://www.blogger.com/atom/ns#" term="nodejs" /><title>NodeJS Tuenti API 1.0.2</title><content type="html">Actualización de NodeJS Tuenti Api.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Ahora disponible en los repositorios npm:&amp;nbsp;&lt;a href="http://search.npmjs.org/#/tuenti"&gt;http://search.npmjs.org/#/tuenti&lt;/a&gt;.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Más información:&amp;nbsp;&lt;a href="http://www.yeikos.com/2011/09/tuenti-api-nodejs.html"&gt;http://www.yeikos.com/2011/09/tuenti-api-nodejs.html&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Yeikos/~4/OWW9WUI4rI0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.yeikos.com/feeds/7167709664895389960/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.yeikos.com/2012/02/nodejs-tuenti-api-102.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/7167709664895389960?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/7167709664895389960?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Yeikos/~3/OWW9WUI4rI0/nodejs-tuenti-api-102.html" title="NodeJS Tuenti API 1.0.2" /><author><name>yeikos grayhat</name><uri>https://plus.google.com/118329424965123371259</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-xmiH1NogZow/AAAAAAAAAAI/AAAAAAAAAd8/BIaTWvlNzRk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.yeikos.com/2012/02/nodejs-tuenti-api-102.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQFQnc8fip7ImA9WhBTEEs.&quot;"><id>tag:blogger.com,1999:blog-9211347223120402317.post-6413505624820859411</id><published>2012-01-17T12:50:00.004Z</published><updated>2013-02-05T11:21:53.976Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-05T11:21:53.976Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript tips" /><title>Javascript tips: último elemento</title><content type="html">&lt;script src="https://gist.github.com/yeikos/4713814.js"&gt;&lt;/script&gt;&lt;img src="http://feeds.feedburner.com/~r/Yeikos/~4/D6vHddLc0z8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.yeikos.com/feeds/6413505624820859411/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.yeikos.com/2012/01/javascript-tips-ultimo-elemento.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/6413505624820859411?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/6413505624820859411?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Yeikos/~3/D6vHddLc0z8/javascript-tips-ultimo-elemento.html" title="Javascript tips: último elemento" /><author><name>yeikos grayhat</name><uri>https://plus.google.com/118329424965123371259</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-xmiH1NogZow/AAAAAAAAAAI/AAAAAAAAAd8/BIaTWvlNzRk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.yeikos.com/2012/01/javascript-tips-ultimo-elemento.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcGQXY5eSp7ImA9WhRVEkQ.&quot;"><id>tag:blogger.com,1999:blog-9211347223120402317.post-2826085009187985562</id><published>2011-11-10T07:49:00.000Z</published><updated>2012-01-11T14:27:00.821Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-11T14:27:00.821Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="webkit" /><category scheme="http://www.blogger.com/atom/ns#" term="jquery" /><category scheme="http://www.blogger.com/atom/ns#" term="feature" /><title>Webkit feature: barra de desplazamiento - Actualizado 11/01/12</title><content type="html">El problema en cuestión reside cuando se &lt;b&gt;eliminan los nodos hijos de un contenedor padre&lt;/b&gt; a la hora de intervenir en el &lt;b&gt;evento &lt;/b&gt;&lt;i&gt;&lt;b&gt;submit&lt;/b&gt; &lt;/i&gt;de un formulario, produciendo la &lt;b&gt;perdida de la posición de la barra de desplazamiento.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Condiciones necesarias&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;El navegador utiliza el motor Webkit (Chrome, Safari, Konkeror, etcétera).&lt;/li&gt;
&lt;li&gt;Debe de haber un formulario con un campo de texto y al mismo formulario le debe&amp;nbsp;prevalecer&amp;nbsp;cualquier contenido, como un texto.&lt;/li&gt;
&lt;li&gt;Se llama al evento &lt;i&gt;submit&lt;/i&gt; del formulario mediante la tecla intro (gracias esto último al campo de texto).&lt;/li&gt;
&lt;li&gt;Se cancela el evento anterior mediante un &lt;i&gt;listener&lt;/i&gt;, pero antes de ello, se eliminan los nodos hijos del contenedor padre a cambiar (removeChild), estableciendo a continuación el nuevo contenido.&lt;/li&gt;
&lt;li&gt;La barra de desplazamiento debe estar visible para apreciar la anomalía.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;b&gt;Actualizado&lt;/b&gt;: Al parecer la versión del motor WebKit 535.7 a la que da soporte Chrome en su versión 16 no presenta el problema que se describe en esta entrada, así que el problema pasará a ser una mera anecdota.&lt;/div&gt;
&lt;b&gt;&lt;/b&gt;&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;b&gt;Demostración con javascript nativo&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://jsfiddle.net/yeikos/muVNt/" target="_blank"&gt;http://jsfiddle.net/yeikos/muVNt/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Solución&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
El remedio más directo sería hacer uso de innerHTML para establecer el nuevo contenido sin eliminar los nodos hijos del contenedor a cambiar.&lt;br /&gt;
&lt;br /&gt;
El problema de ello es que innerHTML no es un&amp;nbsp;estándar&amp;nbsp;de la W3C, ya que pertenece a Microsoft (concretamente a Internet Explorer), pero su uso se extendió a los demás navegadores.&lt;br /&gt;
&lt;br /&gt;
Se prevee que en un futuro lejano esta función quede obsoleta, pero eso ya es otro cantar, ya que la alternativa sería trabajar con el DOM directamente, lo cual puede llegar a resultar muy engorroso, debiendo recurrir a diferentes frameworks, lo cual nos facilita mucho la tarea.&lt;br /&gt;
&lt;br /&gt;
Otro problema es que &lt;i&gt;innerHTML&lt;/i&gt; no&amp;nbsp;evalúa&amp;nbsp;las etiquetas &lt;i&gt;script&lt;/i&gt;, por lo que si queremos hacer uso de esa funcionalidad tenemos que volver a trabajar sobre el DOM o frameworks, como jQuery.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Demostración con jQuery&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
jQuery también se ve afectado pero de una forma cuanto menos curiosa, ya que el contenido lo establecemos mediante la función jQuery.html,&amp;nbsp;fácilmente&amp;nbsp;y sin problemas, pero si éste contiene alguna etiqueta &lt;i&gt;script&lt;/i&gt;&amp;nbsp;la susodicha función cambia su forma de trabajar, utilizando la función &lt;i&gt;empty &lt;/i&gt;para vaciar el contenido y a continuación &lt;i&gt;append&lt;/i&gt; para añadir el contenido nuevo, y sí, como algunos&amp;nbsp;estaréis&amp;nbsp;pensando, la función &lt;i&gt;empty&lt;/i&gt; de jQuery utiliza&amp;nbsp;&lt;i&gt;removeChild &lt;/i&gt;para eliminar los nodos hijos.&lt;br /&gt;
&lt;br /&gt;
En este caso particular no nos vale utilizar &lt;i&gt;innerHTML &lt;/i&gt;para establecer el nuevo contenido, ya que no evaluará las etiquetas &lt;i&gt;script&lt;/i&gt;, así que la única solución es vaciar el contenido sin hacer uso de &lt;i&gt;removeChild&lt;/i&gt;, es decir, asignando una cadena vacía a&amp;nbsp;&lt;i&gt;innerHTML&lt;/i&gt;&amp;nbsp;o en su defecto, utilizando la función &lt;i&gt;html&lt;/i&gt; de jQuery y pasandole como argumento una cadena&amp;nbsp;vacía.&lt;br /&gt;
&lt;br /&gt;
Una vez vaciado el contenido podemos establecer el contenido nuevo&amp;nbsp;utilizando el DOM (jQuery.html) para que&amp;nbsp;evalué&amp;nbsp;las etiquetas &lt;i&gt;script&amp;nbsp;&lt;/i&gt;sin&amp;nbsp;ningún&amp;nbsp;tipo de problema y sin pérdida de posición de la barra de desplazamiento,&amp;nbsp;ya que al encontrarse el contenido&amp;nbsp;vació&amp;nbsp;antes de establecer el nuevo, la función &lt;i&gt;empty &lt;/i&gt;no tiene que vaciarlo de nuevo, ya que no hay nodos para eliminar, por lo que no hará uso de&amp;nbsp;&lt;i&gt;removeChild&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://jsfiddle.net/yeikos/SgNKV" target="_blank"&gt;http://jsfiddle.net/yeikos/SgNKV&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div id="-chrome-auto-translate-plugin-dialog" style="background-attachment: initial !important; background-clip: initial !important; background-color: transparent !important; background-image: initial !important; background-origin: initial !important; display: none; left: 0px; margin-bottom: 0px !important; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important; opacity: 1 !important; overflow-x: visible !important; overflow-y: visible !important; padding-bottom: 0px !important; padding-left: 0px !important; padding-right: 0px !important; padding-top: 0px !important; position: absolute !important; text-align: left !important; top: 0px; z-index: 999999 !important;"&gt;
&lt;div style="-webkit-border-radius: 10px !important; background-color: #FFFFFF !important; background-image: -webkit-gradient(linear, left top, right bottom, color-stop(0%, #FFF), color-stop(50%, #EEE), color-stop(100%, #FFF)); border: 1px solid #363636 !important; color: #121212 !important; font-size: 16px !important; max-width: 300px !important; opacity: 1 !important; overflow: visible !important; padding: 8px !important; text-align: left !important; z-index: 999999 !important;"&gt;
&lt;div class="translate"&gt;
&lt;/div&gt;
&lt;div class="additional"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;img onclick="document.location.href='http://translate.google.com/';" src="http://www.google.com/uds/css/small-logo.png" style="-webkit-border-radius: 20px; background-color: rgba(200, 200, 200, 0.3) !important; cursor: pointer !important; margin: 0 !important; padding: 3px 5px 0 !important; position: absolute !important; right: 1px !important; top: -20px !important; z-index: -1 !important;" /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Yeikos/~4/AH457_poO_Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.yeikos.com/feeds/2826085009187985562/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.yeikos.com/2011/11/webkit-feature-barra-de-desplazamiento.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/2826085009187985562?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/2826085009187985562?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Yeikos/~3/AH457_poO_Q/webkit-feature-barra-de-desplazamiento.html" title="Webkit feature: barra de desplazamiento - Actualizado 11/01/12" /><author><name>yeikos grayhat</name><uri>https://plus.google.com/118329424965123371259</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-xmiH1NogZow/AAAAAAAAAAI/AAAAAAAAAd8/BIaTWvlNzRk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.yeikos.com/2011/11/webkit-feature-barra-de-desplazamiento.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMFRXw4eSp7ImA9WhBTEEs.&quot;"><id>tag:blogger.com,1999:blog-9211347223120402317.post-8931777342569865917</id><published>2011-10-12T23:22:00.001+01:00</published><updated>2013-02-05T11:23:34.231Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-05T11:23:34.231Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript tips" /><title>Javascript tips: str2argv</title><content type="html">&lt;script src="https://gist.github.com/yeikos/4713825.js"&gt;&lt;/script&gt;&lt;img src="http://feeds.feedburner.com/~r/Yeikos/~4/yyJnqlBhOms" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.yeikos.com/feeds/8931777342569865917/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.yeikos.com/2011/10/javascript-tips-str2argv.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/8931777342569865917?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/8931777342569865917?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Yeikos/~3/yyJnqlBhOms/javascript-tips-str2argv.html" title="Javascript tips: str2argv" /><author><name>yeikos grayhat</name><uri>https://plus.google.com/118329424965123371259</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-xmiH1NogZow/AAAAAAAAAAI/AAAAAAAAAd8/BIaTWvlNzRk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.yeikos.com/2011/10/javascript-tips-str2argv.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMMQXc-eyp7ImA9WhBTEEs.&quot;"><id>tag:blogger.com,1999:blog-9211347223120402317.post-5695073938891809586</id><published>2011-09-14T15:13:00.002+01:00</published><updated>2013-02-05T11:24:40.953Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-05T11:24:40.953Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript tips" /><title>Javascript tips: timestamp</title><content type="html">&lt;script src="https://gist.github.com/yeikos/4713827.js"&gt;&lt;/script&gt;&lt;img src="http://feeds.feedburner.com/~r/Yeikos/~4/Poo3MYtQz3A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.yeikos.com/feeds/5695073938891809586/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.yeikos.com/2011/09/tips-javascript.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/5695073938891809586?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/5695073938891809586?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Yeikos/~3/Poo3MYtQz3A/tips-javascript.html" title="Javascript tips: timestamp" /><author><name>yeikos grayhat</name><uri>https://plus.google.com/118329424965123371259</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-xmiH1NogZow/AAAAAAAAAAI/AAAAAAAAAd8/BIaTWvlNzRk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.yeikos.com/2011/09/tips-javascript.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04GQHo-eip7ImA9WhJTF0w.&quot;"><id>tag:blogger.com,1999:blog-9211347223120402317.post-3774546325185803610</id><published>2011-09-05T11:18:00.000+01:00</published><updated>2012-06-26T12:58:41.452+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-26T12:58:41.452+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="api" /><category scheme="http://www.blogger.com/atom/ns#" term="tuenti" /><category scheme="http://www.blogger.com/atom/ns#" term="nodejs" /><title>API de Tuenti en NodeJS - Actualizado 13/02/12</title><content type="html">Tuenti no posee ninguna &lt;a href="http://es.wikipedia.org/wiki/Interfaz_de_programaci%C3%B3n_de_aplicaciones"&gt;API&lt;/a&gt; de&amp;nbsp;carácter&amp;nbsp;público, pero ésta tuvo que ser creada silenciosamente para el desarrollo de sus propias aplicaciones en las diferentes plataformas móviles, así como Android, iOS, Symbian...&lt;br /&gt;
&lt;br /&gt;
Para aquellos que anden un poco perdidos,&amp;nbsp;una API vendría a ser una capa de abstracción que ofrece una serie de funciones. En definitiva, su misión es facilitar el desarrollo de aplicaciones, evitando repetir código y creando un entorno amigable.&lt;br /&gt;
&lt;br /&gt;
Gracias a la&amp;nbsp;&lt;i&gt;publicación &lt;/i&gt;de esta API, cualquiera puede desarrollar un cliente para comunicarse con las diversas funciones que&amp;nbsp;ésta&amp;nbsp;ofrece, interactuando con gran parte de sus servicios pero no todos, claro está, ya que nos encontramos limitados por esa capa de abstracción.&lt;br /&gt;
&lt;br /&gt;
Actualmente Tuenti ofrece su aplicación móvil en diferentes plataformas, y el uso de su API se encuentra limitada a éstas, pues aún&amp;nbsp;habiéndose&amp;nbsp;portado la API de Tuenti a otros lenguajes (véase &lt;a href="http://www.google.es/webhp#q=api+tuenti+php"&gt;PHP&lt;/a&gt;), su usabilidad se encuentra algo entorpecida debido al lenguaje.&lt;br /&gt;
&lt;br /&gt;
Es por ello que me he visto obligado a portar la API a nodeJS, añadiendo nuevas funcionalidades para su manejo e incluyendo una pasarela que permitirá que el desarrollo de aplicaciones para Tuenti sea un mero &lt;i&gt;juego de niños&lt;/i&gt;.
&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: x-large;"&gt;¿Qué es NodeJS&amp;nbsp;Tuenti&amp;nbsp;API?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Resumiendo lo dicho anteriormente, viene a ser una&amp;nbsp;librería&amp;nbsp;para nodeJS que&amp;nbsp;actúa&amp;nbsp;como API para comunicarse con los servicios que ofrece la API de Tuenti.&lt;br /&gt;
&lt;br /&gt;
Se diferencia de las demás versiones portadas por terceros en su usabilidad y en que Javascript es el entorno perfecto para trabajar con llamadas&amp;nbsp;asíncronas (la inicialización de una petición no paraliza la ejecución del código).&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;¿Cómo se instala?&lt;/span&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Lectura obligatoria&lt;/b&gt;:&amp;nbsp;&lt;a href="http://www.yeikos.com/2012/06/npm-error-cannot-find-module.html"&gt;http://www.yeikos.com/2012/06/npm-error-cannot-find-module.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Tan fácil como dirigirse a&amp;nbsp;&lt;a href="http://nodejs.org/"&gt;http://nodejs.org&lt;/a&gt;&amp;nbsp;y descargar NodeJS para nuestra plataforma. Una vez instalado deberemos hacer uso del gestor de paquetes&amp;nbsp;&lt;a href="http://npmjs.org/"&gt;http://npmjs.org&lt;/a&gt;, que ya viene de serie en las últimas versiones de NodeJS, y desde la línea de comando introducimos lo siguiente para instalar la&amp;nbsp;librería&amp;nbsp;NodeJS Tuenti Api.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
npm install&amp;nbsp;-g&amp;nbsp;tuenti&amp;nbsp;&lt;/blockquote&gt;
El parámegro -&lt;i&gt;g &lt;/i&gt;le indica al gestor que debe instalar el paquete en la ruta global y no en el directorio local sobre el que nos encontramos.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;¿Cómo se utiliza?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
La librería provee 3 métodos, login, request y gateway, y su funcionamiento es muy simple, por eso os sugiero que&amp;nbsp;visitéis&amp;nbsp;la siguiente página en la cual tenéis 4 ejemplos para que podáis examinarlos: &lt;a href="https://github.com/yeikos/nodejs.tuenti/tree/master/examples"&gt;https://github.com/yeikos/nodejs.tuenti/tree/master/examples&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
La única puntualización a hacer es sobre el método gateway que actúa como pasarela o intermediario. Gracias a esto, y mediante la&amp;nbsp;librería&amp;nbsp;jQuery Tuenti API, se puede interactuar directamente con la API de Tuenti desde el propio navegador. Esto abre un gran abanico de posibilidades a futuros desarrollos, ya que simplificamos todo el trabajo, pudiendo crear diferentes tipos de aplicaciones Web para Tuenti.&lt;br /&gt;
&lt;br /&gt;
De la librería jQuery Tuenti API poco hay que decir, pues posee los mismos métodos y trabaja exactamente igual que NodeJS Tuenti API, exceptuando el método gateway, pues carecería de sentido que lo tuviera.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Colabora&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Actualmente el proyecto se encuentra subido a&amp;nbsp;&lt;a href="https://github.com/yeikos/nodejs.tuenti"&gt;github&lt;/a&gt;, portal donde podrás participar en el desarollo del código fuente.&lt;img src="http://feeds.feedburner.com/~r/Yeikos/~4/qQRASK-Ahag" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.yeikos.com/feeds/3774546325185803610/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.yeikos.com/2011/09/tuenti-api-nodejs.html#comment-form" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/3774546325185803610?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/3774546325185803610?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Yeikos/~3/qQRASK-Ahag/tuenti-api-nodejs.html" title="API de Tuenti en NodeJS - Actualizado 13/02/12" /><author><name>yeikos grayhat</name><uri>https://plus.google.com/118329424965123371259</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-xmiH1NogZow/AAAAAAAAAAI/AAAAAAAAAd8/BIaTWvlNzRk/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://www.yeikos.com/2011/09/tuenti-api-nodejs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMGSH49eyp7ImA9WhBTEEs.&quot;"><id>tag:blogger.com,1999:blog-9211347223120402317.post-4617486953038399006</id><published>2011-08-24T03:02:00.001+01:00</published><updated>2013-02-05T11:23:49.063Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-05T11:23:49.063Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript tips" /><title>Javascript tips: desplazar array</title><content type="html">&lt;script src="https://gist.github.com/yeikos/4713815.js"&gt;&lt;/script&gt;&lt;img src="http://feeds.feedburner.com/~r/Yeikos/~4/9-mDqbuD71Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.yeikos.com/feeds/4617486953038399006/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.yeikos.com/2011/08/tips-javascript.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/4617486953038399006?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/4617486953038399006?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Yeikos/~3/9-mDqbuD71Y/tips-javascript.html" title="Javascript tips: desplazar array" /><author><name>yeikos grayhat</name><uri>https://plus.google.com/118329424965123371259</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-xmiH1NogZow/AAAAAAAAAAI/AAAAAAAAAd8/BIaTWvlNzRk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.yeikos.com/2011/08/tips-javascript.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMBQXs5fyp7ImA9WhBTEEs.&quot;"><id>tag:blogger.com,1999:blog-9211347223120402317.post-1275589150073192064</id><published>2011-08-04T14:14:00.000+01:00</published><updated>2013-02-05T11:24:10.527Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-05T11:24:10.527Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript tips" /><title>Javascript tips: argument script tag</title><content type="html">&lt;script src="https://gist.github.com/yeikos/1261574.js"&gt;&lt;/script&gt;&lt;img src="http://feeds.feedburner.com/~r/Yeikos/~4/OQMibhqQxMc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.yeikos.com/feeds/1275589150073192064/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.yeikos.com/2011/08/argument-script-tag.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/1275589150073192064?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/1275589150073192064?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Yeikos/~3/OQMibhqQxMc/argument-script-tag.html" title="Javascript tips: argument script tag" /><author><name>yeikos grayhat</name><uri>https://plus.google.com/118329424965123371259</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-xmiH1NogZow/AAAAAAAAAAI/AAAAAAAAAd8/BIaTWvlNzRk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.yeikos.com/2011/08/argument-script-tag.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8HRX86eip7ImA9WhdWEkQ.&quot;"><id>tag:blogger.com,1999:blog-9211347223120402317.post-1037214105641844536</id><published>2011-07-12T16:47:00.000+01:00</published><updated>2011-09-06T09:47:14.112+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-06T09:47:14.112+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><title>Paradoja</title><content type="html">No válida para navegadores &lt;a href="http://www.w3.org/TR/REC-html32" target="_blank"&gt;duros de roer&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;&lt;script src="https://gist.github.com/1196987.js?file=paradoja.html"&gt;&lt;/script&gt;&lt;img src="http://feeds.feedburner.com/~r/Yeikos/~4/j_aegcUKykA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.yeikos.com/feeds/1037214105641844536/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.yeikos.com/2011/07/paradoja-javascrina.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/1037214105641844536?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/1037214105641844536?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Yeikos/~3/j_aegcUKykA/paradoja-javascrina.html" title="Paradoja" /><author><name>yeikos grayhat</name><uri>https://plus.google.com/118329424965123371259</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-xmiH1NogZow/AAAAAAAAAAI/AAAAAAAAAd8/BIaTWvlNzRk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.yeikos.com/2011/07/paradoja-javascrina.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQFR3cycSp7ImA9WhVbEkg.&quot;"><id>tag:blogger.com,1999:blog-9211347223120402317.post-2081081771074992388</id><published>2011-07-12T00:43:00.000+01:00</published><updated>2012-05-29T01:11:56.999+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-29T01:11:56.999+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="placeholder" /><category scheme="http://www.blogger.com/atom/ns#" term="jquery" /><category scheme="http://www.blogger.com/atom/ns#" term="html5" /><title>jQuery Placeholder - Actualizado 29/05/12</title><content type="html">&lt;i&gt;Placeholder&lt;/i&gt; es un atributo que pertenece a HTML5 y se encuentra disponible en los campos de texto y contraseña (input text/password) y las áreas de texto (textarea).&lt;br /&gt;
&lt;br /&gt;
Su función es mostrar un mensaje informativo dentro del elemento cuando éste no tiene contenido.&lt;br /&gt;
&lt;br /&gt;
El problema de HTML5, concretamente del atributo &lt;i&gt;placeholder&lt;/i&gt;, es que aún no ha sido implementado en todos los navegadores, es más, en algunos sí ha sido implementado pero con soporte parcial, dejando a un lado los campos de contraseña, por ejemplo.&lt;br /&gt;
&lt;br /&gt;
Por suerte, existen soluciones varias para solventar este problema y una de ellas es la que os expongo a continuación: jQuery Placeholder.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;¿Qué es jQuery Placeholder?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Básicamente es un plugin de jQuery quer permite el uso del atributo &lt;i&gt;placeholder &lt;/i&gt;en cualquier navegador. Su funcionamiento es sencillo y destacaré sus puntos fuertes:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Compatibilidad&lt;/b&gt;: soporte para todos los navegadores incluido el ya &lt;a href="http://www.ie6countdown.com/"&gt;casi olvidado&lt;/a&gt; IE6.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Eficaz y ligero&lt;/b&gt;: el código no es intrusivo, en su justa medida claro está, utilizando los métodos más idóneos para no interferir con el funcionamiento por defecto del navegador.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Usabilidad&lt;/b&gt;:&amp;nbsp;además de brindar las usabilidades básicas se incluyen otras como la&amp;nbsp;opción de prescindir de ejecutar este plugin sobre los elementos en caso de que el navegador si soporte nativamente el atributo &lt;i&gt;placeholder (forced), o la&lt;/i&gt;&amp;nbsp;posibilidad cambiar el estilo de la etiqueta del &lt;i&gt;placeholder &lt;/i&gt;mediante la clase CSS .placeholder (para cambiar la propiedad color desde la clase es necesario utilizar la regla &lt;a href="http://www.w3.org/TR/CSS21/cascade.html#important-rules" target="_blank"&gt;!important&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;¿Cómo se utiliza?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
$(context).placeholder(selector, config)&lt;/blockquote&gt;
La función admite dos argumentos opcionales de entrada sin importar el orden en el que éstos son enviados. El argumento que sea una cadena de texto, será evaluado como &lt;i&gt;selector&lt;/i&gt;, de este modo se buscará dentro del contexto dichos elementos que concuerden con el selector.&lt;br /&gt;
&lt;br /&gt;
El otro argumento será evaluado si es un objeto y corresponderá a &lt;i&gt;config&lt;/i&gt;, que posee dos propiedades:&amp;nbsp;&lt;i&gt;selector &lt;/i&gt;(explicado anteriormente)&amp;nbsp;y &lt;i&gt;forced&lt;/i&gt; (explicado en el apartado usabilidad).&lt;br /&gt;
&lt;br /&gt;
Por defecto el marcador &lt;i&gt;forced &lt;/i&gt;se encuentra desactivado, evitando así dar soporte al atributo &lt;i&gt;placeholder &lt;/i&gt;en caso de que el navegador lo soporte nativamente. El selector por defecto agrupa a todos los campos de texto y contraseña y las áreas de texto. Todas estas opciones las podéis encontrar en el objeto &lt;i&gt;$.placeholder.defaults&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
También se encuentra una función de acceso rápido, la cual utiliza directamente el contexto &lt;i&gt;body &lt;/i&gt;y se le pueden aplicar las mismas reglas para los argumentos de la función anterior.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
$.placeholder(selector, config)&lt;/blockquote&gt;
Podéis encontrar varios ejemplos, básicos y complejos, en el repositorio de GitHub del plugin.&lt;br /&gt;
&lt;br /&gt;
Código fuente:&amp;nbsp;&lt;a href="https://raw.github.com/yeikos/jquery.placeholder/master/jquery.placeholder.js" target="_blank"&gt;https://raw.github.com/yeikos/jquery.placeholder/master/jquery.placeholder.js&lt;/a&gt;&lt;br /&gt;
Repositorio Github:&amp;nbsp;&lt;a href="https://github.com/yeikos/jquery.placeholder" target="_blank"&gt;https://github.com/yeikos/jquery.placeholder&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Descarga (versión comprimida)&lt;/b&gt;:&amp;nbsp;&lt;a href="https://raw.github.com/yeikos/jquery.placeholder/master/jquery.placeholder.min.js" target="_blank"&gt;https://raw.github.com/yeikos/jquery.placeholder/master/jquery.placeholder.min.js&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/Yeikos/~4/JEalZ0tcGBo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.yeikos.com/feeds/2081081771074992388/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.yeikos.com/2011/07/jquery-placeholder.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/2081081771074992388?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9211347223120402317/posts/default/2081081771074992388?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Yeikos/~3/JEalZ0tcGBo/jquery-placeholder.html" title="jQuery Placeholder - Actualizado 29/05/12" /><author><name>yeikos grayhat</name><uri>https://plus.google.com/118329424965123371259</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-xmiH1NogZow/AAAAAAAAAAI/AAAAAAAAAd8/BIaTWvlNzRk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.yeikos.com/2011/07/jquery-placeholder.html</feedburner:origLink></entry></feed>
