Foros del Web » Programando para Internet » Javascript »

Crear Una Instancia De Un Objeto y Modificarlo Al Ocurrir Evento HTML

Estas en el tema de Crear Una Instancia De Un Objeto y Modificarlo Al Ocurrir Evento HTML en el foro de Javascript en Foros del Web. Buenas, estoy dando mis primeros pasos en POO y tengo una duda... Si yo por ej tengo la clase miClase que crea un div y ...
  #1 (permalink)  
Antiguo 22/03/2012, 17:24
 
Fecha de Ingreso: julio-2009
Ubicación: La Plata
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 8
Crear Una Instancia De Un Objeto y Modificarlo Al Ocurrir Evento HTML

Buenas, estoy dando mis primeros pasos en POO y tengo una duda...
Si yo por ej tengo la clase miClase que crea un div y lo inserta en el body...¿còmo harìa si quisiese modificar una propiedad del objeto que creò el div cuando este reciba un evento?
Espero se entienda, plasmo mi ejemplo en un script:
Código:
miClase=function()
{
 this.click=0
 this.ele=document.createElement("div")
 this.ele.setAttribute("onClick",this.click=1) //Èste es mi problema...¿como referencio a this en el div?
 this.inserta=function()
    {
        document.body.appendChild(this.ele)
    }
}
Podrìa hacerlo si pudiese hacer que this, en vez de devolver [Object] (O algo Asì) devolviese su ruta al estilo DOM.

Muchas gracias y Salu2
  #2 (permalink)  
Antiguo 22/03/2012, 21:23
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 6 meses
Puntos: 1485
Respuesta: Crear Una Instancia De Un Objeto y Modificarlo Al Ocurrir Evento HTML

¡buenas!
no tengo muy claro de lo que exactamente quieres hacer. supongo que te refieres a this de tu clase miClase. hasta donde conozco, hay una forma pero es dependiente de la implementación javascript. resulta que a los eventos, en lugar de un handler (manejador) le puedes pasar un objeto. entonces, si el objeto tiene el método handleEvent, este se utilizará como handler del evento. pero como mencione, depende mucho de la implementación de javascript. por ejemplo, chrome me acepta dicha implementación en los eventos como propiedades (DOM Event 0) pero firefox no:
Código:
document.body.onclick = { // objeto literal;
handleEvent: function(){ // el handler
console.log(this, arguments); 
// en la consola obtienes el objeto literal;
// y los argumentos pasados al handler cuando se invoca;
}}
para que este mismo método funcione en firefox tienes que utilizar addEventListener en lugar de DOM Event 0.
Código:
document.body.addEventListener('click', { // objeto literal como en el ejemplo anterior;
handleEvent: function(){
console.log(this, arguments);
}
}, true);
¿cómo implementas eso utilizando constructores (clases, para algunos)? simplemente creas el método del constructor como regularmente lo harías y luego registras la referencia this como handler.
Código:
function Fn(){
...
this.handleEvent = function(){ ... }; 
this.element.addEventListener('eventType', this, captureMode);
}
desgraciadamente, ninguno de los modelos anteriores funciona en iexplorer (no he comprobado en las versiones 9 y 10), simplemente porque iexplorer utiliza un modelo de eventos distinto al estándar. de existir soluciones alternas, los hay... aunque tengo duda de cual sería la mejor forma. una posibilidad podría ser crear un closure de una referencia a la instancia del constructor. en el handler, en lugar de usar this utilizas la variable.

Código:
function Fn(){
var that = this;
this.handler = function(){
that; // se crea un closure, that hace referencia a la instancia creada
...
};
this.element.eventType = this.handler; 
// no confundir handler con handleEvent;
// lo mismo se puede hacer con addEventListener 
}
otra posibilidad parecida a la anterior es asignarle un nombre al método y luego crear una propiedad (las funciones en javascript son como objetos) con la referencia a la instancia. dentro del handler utilizas el nombre para hacer referencia a la función misma y luego a la propiedad.
Código:
function Fn(){
this.handler = function Handler(){ // en este ejemplo la función "anónima" tiene por nombre "Handler";
Handler.that; // hace referencia a la instancia;
};
this.handler.that = this; // la propiedad a la función;
this.element.eventType = this.handler;
}
para mis gustos, no es tan cómodo como la primera alternativa ya que puedes usar directamente this. seguro hay más opciones, pero estas son de las que puedo pensar por el momento.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Última edición por zerokilled; 05/09/2012 a las 17:13
  #3 (permalink)  
Antiguo 22/03/2012, 21:31
 
Fecha de Ingreso: octubre-2010
Mensajes: 107
Antigüedad: 14 años
Puntos: 14
Respuesta: Crear Una Instancia De Un Objeto y Modificarlo Al Ocurrir Evento HTML

Hola,

El div que defines en "this.ele" no es una instancia de "miClase", o sea que el al darle click, por sierto el "this.click=1" debe ir entre comillas, él no modificara nada porque click no es una de sus propiedades. En este caso this.ele es una instancia de Object, osea que debes modificar es a Object y no a miClase, debes extender el objeto Object.
  #4 (permalink)  
Antiguo 23/03/2012, 00:55
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 6 meses
Puntos: 1485
Respuesta: Crear Una Instancia De Un Objeto y Modificarlo Al Ocurrir Evento HTML

Cita:
Iniciado por zerokilled
para mis gustos, no es tan cómodo como la primera alternativa ya que puedes usar directamente this. seguro hay más opciones, pero estas son de las que puedo pensar por el momento.
¡no se como me pude olvidar! también puedes usar bind para enlazar el método con la instancia. en teoría es casi como la alternativa del closure, pero con la comodidad de poder utilizar directamente la referencia this y de no tener que crear manualmente el closure. además, no estás limitado a un solo modelo de eventos, sino que puedes usar ambos: DOM Event 0 ó addEventListener. bind lo que hace es que devuelve una nueva función donde enlaza otra función con un objeto. en la última versión del estándar javascript (ecmascript), existe la función nativa bind.
Código:
function Fn(){
...
this.handler = function(){
console.log(this, arguments);
};
this.element.eventType = this.handler.bind(this);
}
como de costumbre, hasta donde conozco iexplorer8 no tiene soporte nativo. por lo que debes crear una implementación que tenga la misma funcionalidad. en la web hay varios ejemplos de como implementar una función similar para navegadores sin soporte. he aquí uno.

Código:
if(!Function.prototype.bind){
Function.prototype.bind = function(obj){
var that = this, args = [].slice.call(arguments, 1);
return function(){
return that.apply(obj, [].slice.call(arguments).concat(args));
};
};
}
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #5 (permalink)  
Antiguo 23/03/2012, 17:24
 
Fecha de Ingreso: julio-2009
Ubicación: La Plata
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 8
Respuesta: Crear Una Instancia De Un Objeto y Modificarlo Al Ocurrir Evento HTML

Muchas gracias por las respuestas...Con eso ya tengo para probar y buscar.
Por sierto, con respecto a lo que dice MARCASTELEON:
No sabìa si aclararlo o no cuando hice el tema, pero no pongo las comillas porque no quiero asignarle la propiedad this.click al div, sino al objeto.Es decir, si pongo las comillas quedarìa algo asì:
<div onclick="this.click=1"></div>
y con una instancia a miClase no me refiero a this.ele, sino al new miClase, como pondrìa en el script en el que necesite instanciar a miClase.
No hay un objetivo claro en el ejemplo porque es un ejemplo, no querìa llenar el tema con todo el còdigo porque no es necesario para plantear mi problema.
Lo que pretendo hacer es un menù. La clase se encarga de crear un div y aplicarle un comportamiento a èste que es recibido como paràmetro. Con comportamiento me refiero a distintas opciones, por ej que se despliegue hacia la izquierda, derecha, hacia la izquierda y derecha, con o sin efecto de opacidad y con o sin suavidad. Tengo todo al horno, casi cocinado, lo ùnico que me falta es entender esto y hacer que el div se pliegue y sea removido para lo que tengo ue llamar al mètodo del objeto que creò el div para que realize el pliegue con las opciones especificadas y lo elimine.
Salu2 y Muchas Gracias nuevamente.
  #6 (permalink)  
Antiguo 23/03/2012, 20:28
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 6 meses
Puntos: 1485
Respuesta: Crear Una Instancia De Un Objeto y Modificarlo Al Ocurrir Evento HTML

¿y no te funciona nada de lo que te expliqué? por lo que expresas eso es lo que pareces necesitar.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #7 (permalink)  
Antiguo 24/03/2012, 17:56
 
Fecha de Ingreso: julio-2009
Ubicación: La Plata
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 8
Respuesta: Crear Una Instancia De Un Objeto y Modificarlo Al Ocurrir Evento HTML

Despacio mi amigo, prometo responder si me funcionó o no cuando lo prueve...Por ahora tengo un inconveniente con la librería que cambia el tamaño del menú, que me la había echo en JS estructurado y ahora que le estoy agarrando la mano a la POO la rehice toda así que tengo que terminarla y ahí provar otra vez con la librería que hace el menú trasteando con las soluciones que me diste.Salu2
  #8 (permalink)  
Antiguo 24/03/2012, 23:58
 
Fecha de Ingreso: julio-2009
Ubicación: La Plata
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 8
Respuesta: Crear Una Instancia De Un Objeto y Modificarlo Al Ocurrir Evento HTML

Ya terminé la librería necesaria...
Ahora, no entendí bien cómo implementar tu solución.
Lo que se me ocurre es así:
Código:
miClase=function()
{
this.click=0
 this.handleEvent=function()
 {
   this.click=1
 }
 this.ele=document.createElement("div")
 this.ele.addEventListener('eventType', this, captureMode)
 this.ele.setAttribute("onClick","{miClase}")
 this.inserta=function()
    {
        document.body.appendChild(this.ele)
    }
}
Gracias por tus respuestas zerokilled

EDITO: Solucionado,mil gracias. La cosa es así:

Código:
miClase=function()
{
this.click=0
 this.handleEvent=function()
 {
   this.click=1
 }
 this.ele=document.createElement("div")
 this.ele.addEventListener('click', this, 0)
 this.ele.setAttribute("onClick","{miClase}")
 this.inserta=function()
    {
        document.body.appendChild(this.ele)
    }
}
PD: No me interesa la compatibilidad con explorer, porque uso linux y porque si no quiere seguir los estándares no pienso adaptarme a sus mañas...Salu2 y mil gracias más.

Última edición por pistonasos; 25/03/2012 a las 00:16
  #9 (permalink)  
Antiguo 25/03/2012, 00:51
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 6 meses
Puntos: 1485
Respuesta: Crear Una Instancia De Un Objeto y Modificarlo Al Ocurrir Evento HTML

no entiendo esta linea el cual es irrelevante... this.ele.setAttribute("onClick","{miClase}"). si registras el evento por addEventListener, no tienes que agregar el atributo del mismo evento. por cierto, dicha linea en realidad no tiene ningún efecto. cuando el intérprete lo lee lo que ve es un bloque de instrucción (block statement) con una variable. el resultado es que no produce nada porque no hay ninguna operación.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #10 (permalink)  
Antiguo 25/03/2012, 01:31
 
Fecha de Ingreso: julio-2009
Ubicación: La Plata
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 8
Respuesta: Crear Una Instancia De Un Objeto y Modificarlo Al Ocurrir Evento HTML

Si, me acabo de dar cuenta...
Por sierto, tuve un inconveniente más cuyo problema padre es el mismo, lo que cambia es el caso: Resulta que mi eventHandler tiene algo así:

Código:
this.eventHandler=function()
{
   if(event.type=="onmouseout")
      {
          this.timer=setTimeout(document.body.removeChild(this.ele),1000)
      }
}
Ahora el problema era que el setTimeout reconozca el this, así que allé la siguiente manera:
Agrego this a la lista de ¿cosas? de JS con:

Código:
self["miClase"]=this
Así lo hice funcional:

Código:
self["miClase"]=this
this.eventHandler=function()
{
   if(event.type=="onmouseout")
      {
          this.timer=setTimeout(function(){document.body.removeChild(self["miClase"].ele)},1000)
      }
}
A lo que es una solucion para ambos casos.Claro que, por cada clase hay que cambiar la clave del self.
En el eventHandler en realidad hay dos if, por eso no tiene mucho sentido en el ejemplo.
Salu2 y gracias.
  #11 (permalink)  
Antiguo 25/03/2012, 11:16
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 6 meses
Puntos: 1485
Respuesta: Crear Una Instancia De Un Objeto y Modificarlo Al Ocurrir Evento HTML

en ese caso, lo mejor es que hagas un bind. de esa manera, la función puede pertenecer al constructor y no tienes que indicar la referencia por su nombre de variable.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #12 (permalink)  
Antiguo 27/03/2012, 17:47
 
Fecha de Ingreso: julio-2009
Ubicación: La Plata
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 8
Respuesta: Crear Una Instancia De Un Objeto y Modificarlo Al Ocurrir Evento HTML

Gracias, ya probé tu solución, la solución que encontré y ahora y aunque ya funciona voy a probar con bind...Así abarco todas las posibilidades y no me quedo sin conocer ninguna.Gracias Zerokilled.

Etiquetas: evento, html, instancia, objeto
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:07.