<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://mexpedia.org/index.php?action=history&amp;feed=atom&amp;title=JavaScript_no_obstructivo</id>
	<title>JavaScript no obstructivo - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://mexpedia.org/index.php?action=history&amp;feed=atom&amp;title=JavaScript_no_obstructivo"/>
	<link rel="alternate" type="text/html" href="https://mexpedia.org/index.php?title=JavaScript_no_obstructivo&amp;action=history"/>
	<updated>2026-10-11T10:09:04Z</updated>
	<subtitle>Historial de revisiones de esta página en la wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://mexpedia.org/index.php?title=JavaScript_no_obstructivo&amp;diff=468634&amp;oldid=prev</id>
		<title>imported&gt;ZebaX: Desambiguando enlaces a Prototype  (enlace cambiado a Prototype (framework)) con DisamAssist.</title>
		<link rel="alternate" type="text/html" href="https://mexpedia.org/index.php?title=JavaScript_no_obstructivo&amp;diff=468634&amp;oldid=prev"/>
		<updated>2024-12-08T21:38:39Z</updated>

		<summary type="html">&lt;p&gt;Desambiguando enlaces a &lt;a href=&quot;/index.php?title=Prototype&quot; title=&quot;Prototype&quot;&gt;Prototype&lt;/a&gt;  (enlace cambiado a &lt;a href=&quot;/index.php?title=Prototype_(framework)&quot; title=&quot;Prototype (framework)&quot;&gt;Prototype (framework)&lt;/a&gt;) con &lt;a href=&quot;/index.php?title=Usuario:Qwertyytrewqqwerty/DisamAssist&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Usuario:Qwertyytrewqqwerty/DisamAssist (la página no existe)&quot;&gt;DisamAssist&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;JavaScript no obstructivo&amp;#039;&amp;#039;&amp;#039; es un [[paradigma]] floreciente en el uso del [[lenguaje de programación]] [[JavaScript]], utilizado en la [[World Wide Web|Web]]. Aunque el término no se define formalmente, sus principios generalmente incluyen:&lt;br /&gt;
&lt;br /&gt;
* [[Separación de intereses|Separación]] de la funcionalidad JavaScript (la &amp;quot;capa del comportamiento&amp;quot;) de las capas de estructura/contenido y de presentación de una página.&lt;br /&gt;
* Uso de [[buenas prácticas]] a fin de evitar los problemas de incompatibilidad de la programación tradicional en JavaScript (tales como inconsistencias entre [[navegador web|navegadores]] y falta de [[escalabilidad]])&lt;br /&gt;
&lt;br /&gt;
== La necesidad de un nuevo paradigma ==&lt;br /&gt;
&lt;br /&gt;
JavaScript ha tenido durante mucho tiempo la reputación de lenguaje torpe e inadecuado para el desarrollo serio. Esto ha sido en gran parte debido a las implementaciones incompatibles del lenguaje y del [[Document Object Model|DOM]] en varios navegadores, y al uso extenso de código &amp;quot;pegado&amp;quot; lleno de errores por parte de los aficionados. Los errores en [[tiempo de ejecución]] eran tan frecuentes y difíciles de solucionar que pocos programadores intentaban corregirlos.&lt;br /&gt;
&lt;br /&gt;
La reciente aparición de navegadores con un soporte adecuado de los [[estándares web]], [[Framework|frameworks]] para JavaScript tales como [[Prototype (framework)|Prototype]] o [[JQuery]], y herramientas de [[depuración de código|depuración]] de alta calidad han facilitado enormemente la creación de código organizado y escalable en JavaScript, y la aparición de [[AJAX]] lo ha hecho esencial. Mientras hasta hace poco JavaScript era solo utilizado para las tareas relativamente simples y no críticas (validación de formularios y decoraciones llamativas), actualmente se está utilizando para escribir código complejo que a menudo es responsable de buena parte de la funcionalidad básica de un sitio. Los errores en tiempo de ejecución y el comportamiento imprevisible ya no son molestias de menor importancia; son errores fatales.&lt;br /&gt;
&lt;br /&gt;
El JavaScript no obstructivo se puede considerar como parte del movimiento a favor de los [[estándares web]]. Así como la demanda de compatibilidad de los navegadores ha conducido al aumento de estandarización de código y estilo, la demanda creciente de [[Rich Internet Application|aplicaciones ricas]] está haciendo necesarios los métodos más robustos de JavaScript no obstructivo.&lt;br /&gt;
&lt;br /&gt;
== Separando comportamiento y contenido ==&lt;br /&gt;
&lt;br /&gt;
Tradicionalmente, se ha escrito el javascript en línea, como parte del contenido de un documento [[HTML]]. Por ejemplo, lo siguiente es una práctica típica de validación de formularios JavaScript:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;fecha&amp;quot; onchange=&amp;quot;validateDate(this);&amp;quot; /&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pero el propósito de HTML es describir la estructura de un documento, no su comportamiento programático. Combinar los dos afecta negativamente la facilidad de mantenimiento, a la [[Accesibilidad web|accesibilidad]] y a la velocidad de carga del documento (los archivos JavaScript externos suelen guardarse en [[caché]] para posteriores visitas); por lo tanto es una mala práctica. Lo recomendable es enlazar un archivo externo que contenga código JavaScript desde el HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;archivoJavascript.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La solución no invasiva al código superior podría ser la siguiente: Definir una función que valide un formato de fecha determinado (&amp;#039;&amp;#039;validaFecha()&amp;#039;&amp;#039;), y asociar el formulario que contiene el campo (&amp;#039;&amp;#039;formulario&amp;#039;&amp;#039;) con dicha función mediante un evento concreto (evento &amp;#039;&amp;#039;submit&amp;#039;&amp;#039;) gracias al [[Document Object Model|DOM]]. En este ejemplo se asocia la función &amp;#039;&amp;#039;validaFecha(campo)&amp;#039;&amp;#039; al campo con id &amp;#039;&amp;#039;campoFecha&amp;#039;&amp;#039; mediante el método DOM del objeto &amp;#039;&amp;#039;document&amp;#039;&amp;#039; &amp;#039;&amp;#039;getElementById()&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form name=&amp;quot;formulario&amp;quot; action=&amp;quot;recibidor.php&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;fecha&amp;quot; id=&amp;quot;campoFecha&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Enviar&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Función que valida un formato de fecha concreto. &lt;br /&gt;
// Devolverá true o false en función de la evaluación&lt;br /&gt;
function validaFecha() {&lt;br /&gt;
	// Buscamos el elemento con id &amp;quot;campoFecha&amp;quot;&lt;br /&gt;
	var elCampo = document.getElementById(&amp;quot;campoFecha&amp;quot;); &lt;br /&gt;
	// Contenido de la función que validará que el formato de elCampo.value &lt;br /&gt;
	// sea el esperado con expresiones regulares. En este caso únicamente (dd/dd/dddd)&lt;br /&gt;
	var resultado = /^\d{2}\/\d{2}\/\d{4}$/.test( elCampo.value );&lt;br /&gt;
	if( resultado )		// caso positivo&lt;br /&gt;
		return resultado;&lt;br /&gt;
	else {			 // caso negativo&lt;br /&gt;
		alert(&amp;quot;El formato de fecha es dd/dd/dddd&amp;quot;);&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
// Función que añade un evento a un objeto del DOM &lt;br /&gt;
// válida tanto para el código propietario de IE &lt;br /&gt;
// como para el estándar definido por la W3C&lt;br /&gt;
function listen(event, elem, func) {&lt;br /&gt;
	if (elem.addEventListener)			// W3C DOM&lt;br /&gt;
		return elem.addEventListener(event,func,false);&lt;br /&gt;
	else if (elem.attachEvent)			// IE DOM&lt;br /&gt;
		return elem.attachEvent(&amp;quot;on&amp;quot;+event, func);&lt;br /&gt;
	else {&lt;br /&gt;
		throw &amp;quot;No es posible añadir evento&amp;quot;;&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Asociamos al evento submit del formulario la función validaFecha&lt;br /&gt;
var elFormulario = document.forms[&amp;quot;formulario&amp;quot;];&lt;br /&gt;
listen(&amp;quot;submit&amp;quot;, elFormulario, validaFecha);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es importante tener en cuenta que si JavaScript está desactivado o no está disponible en el agente del cliente el funcionamiento que se espera del HTML quedará intacto, y el formulario funcionará sin problemas. En caso de tener disponible javascript se complementará la funcionalidad. Es una buena práctica que mejora la accesibilidad.&lt;br /&gt;
&lt;br /&gt;
== Mejorando las prácticas ==&lt;br /&gt;
&lt;br /&gt;
Aunque la esencia JavaScript no obstructivo es el concepto de una capa separada del comportamiento, los seguidores del paradigma suscriben generalmente los principios relacionados, por ejemplo:&lt;br /&gt;
&lt;br /&gt;
* La adherencia estricta al [[W3C]] DOM y modelo de evento, y evasión de extensiones específicas para un navegador.&lt;br /&gt;
* Las buenas prácticas de JavaScript a menudo van acorde a las de otros lenguajes de programación, tales como el [[Encapsulamiento (programación orientada a objetos)|encapsulamiento]] y la [[Abstracción (programación orientada a objetos)|abstracción]], evasión de variables globales, convenciones de nombramiento significativas, uso de los patrones apropiados del diseño, y prueba sistemática. Tales principios son esenciales para el [[desarrollo de software]] en gran escala, pero no se han observado extensamente en JavaScript en el pasado; su adopción se considera como componente esencial de la transición de JavaScript de un lenguaje &amp;quot;juguete&amp;quot; a una herramienta para el desarrollo serio.&lt;br /&gt;
&lt;br /&gt;
== Véase también ==&lt;br /&gt;
* [[JavaScript]]&lt;br /&gt;
* [[AJAX]]&lt;br /&gt;
* [[Web 2.0]]&lt;br /&gt;
&lt;br /&gt;
== Enlaces externos ==&lt;br /&gt;
* [http://www.onlinetools.org/articles/unobtrusivejavascript/ JavaScript no obstructivo (en inglés)]&lt;br /&gt;
* [http://alistapart.com/articles/behavioralseparation A List Apart: Separando el comportamiento (en inglés)]&lt;br /&gt;
* [http://www.ujs4rails.com/ JavaScript no obstructivo para Ruby on Rails (en inglés)]&lt;br /&gt;
* [http://www.bennolan.com/behaviour/ Behaviour], una biblioteca que facilita el desarrollo de JavaScript no obstructivo (en inglés)&lt;br /&gt;
* [https://web.archive.org/web/20080912031502/http://developer.mozilla.org/es/JavaScript_no_obstructivo JavaScript no obstructivo en Mozilla Developer Center]&lt;br /&gt;
* [http://www.anieto2k.com/2006/10/15/javascript-no-obstructivo-manual-de-buenas-maneras/ Javascript no obstructivo, manual de buenas maneras] (en castellano)&lt;br /&gt;
&lt;br /&gt;
{{Control de autoridades}}&lt;br /&gt;
[[Categoría:Desarrollo web]]&lt;br /&gt;
[[Categoría:JavaScript]]&lt;/div&gt;</summary>
		<author><name>imported&gt;ZebaX</name></author>
	</entry>
</feed>