<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Maestros del Web &#187; Maikel González Suárez</title>
	<atom:link href="http://www.maestrosdelweb.com/author/maikel-gonzalez/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.maestrosdelweb.com</link>
	<description>Un espacio para los entusiastas del web</description>
	<pubDate>Fri, 29 Aug 2008 20:34:37 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Introducción a la manipulación del DOM mediante Javascript</title>
		<link>http://www.maestrosdelweb.com/editorial/dom/</link>
		<comments>http://www.maestrosdelweb.com/editorial/dom/#comments</comments>
		<pubDate>Tue, 27 Feb 2007 00:00:00 +0000</pubDate>
		<dc:creator>Maikel González Suárez</dc:creator>
		
		<category><![CDATA[Editorial]]></category>

		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.maestrosdelweb.com/editorial/dom/</guid>
		<description><![CDATA[Una página web es un documento HTML que es interpretado por los navegadores en forma gráfica, pero también permiten el acceso al código.
El Modelo de Objetos del Documento (DOM) permite ver  el mismo documento de otra manera,  describiendo el contenido del documento como un conjunto de objetos que un programa Javascript puede actuar [...]]]></description>
			<content:encoded><![CDATA[<p><span class="intro">Una página web es un documento HTML que es interpretado por los navegadores en forma gráfica, pero también permiten el acceso al código.</span><span id="more-411"></span></p>
<p>El Modelo de Objetos del Documento (DOM) permite ver  el mismo documento de otra manera,  describiendo el contenido del documento como un conjunto de objetos que un programa Javascript puede actuar sobre ellos. </p>
<h3>&iquest;Qu&eacute; es el Modelo de Objetos del Documento? </h3>
<p>Acorde al <a href="http://www.w3c.es/">W3C</a> el Modelo de Objetos del Documento es una interfaz de programaci&oacute;n de aplicaciones (API) para documentos validos <a href="http://www.maestrosdelweb.com/editorial/nivelhtml/">HTML</a> y bien construidos <a href="http://www.maestrosdelweb.com/editorial/xmlintro/">XML</a>. Define la estructura l&oacute;gica de los documentos y el modo en que se accede y manipula.</p>
<p>El DOM permite un acceso a la estructura de una p&aacute;gina HTML mediante el mapeo de los elementos de esta p&aacute;gina en un &aacute;rbol de nodos. Cada elemento se convierte  en un  nodo  y cada porci&oacute;n de texto en un  nodo de texto. Para comprender m&aacute;s f&aacute;cilmente v&eacute;ase el siguiente ejemplo: </p>
<div class= "codigo">
<pre>
&lt;body&gt;
&lt;p&gt;Esto es un párrafo que contiene &lt;a href="#"&gt;un enlace&lt;/a&gt; en el medio. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Primer punto en la lista&lt;/li&gt;
&lt;li&gt;Otro punto en la lista&lt;/li&gt;
&lt;/ul&gt;
&lt;/body&gt;</pre>
</div>
<p>Como puede verse un elemento  [a] se encuentra localizado dentro de un elemento [p] del HTML, convirti&eacute;ndose en un nodo hijo, o simplemente hijo del nodo [p], de manera similar [p] es el nodo padre. Los dos nodos li son hijos del mismo padre, llam&aacute;ndose nodos hermanos o simplemente hermanos.</p>
<p>Es importante comprender la diferencia entre elementos y nodos de textos. Los elementos com&uacute;nmente son asociados a las etiquetas. En HTML todas las etiquetas son elementos, tales como &lt;p&gt;, &lt;img&gt; y &lt;div&gt; por lo que tienen atributos y contienes nodos hijos. Sin embargo, los nodos de textos no poseen atributos e hijos.</p>
<h3>Siempre use el DOCTYPE  correcto </h3>
<p>El DOCTYPE (abreviado del ingl&eacute;s &ldquo;document type declaration&rdquo;, declaraci&oacute;n del tipo de documento) informa cual versi&oacute;n de (X)HTML se usar&aacute; para validar el documento; existen varios tipos a seleccionar. El DOCTYPE, debe aparecer  siempre en la parte superior de cada p&aacute;gina HTML y siendo un componente clave de las p&aacute;ginas web &ldquo;obedientes&rdquo; a los <a href="http://www.maestrosdelweb.com/editorial/estandaresweb/">est&aacute;ndares</a>.</p>
<p> En caso de usarse un DOCTYPE incompleto,  no actualizado o simplemente no usarlo llevar&aacute; al navegador a entrar en modo raro o extra&ntilde;o, donde el navegador asume que se ha programado fuera de los est&aacute;ndares. </p>
<p>Todav&iacute;a todos los <a href="http://www.maestrosdelweb.com/editorial/firefox/">navegadores</a> actuales no son capaces de procesar correctamente todos los tipos de documentos, sin embargo, muchos de ellos funcionan  correctamente en los navegadores m&aacute;s utilizados actualmente, tales como:</p>
<p> HTML 4.01 Strict y Transitional, XHML 1.0 Strict y Transitional los se comportan del modo correcto en <a href="http://www.maestrosdelweb.com/actualidad/3241/">Internet Explorer</a> (versi&oacute;n 6, 7 Beta),  <a href="http://www.maestrosdelweb.com/editorial/firefox/">Mozilla </a>y <a href="http://www.maestrosdelweb.com/editorial/opera/">Opera 7</a>.   De ahora en adelante se adoptar&aacute; para cada ejemplo HTML 4.01 Strict :</p>
<div class="codigo">
<pre>
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;
</pre>
</div>
<p>Resultando una &uacute;nica l&iacute;nea de c&oacute;digo, o dos l&iacute;neas con un salto de l&iacute;nea despu&eacute;s de EN&rdquo;. </p>
<h3>La importancia de validar el HTML </h3>
<p>Si los elementos son anidados de manera inadecuada pueden generarse problemas, v&eacute;ase la siguiente l&iacute;nea: </p>
<div class="codigo">
<pre>&lt;p&gt;Estos elementos han sido &lt;strong&gt;incorrectamente &lt;/p&gt;anidados &lt;/strong&gt;
</pre>
</div>
<p>El &aacute;rbol que resulta de esto se encuentra incorrectamente anidado del todo, por tanto generar&aacute; errores inesperados en los navegadores. Manteniendo su HTML v&aacute;lido se pueden evitar tales problemas.</p>
<h3>Accediendo a los elementos </h3>
<p>Afortunadamente, Javascript permite acceder a cada uno de los elementos de  una p&aacute;gina utilizando tan s&oacute;lo algunos m&eacute;todos y propiedades. </p>
<p>Si desea encontrar de manera r&aacute;pida y f&aacute;cil un elemento se tiene a la mano el m&eacute;todo getElementById. El mismo permite un acceso inmediato a cualquier elemento tan s&oacute;lo conociendo el valor de su atributo id. V&eacute;ase el siguiente ejemplo: </p>
<div class="codigo">
<pre>
&lt;p&gt;
&lt;a id="contacto" href="contactos.html"&gt;Contáctenos&lt;/a&gt;
&lt;/p&gt;</pre>
</div>
<p>Puede usarse el atributo id del elemento a para acceder al mismo:</p>
<div class="codigo">
<pre>
var elementoContacto = document.getElementById("contacto");
</pre>
</div>
<p>Ahora el valor de la variable elementoContacto est&aacute; referida al elemento [a] y cualquier operaci&oacute;n sobre la misma afectar&aacute; el hiperenlace. </p>
<p>El m&eacute;todo getElementById es adecuado para operar sobre un elemento en espec&iacute;fico, sin embargo, en ocasiones se necesita trabajar sobre un grupo de elementos por lo que en este caso puede utilizarse el m&eacute;todo getElementsByTagName. Este retorna todos los elementos de un mismo tipo. Asumiendo la siguiente lista desordenada: </p>
<div class="codigo">
<pre>
&lt;ul&gt;
&lt;li&gt;&lt;a href="editorial.html"&gt;Editorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="semblanza.html"&gt;Autores&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="noticias.html"&gt;Noticias&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="contactos.html"&gt;Contátenos&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</pre>
</div>
<p>Puede obtenerse todos los hiperv&iacute;nculos de la siguiente manera:</p>
<div class="codigo">
<pre>
var hipervinculos= document.getElementsByTagName("a");
</pre>
</div>
<p>El valor de la variable hipervinculos es una colecci&oacute;n de elementos [a]. Las colecciones son arreglos pudi&eacute;ndose acceder a cada elemento a trav&eacute;s de la ya conocida notaci&oacute;n con corchetes. </p>
<p>Los elementos devueltos por  getElementsByTagName ser&aacute;n ordenado seg&uacute;n el orden que aparezcan en el c&oacute;digo fuente. Por tanto para el caso anterior quedar&iacute;a as&iacute;:</p>
<ul>
<li>hipervinculos[0] el elemento [a] para &ldquo;Editorial&rdquo;</li>
<li>hipervinculos[1] el elemento [a] para &ldquo;Autores&rdquo;</li>
<li>hipervinculos[2] el elemento [a] para &ldquo;Noticias&rdquo;</li>
<li>hipervinculos[3] el elemento [a] para &ldquo;Cont&aacute;ctenos&rdquo; </li>
</ul>
<p>Otra maneras de acceder a un elemento usando su id es document.all[&quot;id&quot;]  la cual fue introducida en Internet Explorer 4 y document.layers[&quot;id&quot;] introducida por Netscape 5 por que el W3C todav&iacute;a no hab&iacute;a estandarizado la manera de acceder a los elementos mediante su id. Sin embargo, no se recomienda su uso porque al estar fuera de los est&aacute;ndares actuales hay navegadores que no soportan estos m&eacute;todos.</p>
<p>Por otro lado existen varios elementos en un documento HTML que pueden ser accedidos de otras maneras. El elemento body de un documento puede accederse a trav&eacute;s de la forma document.body, mientras que el conjunto de todos los formularios en un documento puede encontrase en document.forms, as&iacute; mismo el conjunto de todas las im&aacute;genes ser&iacute;a mediante document.images.</p>
<p>Actualmente la mayor&iacute;a de los navegadores soportan esto m&eacute;todos a&uacute;n as&iacute; es recomendable el uso del m&eacute;todo getElementsByTagName, v&eacute;ase el siguiente ejemplo para acceder al elemento body: </p>
<div class="codigo">
<pre>
var body = document.getElementsByTagName("body")[0];
</pre>
</div>
<h3>  Creando elementos y textos </h3>
<p>La creaci&oacute;n de nodos es posible mediante el uso de dos m&eacute;todos disponibles en el objeto document. Dichos m&eacute;todos son:</p>
<ul>
<li>  createElement(Tipo cadena): Crea un nuevo elemento del tipo especificado y devuelve un referencia a dicho elemento.</li>
<li> createTextNode(Cadena de texto): Crea un nuevo nodo de texto con el contenido especificado en la cadena de texto.</li>
</ul>
<p>El siguiente ejemplo muestra c&oacute;mo se crea un nuevo elemento de p&aacute;rrafo vac&iacute;o:</p>
<div class="codigo">
<pre>
var nuevoEnlace = document.createElement("a");
</pre>
</div>
<p>La variable nuevoEnlace ahora referencia un nuevo enlace listo para ser insertado en el documento. El texto que va dentro del elemento [a] es un nodo de texto hijo, por lo que debe ser creado por separado.</p>
<div class="codigo">
<pre>
var nodoTexto = document.createTextNode("Semblanza");
</pre>
</div>
<p>Luego si desea  modificar el nodo de texto ya existente, puede utilizarse la propiedad nodeValue, esta permite coger y poner el nodo de texto: </p>
<div class="codigo">
<pre>
var textoViejo = nodoTexto.nodeValue;

nodoTexto.nodeValue = "Novedades";
</pre>
</div>
<p>El valor de la variable textoViejo es ahora &quot;Semblanza&quot; y el nuevo texto &quot;Novedades&quot;. Se puede insertar un elemento o texto (nodo) como &uacute;ltimo hijo de un nodo ya existente usando el m&eacute;todo appendChild. Este m&eacute;todo coloca el nuevo nodo despu&eacute;s de todos los hijos del nodo. </p>
<div class="codigo">
<pre>
NuevoEnlace.appendChild(nodoTexto);
</pre>
</div>
<p>Ahora todo lo que se necesita es insertar el enlace en el cuerpo del documento. Para hacer esto, se necesita una referencia al elemento body del documento, teniendo como gu&iacute;a  los est&aacute;ndares  siguientes: </p>
<div class="codigo">
<pre>
var cuerpoRef = document.getElementsByTagName("body")[0];
cuerpoRef.appendChild(nuevoEnlace);
</pre>
</div>
<p>Otra manera ser&iacute;a utilizando el m&eacute;todo getElementById. Para ello se asume que la etiqueta &lt;body&gt;  tiene asignado un valor para el atributo id. </p>
<div class="codigo">
<pre>
&lt;body id=&rdquo;cuerpo&rdquo;&gt;
var cuerpoRef = document.getElementById("cuerpo");
cuerpoRef.appendChild(nuevoEnlace); </pre>
</div>
<p>Existen b&aacute;sicamente tres maneras mediante las cuales un nuevo elemento o nodo de texto puede ser insertado en una p&aacute;gina Web. Todo ello depende del punto en el cual se desee insertar el nuevo nodo: como &uacute;ltimo hijo de un elemento, antes de otro nodo o reemplazo para un nodo.</p>
<p> El caso de apertura de un nuevo hijo ya fue visto en el ejemplo anterior,  luego para insertar el nodo antes de otro nodo se realiza utilizando el m&eacute;todo insertBefore de su elemento padre, mientras que el reemplazo de nodo se utiliza el m&eacute;todo replaceChild de su elemento padre. </p>
<p>Al usar insertBefore, se necesita tener referencias al nodo que va ser insertado y donde va a ser insertado, consid&eacute;rese el siguiente c&oacute;digo HTML:</p>
<p>
<div class="codigo">
<pre>
&lt;p id="mwEnlaces"&gt;
&lt;a id="editor" href="editorial.html"&gt;Editorial&lt;/a&gt;
&lt;/p&gt;
</pre>
</div>
<p>Luego el nuevo enlace ser&aacute; insertado antes de enlace ya existente llamando el m&eacute;todo insertBefore desde el nodo padre (p&aacute;rrafo): </p>
<div class="codigo">
<pre>
var anclaTexto = document.createTextNode("Actualidad");
var nuevoAncla = document.createElement("a");
nuevoAncla.appendChild(anclaTexto);
var anclaExistente = document.getElementById("editor");
var padre = anclaExistente.parentNode;
var nuevoHijo = padre.insertBefore(nuevoAncla, anclaExistente);
</pre>
</div>
<p>Si se hiciera una traducci&oacute;n del DOM hacia HTML despu&eacute;s de esta operaci&oacute;n el resultado ser&iacute;a el siguiente: </p>
<div class="codigo">
<pre>
&lt;p id="mwEnlaces"&gt;
&lt;a&gt; Actualidad &lt;/a&gt;&lt;a id="editor" href="editorial.html"&gt;Editorial&lt;/a&gt;
&lt;/p&gt;
</pre>
</div>
<p>En el caso de reemplazar el enlace usando replaceChild: </p>
<div class="codigo">
<pre>
var nuevoHijo = padre.replaceChild(nuevoAncla, anclaExistente);
</pre>
</div>
<p>El DOM lucir&aacute; as&iacute;: </p>
<div class="codigo">
<pre>
&lt;p id="mwEnlaces"&gt;
&lt;a&gt; Actualidad &lt;/a&gt;
&lt;/p&gt;</pre>
</div>
<h3>Usando innerHTML</h3>
<p>En aplicaciones complejas donde es necesario crear varios elementos a la vez, el c&oacute;digo JavaScript generado puede ser extenso recurri&eacute;ndose a la propiedad innerHTML. Dicha propiedad fue introducida por <a href="http://www.maestrosdelweb.com/editorial/microsoft/">Microsoft</a>  permitiendo leer y escribir el contenido HTML de un elemento. </p>
<p>Por ejemplo, puede crearse f&aacute;cilmente una <a href="http://www.maestrosdelweb.com/editorial/tutsql11/">tabla</a> con m&uacute;ltiples celdas e insertarla luego en la p&aacute;gina con innerHTML: </p>
<div class="codigo">
<pre>
var tabla = '&lt;table border="0"&gt;';
tabla += '&lt;tr&gt;&lt;td&gt;Celda 1&lt;/td&gt;&lt;td&gt;Celda 2&lt;/td&gt;&lt;td&gt; Celda 3&lt;/td&gt;&lt;/tr&gt;';
tabla += '&lt;/table&gt;';
document.getElementById("datos").innerHTML = tabla;
</pre>
</div>
<h3>Eliminando un elemento o nodo de texto </h3>
<p>Se pueden eliminar  nodos existentes y nuevos. El m&eacute;todo removeChild permite eliminar nodos hijos a cualquier nodo con tan s&oacute;lo pasarle las referencias del nodo hijo [a] eliminar y su correspondiente padre.  Para mejor compresi&oacute;n ret&oacute;mese el ejemplo anterior: </p>
<div class="codigo">
<pre>
&lt;p id="mwEnlaces"&gt;
&lt;a id="editor" href="editorial.html"&gt;Editorial&lt;/a&gt;
&lt;/p&gt;
</pre>
</div>
<p>El m&eacute;todo removeChild ser&aacute; usado para eliminar el hiperv&iacute;nculo del elemento padre p&aacute;rrafo:</p>
<div class="codigo">
<pre>
var ancla = document.getElementById("editor");
var padre = ancla.parentNode;
var hijoRemovido = padre.removeChild(ancla);
</pre>
</div>
<p>La variable hijoRemovido todav&iacute;a hace referencia al elemento, de manera que fue removido pero no destruido, no pudi&eacute;ndose localizar en ninguna parte del DOM. Este se encuentra disponible en memoria como si fuera creado usando el m&eacute;todo createElement. Esto permite posicionarlo en cualquier otra parte de la p&aacute;gina.</p>
<h3>Lectura y escritura de los atributos de un elemento </h3>
<p>Las partes  m&aacute;s frecuentemente usadas de un elemento HTML son sus atributos, tales como: id, class, href., title, <a href="http://www.maestrosdelweb.com/editorial/cssplan/">estilos CSS</a>, entre muchas otras piezas de informaci&oacute;n que pueden se incluidas en una etiqueta HTML.</p>
<p>Los atributos de una etiqueta son traducidos por el navegador en propiedades de un objeto. Dos m&eacute;todos existen para leer y escribir los atributos de un elemento, getAttribute permite leer el valor de un atributo mientras que setAttribute permite su escritura.</p>
<p>En ocasiones se hace necesario ver las propiedades y m&eacute;todos de un determinado elemento, esto puede realizarse mediante la siguiente funci&oacute;n utilitaria: </p>
<div class="codigo">
<pre>
function inspector(el) {
var str =&rdquo;&rdquo;;
for (var i in el){
str+=I + &ldquo;: &rdquo; + el.getAttribute(i) + &ldquo;\n&rdquo;;
}
alert(str);
}
</pre>
</div>
<p>Para usar la funci&oacute;n inspector() tan s&oacute;lo debe pasarle la referencia al elemento, continuando con el ejemplo anterior resulta: </p>
<div class="codigo">
<pre>
var ancla = document.getElementById("editor");

inspector(ancla);
</pre>
</div>
<p>Para modificar el atributo title del hiperv&iacute;nculo, elemento referenciado por la variable ancla, se usar&aacute; el setAttribute, pas&aacute;ndole el nombre del atributo y el valor: </p>
<div class="codigo">
<pre>
var ancla = document.getElementById("editor");
ancla.setAttribute("title", "Artículos de programación");
var nuevoTitulo = ancla.getAttribute("title");
El valor de la variable nuevoTitulo es ahora &ldquo;Artículos de programación&rdquo;.
</pre>
</div>
<h3>Manipulando los estilos de los elementos </h3>
<p>Como se ha visto, los atributos que le son asignados a las etiquetas HTML est&aacute;n disponibles como propiedades de sus  correspondientes nodos en el DOM. Las propiedades de estilo pueden ser aplicadas a trav&eacute;s del DOM. </p>
<p>Cada atributo <a href="http://www.maestrosdelweb.com/editorial/introcss/">CSS</a> posee una propiedad del DOM equivalente, form&aacute;ndose con el mismo nombre del atributo CSS pero sin los guiones y llevando la primera letra de las palabras a may&uacute;sculas. V&eacute;ase el siguiente ejemplo para mayor entendimiento donde se utiliza un   atributo  CSS modelo:</p>
<div class="codigo">
<pre>
algun-atributo-css
</pre>
</div>
<p>Tendr&aacute; como equivalente la siguiente propiedad o m&eacute;todo en Javascript: </p>
<div class="codigo">
<pre>
algunAtributoCss
</pre>
</div>
<p>Por tanto, para cambiar  el atributo CSS font-family de un elemento, podr&iacute;a realizarse de lo siguiente:</p>
<div class="codigo">
<pre>
ancla.style.fontFamily = 'sans-serif';
</pre>
</div>
<p>Los valores CSS en Javascript  ser&aacute;n en su mayor&iacute;a del tipo cadena; por ejemplo: font-size, pues posee dimensiones  tales como &ldquo;px&rdquo;, &ldquo;%&rdquo;. S&oacute;lo los atributos completamente num&eacute;ricos, tales como z-index ser&aacute;n del tipo entero. </p>
<p>En muchos casos es necesario aparecer y desaparecer un determinado elemento, para ellos se utiliza el atributo CSS display, por ejemplo, para desaparecer: </p>
<div class="codigo">
<pre>
ancla.style.display = 'none';
</pre>
</div>
<p>Luego para volverlo a mostrar se le asigna otro valor: </p>
<div class="codigo">
<pre>
ancla.style.display = 'inline';
</pre>
</div>
<h3>Ejemplo: Adjuntar m&uacute;ltiples ficheros  a la vez </h3>
<p>Este es el primer ejemplo completo donde se propone utilizar la manipulaci&oacute;n del DOM mediante javascript   con el objetivo de adicionar tantos elementos input del tipo file como tantos ficheros se deseen subir al servidor.  </p>
<p>Se muestra una versi&oacute;n simplificada del problema limitada tan s&oacute;lo al lado del cliente. Para ello es necesario imaginarse un sistema en l&iacute;nea donde se suben ficheros al servidor, ejemplo de ello podr&iacute;a ser una aplicaci&oacute;n de <a href="http://www.maestrosdelweb.com/editorial/emailhis/">correo electr&oacute;nico</a>. </p>
<div class="codigo">
<pre>
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Ejemplo para adjuntar múltiples ficheros&lt;/title&gt;
&lt;script language="javascript" type="text/javascript"&gt;
function nuevoFichero() {
var input = document.getElementsByTagName("input")[0];
var nuevoInput = input.cloneNode(true);
input.parentNode.appendChild(nuevoInput);
}
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;form action=&#8221;upload.php&#8221; method=&#8221;post&#8221; enctype=&#8221;multipart/form-data&#8221;&gt;
&lt;fieldset&gt;&lt;legend&gt;Adjuntar múltiples ficheros&lt;/legend&gt;
&lt;input name=&#8221;ficheros[]&#8221; type=&#8221;file&#8221; size=&#8221;60&#8243; &gt;
&lt;/fieldset&gt;
&lt;a href=&#8221;javascript: nuevoFichero();&#8221;&gt;Adjuntar otro fichero&lt;/a&gt;&nbsp;&nbsp;&nbsp;
&lt;input name=&#8221;Subir&#8221; type=&#8221;submit&#8221; value=&#8221;Adjuntar&#8221; &gt;
&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
</div>
<p>El enlace para adjuntar otro fichero hace una llamada a la funci&oacute;n nuevoFichero() realiz&aacute;ndose las siguientes tareas en la misma:  </p>
<p> Se accede al primer elemento input encontrado en el documento: </p>
<div class="codigo">
<pre>
var input = document.getElementsByTagName("input")[0];
</pre>
</div>
<ul>
<li> Se crea un nuevo elemento input referenciado por la variable nuevoInput  utilizando el m&eacute;todo cloneNode resultando un elemento id&eacute;ntico  al primero:</li>
</ul>
<div class="codigo">
<pre>
var nuevoInput = input.cloneNode(true);
</pre>
</div>
<ul>
<li>  Aqu&iacute; se accede al nodo padre del elemento input mediante el m&eacute;todo parentNode y la vez se inserta un nuevo elemento  hijo copia del primero por medio del m&eacute;todo appendChild:</li>
</ul>
<div class="codigo">
<pre>
input.parentNode.appendChild(nuevoInput);
</pre>
</div>
<p>Es de notar que en este ejemplo podr&iacute;a haberse usado el evento clic  para  la llamada de la funci&oacute;n, si embargo se dej&oacute; reservado para cuando el tema de la manipulaci&oacute;n de eventos del DOM sea abordado. </p>
<h3>Ejemplo: Mostrador de  diapositivas </h3>
<p>Este ejemplo contempla un mostrador de diapositivas (en este caso im&aacute;genes). Se tienen dos enlaces, uno mostrar la diapositiva siguiente y otro para mostrar la diapositiva anterior. Una posible aplicaci&oacute;n pr&aacute;ctica podr&iacute;a ser en una galer&iacute;a de fotos. </p>
<div class="codigo">
<pre>
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"

"http://www.w3.org/TR/html4/strict.dtd"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Ejemplo de un mostrador de diapositivas&lt;/title&gt;
&lt;script type="text/javascript"&gt;
var contador = 0;
var diapositivas = [];
function inicio() {
var contenedor = document.getElementById(&#8221;diapositivas&#8221;);
while (contenedor.childNodes.length &gt; 0){
if (contenedor.getElementsByTagName(&#8221;img&#8221;)[0]==contenedor.firstChild){
diapositivas[diapositivas.length] = contenedor.removeChild(contenedor .firstChild);
}
else contenedor.removeChild(contenedor.firstChild);
}
}
function adelante() {
contador++;
if (contador &gt;= diapositivas.length) contador = 0;
ponerImagen()
}
function atras() {
contador&#8211;;
if (contador &lt; 0 ) contador = diapositivas.length - 1;
ponerImagen();
}
function ponerImagen() {
var contenedor = document.getElementById(&#8221;diapositivas&#8221;);
if (contenedor.childNodes.length==0)
contenedor.appendChild(diapositivas[contador]);
else contenedor.replaceChild(diapositivas[contador], contenedor.childNodes[0]);
}
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;a href=&#8221;javascript: atras();&#8221;&gt;Atrás&lt;/a&gt;
&lt;span id=&#8221;diapositivas&#8221;&gt;
&lt;img src=&#8221;diapositiva1.jpg&#8221; alt=&#8221;Diapositiva 1&#8243; height=&#8221;100&#8243; width=&#8221;200&#8243;&gt;
&lt;img src=&#8221;diapositiva2.jpg&#8221; alt=&#8221;Diapositiva 2&#8243; height=&#8221;100&#8243; width=&#8221;200&#8243;&gt;
&lt;img src=&#8221;diapositiva3.jpg&#8221; alt=&#8221;Diapositiva 3&#8243; height=&#8221;100&#8243; width=&#8221;200&#8243;&gt;
&lt;/span&gt;
&lt;a href=&#8221;javascript: adelante();&#8221;&gt;Adelante&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;
&lt;script type=&#8221;text/javascript&#8221;&gt;
inicio();
ponerImagen();
&lt;/script&gt;
</pre>
</div>
<p>Este ejemplo se analizar&aacute; de manera abreviada dejando un an&aacute;lisis detallado por parte del lector. Se tiene dos  variables globales,  contador y diapositivas, la primera para indicar la diapositiva que se est&aacute; mostrando actualmente y la &uacute;ltima para almacenar en un arreglo el conjunto de diapositivas a mostrar.</p>
<p>La funci&oacute;n inicio() remueve todos elementos img y los almacena. Es de notar que todo nodo hijo del nodo con id diapositivas par&aacute;sito (ejemplo: salto de l&iacute;nea) es eliminado para evitar un mal funcionamiento posterior. </p>
<p>Por otro lado la funci&oacute;n ponerImagen() se encarga de colocar la imagen apuntada por el contador en el contenedor de diapositivas. Mientras que las funciones atras() y adelante()  se encargan de decrementar e incrementar el contador respectivamente. </p>
<h3>Conclusi&oacute;n </h3>
<p>El presente material tan s&oacute;lo ha sido una  ligera aproximaci&oacute;n a la manipulaci&oacute;n del  Modelo de Objetos del Documento. Explorando el DOM se puede encontrar, cambiar, adicionar y eliminar elementos de un documento. Es sin duda alguna una  poderosa t&eacute;cnica para generar aplicaciones Web din&aacute;micas en el lado del cliente. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.maestrosdelweb.com/editorial/dom/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Programando un código HTML optimizado para motores de búsquedas</title>
		<link>http://www.maestrosdelweb.com/editorial/htmlmotoresbusq/</link>
		<comments>http://www.maestrosdelweb.com/editorial/htmlmotoresbusq/#comments</comments>
		<pubDate>Thu, 09 Nov 2006 00:00:00 +0000</pubDate>
		<dc:creator>Maikel González Suárez</dc:creator>
		
		<category><![CDATA[Editorial]]></category>

		<category><![CDATA[SEO]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Es importante la vinculación entre las tareas  de  programación y optimización de contenidos con el objetivo de lograr un  código HTML lo más amigable posible para los buscadores.
Cada d&#237;a se hace m&#225;s dif&#237;cil optimizar un sitio Web para motores de b&#250;squedas,&#160; se han desarrollado numerosas t&#233;cnicas con&#160; este objetivo,&#160; muchas de ellas [...]]]></description>
			<content:encoded><![CDATA[<p><span class="intro">Es importante la vinculación entre las tareas  de  programación y optimización de contenidos con el objetivo de lograr un  código HTML lo más amigable posible para los buscadores.</span><span id="more-364"></span></p>
<p>Cada d&iacute;a se hace m&aacute;s dif&iacute;cil optimizar un sitio Web para <a href="http://www.maestrosdelweb.com/editorial/optibasica/">motores de b&uacute;squedas</a>,&nbsp; se han desarrollado numerosas t&eacute;cnicas con&nbsp; este objetivo,&nbsp; muchas de ellas son pr&aacute;cticas no recomendadas pues se basan en t&eacute;cnicas poco &eacute;ticas. Utilizan las debilidades o huecos de los buscadores. </p>
<p>Las tareas de&nbsp; optimizaci&oacute;n&nbsp; tan s&oacute;lo se aplica a los contenidos a&ntilde;adidos&nbsp; a cada p&aacute;gina&nbsp; mientras que la programaci&oacute;n se hace totalmente separada sin aprovechar las bondades del lenguaje <a href="http://www.maestrosdelweb.com/editorial/htmlhis/">HTML</a> en tal sentido. </p>
<p>Por ello es importante que &nbsp;exista una vinculaci&oacute;n entre las tareas &nbsp;de&nbsp; programaci&oacute;n y optimizaci&oacute;n de contenidos con el objetivo de lograr un&nbsp; c&oacute;digo HTML&nbsp; lo m&aacute;s amigable posible para los <a href="http://www.maestrosdelweb.com/addurl/">buscadores</a>. </p>
<p>Este esfuerzo se puede revertir al invertir menos dinero y esfuerzo en campa&ntilde;as para lograr &nbsp;buena visibilidad en los resultados de b&uacute;squedas.</p>
<h3>&iquest;C&oacute;mo ven los motores de b&uacute;squedas los sitios?</h3>
<p>Una p&aacute;gina Web esta dividida en varios elementos: etiquetas HTML, textos, objetos incrustados, enlace a ficheros externos, etc. </p>
<p>Los motores de b&uacute;squeda analizan una p&aacute;gina Web&nbsp; mirando ante todo el texto. El texto esta dividido en diferentes &aacute;reas, cada una posee pesos diferentes para los motores de b&uacute;squedas. </p>
<p>Por ejemplo: el texto&nbsp; que aparece&nbsp; como t&iacute;tulo, en el cuerpo de la p&aacute;gina, el texto alternativo de la etiqueta de una imagen, el que aparece como t&iacute;tulo en los enlaces. Los motores de b&uacute;squedas leen todas esas diferentes &aacute;reas y &nbsp;adicionan la p&aacute;gina a sus bases de datos.</p>
<h3>Validar el HTML</h3>
<p>Los motores de b&uacute;squedas tienen que analizar el c&oacute;digo HTML de&nbsp; un sitio Web para encontrar el contenido relevante. S&iacute; el c&oacute;digo HTML posee errores los motores de b&uacute;squeda puede que no sean capaces de encontrar todo en la p&aacute;gina.</p>
<p>Los programas de los motores de&nbsp; b&uacute;squedas asimilan al HTML est&aacute;ndar.&nbsp; Estos &nbsp;s&oacute;lo son capaces&nbsp; de indexar&nbsp; los sitios que est&eacute;n acorde a los &nbsp;est&aacute;ndares del HTML. </p>
<p>  En la mayor&iacute;a de los buscadores m&aacute;s&nbsp; importantes pueden ocuparse de errores peque&ntilde;os en el c&oacute;digo del HTML, un solo error puede ser la raz&oacute;n para que la p&aacute;gina Web no se pueda encontrar en motores de b&uacute;squeda. </p>
<h3>Maquetear usando CSS en lugar de tablas</h3>
<p>Cuando el <a href="http://www.maestrosdelweb.com/editorial/rasrobot/">robot</a> que &ldquo;rastrea&rdquo; (ejemplo: Googlebot) una p&aacute;gina Web&nbsp; cuyo montaje esta basado en <a href="http://www.maestrosdelweb.com/editorial/tutsql11/">tablas</a> encuentra varias etiquetas &lt;tr&gt; y&nbsp; &lt;td&gt; con varios atributos en ellas tales como tama&ntilde;os de las celdas, ancho, color de fondo entre otras informaciones nada relevantes. </p>
<p>En muchos casos los &nbsp;robots &nbsp;ignoran todo esto pero&nbsp; les hace tomar tiempo para encontrar el&nbsp; contenido verdadero de la p&aacute;gina pudiendo interrumpir el proceso. Un par&aacute;metro importante es la relaci&oacute;n texto c&oacute;digo HTML. </p>
<p>Esto sin contar que numerosas tablas anidadas trae consigo una demora notable en los navegadores Web y trae problemas notables en los lectores de la accesibilidad donde el contenido no tiene ning&uacute;n sentido ser le&iacute;do por una herramienta de accesibilidad pues&nbsp; el&nbsp; contenido generalmente no sigue el flujo del documento.</p>
<p>En realidad las tablas fueron hechas para tabular datos, de otra manera no se justifica su uso. A continuaci&oacute;n se muestra una maqueta muy simple usando la etiqueta &lt;div&gt;:</p>
<p>
<div class="codigo">
<pre>
&lt;div id=&quot;container&quot;&gt;
  &nbsp;&nbsp; &lt;div id=&quot;body&quot;&gt;Contenido del documento&lt;/div&gt;&nbsp;
  &nbsp;&nbsp; &lt;div id=&quot;head&quot;&gt;Contenido de la cabecera&lt;/div&gt;
  &lt;/div&gt;
</pre>
</div>
<p>Con todo esto se busca separar al m&aacute;ximo el contenido de la forma de presentaci&oacute;n, o sea que el robot vea HTML puro. Los robot le dan la importancia al contenido que aparece inmediatamente despu&eacute;s de la etiqueta &lt;body&gt;&nbsp; por lo que usando correctamente <a href="http://www.maestrosdelweb.com/editorial/introcss/">CSS</a> el contenido m&aacute;s importante&nbsp; puede colocarse en esta posici&oacute;n, para ello veamos un ejemplo simplificado:</p>
<div class="codigo">
<pre>
#container
  {
  &nbsp;&nbsp;&nbsp;&nbsp; position: relative;
  }
#body, #head
  {
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; position: absolute;
  &nbsp;}
#body
  {
  &nbsp;&nbsp;&nbsp;&nbsp; top: 100px;
  }
#head
  {
  &nbsp;&nbsp;&nbsp;&nbsp; top: 0px;
  }
</pre>
</div>
<p>De&nbsp; manera visual el contenido aparecer&aacute;&nbsp; despu&eacute;s de la cabecera, aunque &nbsp;en el c&oacute;digo HTML aparece primero; vemos de esta manera la potencia y la flexibilidad con respecto al uso de tablas. </p>
<p>De la misma forma se pueden mover partes como barras de navegaci&oacute;n, cajas de b&uacute;squedas e incluso im&aacute;genes al final del c&oacute;digo sin perder la visualizaci&oacute;n correcta en el navegador.</p>
<h3>Impacto de las&nbsp; etiquetas HTML en la optimizaci&oacute;n para motores de b&uacute;squedas</h3>
<p>Analizando &nbsp;la estructura l&oacute;gica de un documento &nbsp;HTML y el impacto de cada una de la etiquetas &nbsp;HTML en&nbsp; t&eacute;rminos&nbsp;&nbsp; de optimizaci&oacute;n para motores de b&uacute;squedas, se presenta la siguiente tabla:</p>
<p><img src="http://www.maestrosdelweb.com/images/editorial/tablacode.jpg" width="301" height="361" class="centro" /></p>
<p>Por tanto se sugiere utilizar un flujo de etiquetas HTML para mostrar el contenido de una p&aacute;gina tal como aparece a continuaci&oacute;n utilizando encabezados y p&aacute;rrafos:</p>
<p>
<div class="codigo">
<pre>
 &lt;h1&gt;T&oacute;pico principal&lt;/h1&gt;
  &nbsp;&nbsp;&nbsp; &lt;p&gt;Texto inicial&lt;/p&gt;
  &nbsp;&nbsp;&nbsp; &lt;h2&gt;Puntos secundarios&lt;/h2&gt;
  &nbsp;&nbsp;&nbsp; &lt;p&gt;Texto relevante&lt;/p&gt;
</pre>
</div>
<p>Una o dos&nbsp; palabras clave colocadas en una etiqueta&nbsp; &lt;h1&gt; inmediatamente despu&eacute;s de que la etiqueta &lt;body&gt; le&nbsp; da mayor relevancia en&nbsp; diversos buscadores. </p>
<p>V&eacute;ase un ejemplo donde el enlace a la p&aacute;gina de inicio a trav&eacute;s del logotipo del sitio&nbsp; contiene una palabra clave, el texto no ser&aacute; visible al usuario, pues desaparece usando la propiedad text-indent.</p>
<p>
<div class="codigo">
<pre>&lt;body&gt;
  &lt;h1&gt;&lt;a href=&quot;/&quot; title=&quot;Regresar a la p&aacute;gina principal&quot; accesskey= 	&quot;1&quot;&gt;Logotipo del sitio&lt;/a&gt;&lt;/h1&gt;
h1 a &nbsp;{  display: block;
  width: 100px;
  height: 100px;
  background: transparent url(&quot;images/logo.gif&quot;) no-repeat;
  text-indent: -1000px;
  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
</pre>
</div>
<p>Es recomendable poner las im&aacute;genes como im&aacute;genes de fondo en el fichero CSS as&iacute; se evita la necesidad de poner la etiqueta &lt;img&gt; en el HTML. Cuanto m&aacute;s simple sea leer el c&oacute;digo, ser&aacute;&nbsp; m&aacute;s eficientemente la p&aacute;gina a la vista del robot. </p>
<p>Como norma com&uacute;n para la mayor&iacute;a de los motores de b&uacute;squedas las p&aacute;ginas no deben exceder en tama&ntilde;o los 100 k para una correcta indexaci&oacute;n, teniendo por ideal 5-15 k.</p>
<h3>Evitando men&uacute;s de navegaci&oacute;n basados completamente en JavaScript</h3>
<p>Resultan&nbsp; atractivos &nbsp;&nbsp;los men&uacute;s&nbsp; de navegaci&oacute;n multiniveles con efectos,&nbsp; pues hacen m&aacute;s din&aacute;mico el sitio sin embargo en muchos casos est&aacute;n implementados completamente con JavaScript; esto trae como consecuencia que los robot no los procesen y &nbsp;se pierdan los enlaces contenidos en el mismo. </p>
<p>Mediante el uso de &nbsp;las <a href="http://www.maestrosdelweb.com/editorial/scrollcss/">hojas de estilos</a>&nbsp; es posible lograr un funcionamiento similar de manera que los enlaces sean amigables a los motores de b&uacute;squeda.&nbsp; Una t&eacute;cnica muy utilizada es el uso de las lista no numeradas en su implementaci&oacute;n, tal como aparece en el siguiente ejemplo:</p>
<p><div class="codigo">
<pre>&lt;div id=&quot;navigation&quot;&gt;
  &lt;h3&gt;&lt;a href=&quot;#&quot;&gt;Categor&iacute;a 1&lt;/a&gt;&lt;/h3&gt;
  &nbsp; &lt;ul&gt;
  &nbsp;&nbsp;&nbsp; &lt;li&gt;&lt;a href=&quot;#&quot;&gt;Subcategor&iacute;a 1&lt;/a&gt;&lt;/li&gt; />
  &nbsp;&nbsp;&nbsp; &lt;li&gt;&lt;a href=&quot;#&quot;&gt; Subcategor&iacute;a 2&lt;/a&gt;&lt;/li&gt;
  &nbsp;&lt;/ul&gt;
  ...
  &lt;/div&gt;
</pre>
</div>
<p>&nbsp;El JavaScript no es comprensible &nbsp;por los buscadores, tan solo son capaz de sacar algunas URLs en medio del c&oacute;digo JavaScript por lo que no se recomienda su uso en tal sentido. Usar el CSS permitir&aacute; que utilizar palabras claves con mayor eficacia.</p>
<h3>Cuidado con el uso de AJAX</h3>
<p>Una poderosa t&eacute;cnica que aumenta las potencialidades de un sitio Web es <a href="http://www.maestrosdelweb.com/editorial/ajax/">AJAX</a>, a trav&eacute;s de ella se pueden hacer peticiones al servidor sin tener que recargar la p&aacute;gina &nbsp;actual por la nueva, ahora cuando los datos pedidos son contenidos que deber&iacute;an ser indexados por los buscadores estamos ante un grave problema.</p>
<p>Realmente el &nbsp;problema &nbsp;es similar al anteriormente visto pues AJAX es el resultado de una serie de tecnolog&iacute;as dentro de las cuales est&aacute; JavaScript y &nbsp;otras como: DOM, <a href="http://www.maestrosdelweb.com/editorial/usarcss/">CSS</a> y <a href="http://www.maestrosdelweb.com/editorial/ajaxpaso/">XMLHttpRequest</a>. </p>
<p>Por lo que se sugiere &nbsp;utilizar AJAX&nbsp; en aplicaciones &nbsp;donde los contenidos no tienen gran importancia para los motores de b&uacute;squedas, tales como formularios ya sea para &nbsp;enviar o&nbsp; validar datos, sugerir criterios de b&uacute;squedas, cargar de imagen (galer&iacute;as de fotos, mapas).</p>
<p>Es una herramienta poderosa para aquellos sitios que brindan la posibilidad de personalizaci&oacute;n de la p&aacute;gina de inicio (ejemplo: <a href="http://www.maestrosdelweb.com/editorial/googlehis/">Google</a>), interfaz de administraci&oacute;n.</p>
<h3>Conclusi&oacute;n</h3>
<p>Usando adecuadamente&nbsp; cada etiqueta HTML para mostrar en contenido puede lograrse un c&oacute;digo correctamente descrito para los buscadores.</p>
<p>Es importante mantener una relaci&oacute;n texto a HTML muy alta por lo que la presentaci&oacute;n visual de una p&aacute;gina dada por las CSS y los efectos por JavaScript deben estar en ficheros externos pues su contenido es irrelevante a los buscadores. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.maestrosdelweb.com/editorial/htmlmotoresbusq/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
