{"id":5640,"date":"2013-06-11T09:41:25","date_gmt":"2013-06-11T14:41:25","guid":{"rendered":"http:\/\/webirix.com\/?p=5640"},"modified":"2013-06-11T09:41:25","modified_gmt":"2013-06-11T14:41:25","slug":"propiedades-basicas-de-formularios-y-elementos-de-javascript","status":"publish","type":"post","link":"https:\/\/webirix.com\/en\/propiedades-basicas-de-formularios-y-elementos-de-javascript\/","title":{"rendered":"Basic properties of JavaScript forms and elements"},"content":{"rendered":"<h1 id=\"propiedades_basicas_de_formularios_y_elementos\"><span style=\"color: #2c2b2b;font-size: 12px;font-weight: normal;line-height: 18px\">JavaScript dispone de numerosas propiedades y funciones que facilitan la programaci\u00f3n de aplicaciones que manejan formularios. En primer lugar, cuando se carga una p\u00e1gina web, el navegador crea autom\u00e1ticamente un array llamado\u00a0<\/span><code style=\"color: #2c2b2b;font-size: 12px;font-weight: normal;line-height: 18px\">forms<\/code><span style=\"color: #2c2b2b;font-size: 12px;font-weight: normal;line-height: 18px\">\u00a0y que contiene la referencia a todos los formularios de la p\u00e1gina.<\/span><\/h1>\n<p>Para acceder al array\u00a0<code>forms<\/code>, se utiliza el objeto\u00a0<code>document<\/code>, por lo que\u00a0<code>document.forms<\/code>\u00a0es el array que contiene todos los formularios de la p\u00e1gina. Como se trata de un array, el acceso a cada formulario se realiza con la misma sintaxis de los arrays. La siguiente instrucci\u00f3n accede al primer formulario de la p\u00e1gina:<\/p>\n<div>\n<pre>document.forms[0];<\/pre>\n<\/div>\n<p>Adem\u00e1s del array de formularios, el navegador crea autom\u00e1ticamente un array llamado\u00a0<code>elements<\/code>por cada uno de los formularios de la p\u00e1gina. Cada array\u00a0<code>elements<\/code>\u00a0contiene la referencia a todos los elementos (cuadros de texto, botones, listas desplegables, etc.) de ese formulario. Utilizando la sintaxis de los arrays, la siguiente instrucci\u00f3n obtiene el primer elemento del primer formulario de la p\u00e1gina:<\/p>\n<div>\n<pre>document.forms[0].elements[0];<\/pre>\n<\/div>\n<p>La sintaxis de los arrays no siempre es tan concisa. El siguiente ejemplo muestra c\u00f3mo obtener directamente el \u00faltimo elemento del primer formulario de la p\u00e1gina:<\/p>\n<div>\n<pre>document.forms[0].elements[document.forms[0].elements.length-1];<\/pre>\n<\/div>\n<p>Aunque esta forma de acceder a los formularios es r\u00e1pida y sencilla, tiene un inconveniente muy grave. \u00bfQu\u00e9 sucede si cambia el dise\u00f1o de la p\u00e1gina y en el c\u00f3digo HTML se cambia el orden de los formularios originales o se a\u00f1aden nuevos formularios? El problema es que\u00a0<em>&#8220;el primer formulario de la p\u00e1gina&#8221;<\/em>\u00a0ahora podr\u00eda ser otro formulario diferente al que espera la aplicaci\u00f3n.<\/p>\n<p>En un entorno tan cambiante como el dise\u00f1o web, es muy dif\u00edcil confiar en que el orden de los formularios se mantenga estable en una p\u00e1gina web. Por este motivo, siempre deber\u00eda evitarse el acceso a los formularios de una p\u00e1gina mediante el array\u00a0<code>document.forms<\/code>.<\/p>\n<p>Una forma de evitar los problemas del m\u00e9todo anterior consiste en acceder a los formularios de una p\u00e1gina a trav\u00e9s de su nombre (atributo\u00a0<code>name<\/code>) o a trav\u00e9s de su atributo\u00a0<code>id<\/code>. El objeto\u00a0<code>document<\/code>permite acceder directamente a cualquier formulario mediante su atributo\u00a0<code>name<\/code>:<\/p>\n<div>\n<pre>var formularioPrincipal = document.formulario;\r\nvar formularioSecundario = document.otro_formulario;\r\n\r\n&lt;form name=\"formulario\" &gt;\r\n  ...\r\n&lt;\/form&gt;\r\n\r\n&lt;form name=\"otro_formulario\" &gt;\r\n  ...\r\n&lt;\/form&gt;<\/pre>\n<\/div>\n<p>Accediendo de esta forma a los formularios de la p\u00e1gina, el script funciona correctamente aunque se reordenen los formularios o se a\u00f1adan nuevos formularios a la p\u00e1gina. Los elementos de los formularios tambi\u00e9n se pueden acceder directamente mediante su atributo\u00a0<code>name<\/code>:<\/p>\n<div>\n<pre>var formularioPrincipal = document.formulario;\r\nvar primerElemento = document.formulario.elemento;\r\n\r\n&lt;form name=\"formulario\"&gt;\r\n  &lt;input type=\"text\" name=\"elemento\" \/&gt;\r\n&lt;\/form&gt;<\/pre>\n<\/div>\n<p>Obviamente, tambi\u00e9n se puede acceder a los formularios y a sus elementos utilizando las funciones DOM de acceso directo a los nodos. El siguiente ejemplo utiliza la habitual funci\u00f3n<code>document.getElementById()<\/code>\u00a0para acceder de forma directa a un formulario y a uno de sus elementos:<\/p>\n<div>\n<pre>var formularioPrincipal = document.getElementById(\"formulario\");\r\nvar primerElemento = document.getElementById(\"elemento\");\r\n\r\n&lt;form name=\"formulario\" id=\"formulario\" &gt;\r\n  &lt;input type=\"text\" name=\"elemento\" id=\"elemento\" \/&gt;\r\n&lt;\/form&gt;<\/pre>\n<\/div>\n<p>Independientemente del m\u00e9todo utilizado para obtener la referencia a un elemento de formulario, cada elemento dispone de las siguientes propiedades \u00fatiles para el desarrollo de las aplicaciones:<\/p>\n<ul>\n<li><code>type<\/code>: indica el tipo de elemento que se trata. Para los elementos de tipo\u00a0<code>&lt;input&gt;<\/code>\u00a0(<code>text<\/code>,<code>button<\/code>,\u00a0<code>checkbox<\/code>, etc.) coincide con el valor de su atributo\u00a0<code>type<\/code>. Para las listas desplegables normales (elemento\u00a0<code>&lt;select&gt;<\/code>) su valor es\u00a0<code>select-one<\/code>, lo que permite diferenciarlas de las listas que permiten seleccionar varios elementos a la vez y cuyo tipo es\u00a0<code>select-multiple<\/code>. Por \u00faltimo, en los elementos de tipo\u00a0<code>&lt;textarea&gt;<\/code>, el valor de\u00a0<code>type<\/code>\u00a0es\u00a0<code>textarea<\/code>.<\/li>\n<li><code>form<\/code>: es una referencia directa al formulario al que pertenece el elemento. As\u00ed, para acceder al formulario de un elemento, se puede utilizar<code>document.getElementById(\"id_del_elemento\").form<\/code><\/li>\n<li><code>name<\/code>: obtiene el valor del atributo\u00a0<code>name<\/code>\u00a0de XHTML. Solamente se puede leer su valor, por lo que no se puede modificar.<\/li>\n<li><code>value<\/code>: permite leer y modificar el valor del atributo\u00a0<code>value<\/code>\u00a0de XHTML. Para los campos de texto (<code>&lt;input type=\"text\"&gt;<\/code>\u00a0y\u00a0<code>&lt;textarea&gt;<\/code>) obtiene el texto que ha escrito el usuario. Para los botones obtiene el texto que se muestra en el bot\u00f3n. Para los elementos\u00a0<em>checkbox<\/em>\u00a0y\u00a0<em>radiobutton<\/em>no es muy \u00fatil, como se ver\u00e1 m\u00e1s adelante<\/li>\n<\/ul>\n<p>Por \u00faltimo, los eventos m\u00e1s utilizados en el manejo de los formularios son los siguientes:<\/p>\n<ul>\n<li><code>onclick<\/code>: evento que se produce cuando se pincha con el rat\u00f3n sobre un elemento. Normalmente se utiliza con cualquiera de los tipos de botones que permite definir XHTML (<code>&lt;input type=\"button\"&gt;<\/code>,\u00a0<code>&lt;input type=\"submit\"&gt;<\/code>,\u00a0<code>&lt;input type=\"image\"&gt;<\/code>).<\/li>\n<li><code>onchange<\/code>: evento que se produce cuando el usuario cambia el valor de un elemento de texto (<code>&lt;input type=\"text\"&gt;<\/code>\u00a0o\u00a0<code>&lt;textarea&gt;<\/code>). Tambi\u00e9n se produce cuando el usuario selecciona una opci\u00f3n en una lista desplegable (<code>&lt;select&gt;<\/code>). Sin embargo, el evento s\u00f3lo se produce si despu\u00e9s de realizar el cambio, el usuario\u00a0<em>pasa<\/em>\u00a0al siguiente campo del formulario, lo que t\u00e9cnicamente se conoce como que\u00a0<em>&#8220;el otro campo de formulario ha perdido el foco&#8221;<\/em>.<\/li>\n<li><code>onfocus<\/code>: evento que se produce cuando el usuario selecciona un elemento del formulario.<\/li>\n<li><code>onblur<\/code>: evento complementario de\u00a0<code>onfocus<\/code>, ya que se produce cuando el usuario ha<em>deseleccionado<\/em>\u00a0un elemento por haber seleccionado otro elemento del formulario. T\u00e9cnicamente, se dice que el elemento anterior\u00a0<em>&#8220;ha perdido el foco&#8221;<\/em>.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>JavaScript has many properties and functions that make it easy to program applications that handle forms. First, when a web page is loaded, the browser automatically creates an array called forms and that contains the reference to all the forms on the page. To access the forms array, the document object is used, so document.forms is the ...<\/p>","protected":false},"author":9,"featured_media":5644,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-5640","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry"],"jetpack_featured_media_url":"https:\/\/webirix.com\/wp-content\/uploads\/2013\/06\/javascript.jpg","_links":{"self":[{"href":"https:\/\/webirix.com\/en\/wp-json\/wp\/v2\/posts\/5640","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webirix.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webirix.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webirix.com\/en\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/webirix.com\/en\/wp-json\/wp\/v2\/comments?post=5640"}],"version-history":[{"count":1,"href":"https:\/\/webirix.com\/en\/wp-json\/wp\/v2\/posts\/5640\/revisions"}],"predecessor-version":[{"id":5645,"href":"https:\/\/webirix.com\/en\/wp-json\/wp\/v2\/posts\/5640\/revisions\/5645"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webirix.com\/en\/wp-json\/wp\/v2\/media\/5644"}],"wp:attachment":[{"href":"https:\/\/webirix.com\/en\/wp-json\/wp\/v2\/media?parent=5640"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webirix.com\/en\/wp-json\/wp\/v2\/categories?post=5640"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webirix.com\/en\/wp-json\/wp\/v2\/tags?post=5640"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}