Ver Mensaje Individual
  #12 (permalink)  
Antiguo 29/08/2007, 21:47
Avatar de derkenuke
derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 2 meses
Puntos: 45
Re: serializar objetos (para ponerlos como atributos HTML)

No es que me guste revivir temas de hace 2 años... pero bueno.

Ésto es algo muy simple:
Código PHP:
<div id="capa"></div>

<
script type="text/javascript">

var 
capa document.getElementById("capa");
var 
cualquiera = function (q) {
    
alert(q);
}
capa.setAttribute("funcion_cualquiera",cualquiera);

var 
paco = eval( capa.getAttribute("funcion_cualquiera") );
paco("hola");        // y funciona!!
</script> 
Y lo de serializar objetos... está muy básico y sólo admite Strings como propiedades, pero bueno, sería cuestión de extenderlo hasta las necesidades que uno quiera:

Código PHP:
<div id="exterior"><div id="capa"></div></div>

<
script type="text/javascript">

// Creo la clase
function coche(marca,modelo,color) {
    
this.marca marca;
    
this.modelo modelo;
    
this.color color;
    
// Creo el método por el cual la clase coche pasará a ser un String con sus propiedades escritas
    
this.toJSON = function() {
        var 
str "{ ";
        for(var 
i in this) {
            if( (
typeof this[i]) != "function" ) {
                
str += i+": '"+this[i]+"', ";
            }
        }
        
str str.substring(0str.length-2);        // quitamos el espacio y la coma del final
        
str += " }";
        return 
str;
    }
}

// Creo el método inverso: sacar el objeto del string JSON
function JSONtoObject(str) {
    var 
dev = new Object();
    
str str.substring(2str.length-2);        //quitamos los { } y los espacios sobrantes
    
str str.split(", ");
    for(var 
i=0i<str.lengthi++) {        // con caja conjunto propiedad:valor
        
for(var j=0sp str[i].split(": "); j<sp.lengthj++) {
            
devsp[0] ] = sp[1];
        }
    }
    return 
dev;
}

var 
capa document.getElementById("capa");

// Creo el objeto
var audiTTrojo = new coche("audi""TT" ,"rojo");
// Guardo el objeto en forma de JSON
capa.setAttribute("miCoche"audiTTrojo.toJSON() );
// Muestro cómo cambia el HTML por si quisiéramos hacer algo con él
alert(document.getElementById("exterior").innerHTML);
// Recupero el objeto
var elCoche JSONtoObjectcapa.getAttribute("miCoche") );
// Muestro el objeto
var presentacionCoche "";
for(var 
i in elCoche) {
    
presentacionCoche += "elCoche['"+i+"'] = " elCoche[i] +"\r\n";
}
alert(presentacionCoche);

</script> 
Bueno, me sincero: El toJSON() no lo he inventado yo por supuesto. La librería Prototype tiene el suyo, evidentemente finiquitado al gusto y para todos los tipos de elementos (incluso para String). Ni siquiera tiene por qué haberlo inventado prototype, aquí hay un enlace con un código que puede hacerlo también.



En fin, que poderse se puede hacer, lo que pasa es que no conocía el cómo, como suele pasar.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.