jump to navigation

Orientación a Objetos en JavaScript Miércoles, 11 febrero 2009

Posted by israelof in Implementación.
add a comment

Aunque el título de este post pueda indicar que vamos a hablar de cómo implementar toda la metodología de Orientación a Objetos en JavaScript, no es así. Ya existe multitud de lugares donde hay gran cantidad de literatura que hablan de este tema.

Lo que pretendemos, es mostrar el modo que hemos utilizado nosotros para implementar la orientación a objetos, y es que, si buscáis un poco, veréis como existen diferentes formas de llavarlo a cabo.

El siguiente código, a modo de ejemplo, muestra bastante bien como lo hemos implementado:

Clase_A = function() {
	//Atributos
	this.atributo_publico = "atributo_publico";
	var atributo_privado = "atributo_privado";

	//Métodos
	this.metodo_publico_1 = function() {
		alert(atributo_privado);
	}
	this.metodo_publico_2 = function() {
		metodo_privado_1();
	}
	this.metodo_publico_3 = function() {
		var objeto_b = new Clase_B();
		objeto_b.metodo_publico_1("Llamada a método publico de otro objeto");
	}
	metodo_privado_1 = function() {
		alert("metodo_privado_1");
	}
}

Clase_B = function() {
	//Metodos
	this.metodo_publico_1 = function(txt) {
		alert(txt);
	}
}

objeto_a = new Clase_A();
alert(objeto_a.atributo_publico);
alert(objeto_a.atributo_privado);	//Undefined
objeto_a.metodo_publico_1();
objeto_a.metodo_publico_2();
objeto_a.metodo_publico_3();
objeto_a.metodo_privado_1();		//Error

La idea de utilizar esta forma de sintaxis para la implementación, es para conseguir que se parezca lo más posible a otros lenguajes de Orientacion a Objetos, se pretende que la lectura del código sea la más similar y sencilla posible.

Anuncios

Copiar y pegar Miércoles, 4 febrero 2009

Posted by israelof in Implementación.
1 comment so far

Después de unas largas vacaciones de playa y montaña, tocaba volver a escribir en el blog, y esta vez, con uno de los post que denominamos “duros” y es que hoy toca hablar de implementación.

Vamos a hablar de cómo desarrollar las funciones de copiar y pegar. Para ello vamos a mostrar el código javascript de las funciones que hemos implementado para realizar estos cometidos.

Función para copiar:

function copy(txt) {
   if (window.clipboardData) {
      window.clipboardData.clearData();
      window.clipboardData.setData("Text", txt);
   }
   else if (window.netscape) {
      try {
         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
      }
      catch (e) {
         alert("Unprivileged scripts cannot access Cut/Copy/Paste programatically for security reasons.\n"+
                "You need set 'signed.applets.codebase_principal_support=true' at about:config'");
         return false;
      }
      var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
      if (!clip)
         return;
      var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
      if (!trans)
         return;
      trans.addDataFlavor('text/unicode');
      var str = new Object();
      var len = new Object();
      var str = Components.classes['@mozilla.org/supports-tring;1'].createInstance(Components.interfaces.nsISupportsString);
      var copytext = txt;
      str.data = copytext;
      trans.setTransferData("text/unicode",str,copytext.length*2);
      var clipid = Components.interfaces.nsIClipboard;
      if (!clip)
         return false;
      clip.setData(trans,null,clipid.kGlobalClipboard);
   }
}

Función para pegar:

function paste() {
   if(window.clipboardData) {
      txt = window.clipboardData.getData('Text');
      return txt;
   }
   else if (window.netscape) {
      try {
         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
      }
      catch (e) {
         alert("Unprivileged scripts cannot access Cut/Copy/Paste programatically for security reasons.\n"+
                "You need set 'signed.applets.codebase_principal_support=true' at about:config'");
         return false;
      }
      var clip = Components.classes["@mozilla.org/widget/clipboard;1"].getService(Components.interfaces.nsIClipboard);
      if (!clip)
         return false;
      var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable);
      if (!trans)
         return false;
      trans.addDataFlavor("text/unicode");
      clip.getData(trans, clip.kGlobalClipboard);
      var str = new Object();
      var strLength = new Object();
      trans.getTransferData("text/unicode", str, strLength);
      if (str)
         str = str.value.QueryInterface(Components.interfaces.nsISupportsString);
      if (str)
         pastetext = str.data.substring(0, strLength.value / 2);
      txt = pastetext;
      return txt;
   }
}

Como podemos ver, en Internet Explorer a penas existen impedimentos de seguridad para poder acceder al portapapeles. Cuando ejecutemos estas funciones, el navegador nos preguntará si permitimos el acceso al portapeles y nada más.

En cambio, en Firefox la seguridad está más controlada y deberemos modificar la propia configuracion del navegador, si queremos permitir la acción de estas funciones. Aún así, cada vez que las ejecutemos nos preguntará si estamos realmente seguros de que queremos realizar esa acción. Queda así patente que los chicos de Mozilla han apostado por la seguridad.

Nueva versión WebDevStudio 1.4 Miércoles, 25 abril 2007

Posted by israelof in Implementación.
add a comment

Una de las cosas que se echaban en falta a la hora de desarrollar un proyecto era poder ejecutar la aplicación de forma remota y comprobar los resultados devueltos. De modo que el cambio más importante que se ha realizado ha sido el de incorporar una linea de comandos, en la que podemos ejecutar los mandatos más importantes.

A continuación expongo un listado con todos los cambios realizados:

  • Se ha modificadio la zona de resultados y los textos de resultado. 
  • Se ha incorporado la línea de comandos.
  • Se han reducido los datos de registro del usuario.
  • La carpeta de backups se ha ocultado.

Como siempre os invito a que lo probéis en el enlace WebDevStudio Demo

Estos cambios suponen una gran avance, ya que a parte de editar código se pueden ejecutar los programas que estamos realizando.

Problemas de escapado de caracteres al guardar texto en PHP Lunes, 2 abril 2007

Posted by israelof in Implementación.
2 comments

Uno de los problemas más comunes a la hora de guardar texto en un el fichero mediante PHP, aparece cuando, una vez guardado el texto, por arte de magia, en el contenido del fichero aparecen caracteres especiales escapados (por ejemplo \” cuando debería aparecer “).

Una de las cosas en que pensamos que podemos hacer mal, es que mandamos las cadenas por GET o POST sin codificar o mal codificadas mediante las funciones urlencode() o rawurlencode(). Pues por lo general, ese no es el problema.

El problema se encuentra en la directiva de PHP magic_quotes_gpc. Dicha directiva tiene un valor por defecto de on, por lo que de forma automática se llama a la función addslashes() en todos los datos que llegan a través de los métodos GET y POST y a través de las cookies.

La función get_magic_quotes_gpc() puede ser útil para comprobar el valor de esta directiva, de modo que si está activada, deberemos llamar a stripslashes() para desescapar el texto que se ha enviado al servidor y así poder guardarlo en el fichero correctamente.

Problemas al generar XML con retornos de carro Jueves, 22 marzo 2007

Posted by israelof in Implementación.
add a comment

Una de las cosas que me he dado cuenta a la hora de generar de forma dinámica mis XML es que los navegadores web no interprentan del mismo modo la codificación que hacemos.

Esto lo he descubierto cuando quería generar un XML desde la lógica de negocio (con PHP) para que a través de AJAX, de forma síncrona, le llegara al interfaz. Ahora bien, desde PHP estaba generando el XML con retornos de carro al final de las líneas (con el típico \n) y parece ser que a todos los navegadores no les gusta, sobre todo a Firefox (en su versión 2.0.0.2) ya que estaba interpretando nodos de tipo texto que no existían realmente.

Así pues, recomiendo que cada vez que se cree un XML (y no digo un fichero XML, sino una estructura de datos basada en XML), se omitan los retornos de carro, ya que pueden dar problemas.