Foros del Web » Programando para Internet » Javascript »

Problemas con this al clonar un objeto

Estas en el tema de Problemas con this al clonar un objeto en el foro de Javascript en Foros del Web. Buenas! Estoy clonando una parte de un formulario que conciste en algo asi: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código Javascript : Ver original < div id = "cloname" ...
  #1 (permalink)  
Antiguo 10/06/2014, 22:25
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Pregunta Problemas con this al clonar un objeto

Buenas!

Estoy clonando una parte de un formulario que conciste en algo asi:

Código Javascript:
Ver original
  1. <div id="cloname">
  2.                 <select name="return[]" style="width:73px;">
  3.                     <option value="NULL">NULL</option> 
  4.                     <option value="boolean">boolean</option>
  5.                     <option value="number">number</option>
  6.                     <option value="resource">resource</option>
  7.                     <option value="string">string</option> 
  8.                     <option value="array">array</option>
  9.                     <option value="object">object</option> 
  10.                     <option value="mixed">mixed*</option>
  11.                 </select>
  12.                 <a href="javascript:delete_me(this.id);" title="delete it">[x]</a>
  13.             </div>

Como puede observarse hay un enlace que envia una referencia supuestamente al mismo elemento <a> pero se pierde la referencia con la clonacion y queda en "undefined"

Se me ocurren parches... pero alguien me puede explicar como recuperar la referencia ?


La necesito para poder borrar esa fila mas adelante asi:

Código Javascript:
Ver original
  1. function delete_me(elem)
  2.     {
  3.         console.log(elem); // undefined
  4.         var hijo = document.getElementById("clon_"+cont_clones);
  5.         var padre = hijo.parentElement;
  6.         padre.removeChild(hijo);
  7.     }

Gracias por su tiempo!
__________________
Salu2!
  #2 (permalink)  
Antiguo 10/06/2014, 22:36
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Problemas con this al clonar un objeto

¿Te has dado cuenta de que intentas pasar el id del enlace pero este no tiene uno?

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #3 (permalink)  
Antiguo 10/06/2014, 22:50
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Problemas con this al clonar un objeto

Cita:
Iniciado por Alexis88 Ver Mensaje
¿Te has dado cuenta de que intentas pasar el id del enlace pero este no tiene uno?
Si lo tiene... que pena no haber posteado la funcion que se lo coloca

Ahi mismo aplique un "parche" de lo mas asqueroso..... hardcodeo el href por el problema de que this no hace referencia a lo que imagino y el motivo de la consulta:

Código Javascript:
Ver original
  1. function add_param()
  2.     {
  3.         returns = document.getElementsByName("return");
  4.        
  5.         if (returns.length<15)
  6.         {  
  7.             var div = document.getElementById("cloname");
  8.             var insert_pt = document.getElementById("add_after");
  9.        
  10.             cont_clones++;
  11.        
  12.             newNode=div.cloneNode(true); // appendChild(document.createElement("br"))
  13.             newNode.firstElementChild.parentElement.id = 'clon_'+cont_clones;
  14.             newNode.firstElementChild.nextElementSibling.id='remove_clon_'+cont_clones;  // enlace
  15.  
  16.             // PARCHE ASQUEROSO: //////////      
  17.             newNode.firstElementChild.nextElementSibling.href="javascript:delete_me("+'remove_clon_'+cont_clones+");";
  18.            
  19.             insertAfter(insert_pt,newNode);            
  20.        
  21.             document.getElementById("min_param").value = returns.length+1;
  22.             coherencia_params();
  23.            
  24.            
  25.         }
  26.     }

Al examinar el DOM generado y eso SIN APLICAR EL PARCHE DEL "HREF" ..... *si* se ven los IDs de los <A>, copio y pego desde la consola:

Código HTML:
Ver original
  1. <div id="clon_5">
  2.                 <select name="return[]" style="width:73px;">
  3.                     <option value="NULL">NULL</option> 
  4.                     <option value="boolean">boolean</option>
  5.                     <option value="number">number</option>
  6.                     <option value="resource">resource</option>
  7.                     <option value="string">string</option> 
  8.                     <option value="array">array</option>
  9.                     <option value="object">object</option> 
  10.                     <option value="mixed">mixed*</option>
  11.                 </select>
  12.                 <a href="javascript:delete_me(remove_clon_5);" class="no_decorar" title="delete it" id="remove_clon_5">[x]</a>
  13.             </div>

El problema realmente es "conceptual" y tiene que ver con la definicio de THIS en este lenguaje tan "raro" para un "PHP guy"
__________________
Salu2!

Última edición por Italico76; 10/06/2014 a las 22:57
  #4 (permalink)  
Antiguo 10/06/2014, 23:00
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Problemas con this al clonar un objeto

Solo por probar, podrías cambiar esta línea:

Código Javascript:
Ver original
  1. newNode.firstElementChild.nextElementSibling.href="javascript:delete_me("+'remove_clon_'+cont_clones+");";

Por esto:

Código Javascript:
Ver original
  1. newNode.firstElementChild.nextElementSibling.addEventListener("click", function(){
  2.     delete_me("remove_clon_" + cont_clones);
  3. }, false);

Es lo más adecuado, ya no se recomienda referenciar a funciones JS desde el atributo href de un enlace, aunque de la otra forma debería funcionar también, pero quizá está ocurriendo algún problema cuando creas la copia, es un poco difícil saberlo sin el resto del código.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #5 (permalink)  
Antiguo 10/06/2014, 23:02
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Problemas con this al clonar un objeto

Te agradezco @Alexis88 pero...sigue siendo un parche ? (funciona igualito que el mio)


EDIT: ahora creo que el problema esta en que al clonar una parte del DOM, la copia queda almacenada en una variable (newNode) y THIS quedaria apuntando a esa variable y no al DOM

Asi el parche creo siempre es necesario.
__________________
Salu2!

Última edición por Italico76; 10/06/2014 a las 23:21
  #6 (permalink)  
Antiguo 10/06/2014, 23:36
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Problemas con this al clonar un objeto

Hice un par de pruebas que quizá puedan servirte de guía.

Prueba 1
Prueba 2

Y es cierto, el tratamiento de this en JS es un tanto complejo, pero con perseverancia, se logra entenderlo.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 10/06/2014 a las 23:46 Razón: Línea repetida
  #7 (permalink)  
Antiguo 11/06/2014, 07:57
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 16 años, 5 meses
Puntos: 1012
Respuesta: Problemas con this al clonar un objeto

el primer error que se observa es que usas un tag <a> donde no tiene sentido usarlo ya que no va a ver ninguna redirección, el segundo es que usas javascript en línea y el tercero es que al clonar el objeto también se clona su id. esto último es de fácil solución. en lugar de this.id, usa this (con lo que haces referencia al objeto)
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #8 (permalink)  
Antiguo 11/06/2014, 08:02
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Problemas con this al clonar un objeto

Cita:
Iniciado por IsaBelM Ver Mensaje
el primer error que se observa es que usas un tag <a> donde no tiene sentido usarlo ya que no va a ver ninguna redirección, el segundo es que usas javascript en línea y el tercero es que al clonar el objeto también se clona su id. esto último es de fácil solución. en lugar de this.id, usa this (con lo que haces referencia al objeto)
Gracias!

Uff... me siento como cuando miro un codigo ajeno de PHP... en una sola linea pueden cometer tantos errores!!? ... y ahora me pasa a mi aqui

O sea... mejor uso un[B]button[/B] y le agrego un listener onlick como me decia @Alexis88 ?


Voy a probar!!!

EDIT: "solucionado"......... tengo algun bug... que espero resolver pero EXCELENTE Isabel!
__________________
Salu2!

Última edición por Italico76; 11/06/2014 a las 09:51
  #9 (permalink)  
Antiguo 11/06/2014, 09:52
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Problemas con this al clonar un objeto

Código Javascript:
Ver original
  1. <button type="button" onclick="delete_me(this);" class="no_decorar" id="cambiame_al_copiarme"  title="delete it">[x]</button>

@IsaBelM : te hice caso..... y ya funciona! la pregunta es... cuando no es mala practica el hacer el Javascript inline ?
__________________
Salu2!
  #10 (permalink)  
Antiguo 11/06/2014, 09:59
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Problemas con this al clonar un objeto

Iba a sugerirte lo mismo que IsabelM, pero quería resolverlo del otro modo.

De preferencia, trata de hacer la referencia a la función desde JS, pero también es válido hacerlo desde los atributos onNombreEvento. En el caso de los enlaces, lo ideal es utilizarlos solo para hacer redirecciones, pues ese es su fin y si quieres hacer otras cosas, usa botones.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #11 (permalink)  
Antiguo 11/06/2014, 12:44
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 16 años, 5 meses
Puntos: 1012
Respuesta: Problemas con this al clonar un objeto

Cita:
Iniciado por Italico76 Ver Mensaje
@IsaBelM : te hice caso..... y ya funciona! la pregunta es... cuando no es mala practica el hacer el Javascript inline ?
como te comenta, alexis es una mala practica pero no quiere decir no sea válido. lo suyo es tener el css y javascript embebido o externo

en cuanto al uso de botones. yo ni tan siquiera los usaría en este caso, ya que eso implicar que la sintaxis ha de ser

Cita:
<form>
control
</form>
en su lugar suelo usar <span>
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #12 (permalink)  
Antiguo 11/06/2014, 13:08
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Problemas con this al clonar un objeto

No es necesario colocar botones en formularios para interactuar con ellos y funciones que realicen redirecciones o cualquier otra acción, para eso se puede elaborar un método en JS que simplifique esa labor y afecte no solo a uno sino a un grupo de elementos.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #13 (permalink)  
Antiguo 11/06/2014, 13:22
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 16 años, 5 meses
Puntos: 1012
Respuesta: Problemas con this al clonar un objeto

Cita:
Iniciado por Alexis88 Ver Mensaje
No es necesario colocar botones en formularios para interactuar con ellos y funciones que realicen redirecciones o cualquier otra acción,
aunque lo he leído y releído no entiendo que quieres decir
Cita:
Iniciado por Alexis88 Ver Mensaje
para eso se puede elaborar un método en JS que simplifique esa labor y afecte no solo a uno sino a un grupo de elementos.

Saludos
supongo que te refieres a event.target o algo así
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #14 (permalink)  
Antiguo 11/06/2014, 13:31
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Problemas con this al clonar un objeto

Claro, algo más orientado a eventos.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #15 (permalink)  
Antiguo 11/06/2014, 13:52
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 16 años, 5 meses
Puntos: 1012
Respuesta: Problemas con this al clonar un objeto

en lo personal no me gusta usar event.target ya que por cada pulsación de ratón hay que evaluar.

pero continuo sin entender que relación tiene lo que expongo aquí con lo que comentas aquí
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #16 (permalink)  
Antiguo 11/06/2014, 13:58
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Problemas con this al clonar un objeto

IsaBelM: lo que quieres decir con eso es que el tipo <button> no se deberia usar fuera de un formulario al igual que el <input> ?

Aca mas razones porque usar <button> debe estar muy justificado y no hacerse a la ligera
__________________
Salu2!
  #17 (permalink)  
Antiguo 11/06/2014, 14:01
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 16 años, 5 meses
Puntos: 1012
Respuesta: Problemas con this al clonar un objeto

Cita:
Iniciado por Italico76 Ver Mensaje
IsaBelM: lo que quieres decir con eso es que el tipo <button> no se deberia usar fuera de un formulario al igual que el <input> ?
exacto. la sintaxis, al igual que la semántica, es importante
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #18 (permalink)  
Antiguo 11/06/2014, 14:12
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Problemas con this al clonar un objeto

El comentario que hago es precisamente por lo que dices:

Cita:
Iniciado por IsaBelM Ver Mensaje
en cuanto al uso de botones. yo ni tan siquiera los usaría en este caso, ya que eso implicar que la sintaxis ha de ser

<form>
control
</form>
Es decir, das a entender que solamente es viable utilizar botones con formularios, algo con lo que no estoy de acuerdo, pues como te vuelvo a decir, orientándonos a eventos, es posible crear métodos que realicen las operaciones que queramos, además de poder aplicarlos a varios elementos y no a uno o dos en particular. Lo que no entiendo es por qué crees que los botones solo deben ser utilizados en formularios, pues para enviar datos de formularios a procesarse (lo más común), se utiliza un elemento <input> de tipo submit, los <button> pueden tener esa funcionalidad, pero también otras.

Saludos

PD: Si tienes algún artículo en el que se trate sobre este tema, te agradeceré que lo compartas con la comunidad, quizá me equivoque y tu afirmación tenga sustento en algún documento de l W3C.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 11/06/2014 a las 14:23 Razón: Post-data
  #19 (permalink)  
Antiguo 11/06/2014, 14:41
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Problemas con this al clonar un objeto

Sin saber mucho del tema hay una tendencia hacia "la web semantica" y los buscadores empiezan a darle relevancia ya que facilita el parseo y la clasificacion de la informacion
__________________
Salu2!
  #20 (permalink)  
Antiguo 11/06/2014, 15:45
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 16 años, 5 meses
Puntos: 1012
Respuesta: Problemas con this al clonar un objeto

si te vale con lo que dice mdn

Cita:
Está definido como: Elemento de control para formulario.
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #21 (permalink)  
Antiguo 11/06/2014, 20:23
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Problemas con this al clonar un objeto

Disculpen la tardanza en contestar, estuve pintando mi dormitorio.

Cómo cambia la figura cuando el argumento presenta un sustento documentado. Particularmente, me parece erróneo limitar la asociación de este elemento a otros entornos ajenos a los formularios, es decir, si se pueden utilizar elementos <input> de tipo submit y button, ¿para qué añadir un elemento <button>? Me parece algo innecesario, pero la W3C tendrá sus razones.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #22 (permalink)  
Antiguo 11/06/2014, 21:14
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Problemas con this al clonar un objeto

Cita:
Iniciado por Alexis88 Ver Mensaje
si se pueden utilizar elementos <input> de tipo submit y button, ¿para qué añadir un elemento <button>? Me parece algo innecesario, pero la W3C tendrá sus razones.
Quizas no este mal usar <button> fuera de un formulario:


Fuera de su "ambito" (el formulario), ya que no tendria sentido un <button type="submit"> ni un <button type="reset"> sino solo seria un <button type="button">...

... con la ventaja sobre un <input type="button"> que puede contener otros elementos como imagenes!



Segun esta interpretacion que hago, creo todos tienen razon: @IsaBelM porque es cierto que es un elemeto para formularios (y por eso tiene los tipos "submit" que es implicito dentro del formulario y el "reset") pero tambien @Alexis88 porque retiene una funcionalidad extra (type="button") que es util en otros escenarios


offtopic: como quedo el dormitorio Alexis88 ?
__________________
Salu2!
  #23 (permalink)  
Antiguo 11/06/2014, 21:29
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Problemas con this al clonar un objeto

Es precisamente a lo que me refería, mi estimado señor Bozzolo.

Y con respecto a la pregunta, quedó bien pintado, al igual que yo. No subo fotos de cómo quedé porque son muy vergonzosas.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Etiquetas: clonar, formulario, objeto, select
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 18:48.