Foros del Web » Programando para Internet » Javascript »

Esta funcion retorna un resultado correcto pero al guardar es undefined

Estas en el tema de Esta funcion retorna un resultado correcto pero al guardar es undefined en el foro de Javascript en Foros del Web. Buenos días a todos, tengo un problema con el resultado devuelto por una función que he creado. Para que sea claro, la función existe_div(div,numero,padre) recibe ...
  #1 (permalink)  
Antiguo 23/03/2012, 11:54
Usuario no validado
 
Fecha de Ingreso: febrero-2012
Mensajes: 24
Antigüedad: 12 años, 2 meses
Puntos: 0
Pregunta Esta funcion retorna un resultado correcto pero al guardar es undefined

Buenos días a todos, tengo un problema con el resultado devuelto por una función que he creado. Para que sea claro, la función existe_div(div,numero,padre) recibe 3 parametros un nombre constante de id Ej: ''multimedia_elem" luego el segundo parametro es el numero de elemento actual Ej: 0 y el tercero es el numero de id del div padre al que pertenece Ej: 0 (en este caso luego accedo al padre asi- > 'contenedor_elem'+padre ) que es el div que se ve en el html abajo que contiene a los elementos (div) que voy creando.

Basicamente la función chequea que el nuevo id a crear no exista y en ese caso devuelve el nuevo id. Caso contrario lo que hace es sumarle 1 al numero del id actual y vuelve a acomprobar, así hasta que el id este desocupado.

El tema es que al parecer el resultado que devuelve es correcto (esto lo comprobe colocando un alert() justo antes del return) pero y aca viene el problema...

cuando utilizo esta funcion dentro de la otra (guardar_elementos_en_input()) el valor que recibo como retorno es "undefined"... estuve buscando y haciendo millones de pruebas pero no pude encontrar el error. Si alguien puede aclararme un poco cual podría estar siendo el problema se lo agradecería mucho.

si algo no se entiendo solo avisenme y lo explico mejor, Gracias!

Aquí el código:

Código Javascript:
Ver original
  1. function existe_div(div,numero,padre)//Ej div-> input- numero-> 1
  2. {
  3.     alert('LLEGAN LOS DATOS: DIV->'+div+'< NUMERO->'+numero+'< PADRE:->'+padre+'<')
  4.     if(padre != ''){padre_id = '-'+padre;}else{var padre_id = '';}
  5.    
  6.     nuevo_id = div+numero+padre_id;
  7.    
  8.     alert('f existe: Nuevo id1: '+ nuevo_id)   
  9.    
  10.         if(document.getElementById(nuevo_id) != null)
  11.         {
  12.             alert('El div ->' + nuevo_id + 'Ya existe!');
  13.                
  14.                 siguiente = (parseInt(numero)+1);
  15.                
  16.                 //nuevo_id = div + siguiente + '-' + padre_id;
  17.                
  18.                 existe_div(div,siguiente,padre);
  19.                
  20.         }
  21.         else
  22.             {
  23.                 alert('f existe- > RETORNA: '+nuevo_id);
  24.                
  25.                 return nuevo_id;
  26.                
  27.                
  28.                
  29.             }
  30.        
  31.            
  32.        
  33.        
  34.         //alert('El div ->' + nuevo_id + 'No existe!');
  35.        
  36.        
  37.        
  38.  
  39. }
  40.  
  41. function guardar_elementos_en_input() //contenido(contenido del resultado),tipo(imagen/texto/video)
  42. {
  43.        
  44.     //accede al iframe
  45.     frame = document.getElementById('cargador_frame');
  46.  
  47.     if(document.getElementById('procesar_subida') != null)
  48.     {
  49.        
  50.         resultado = document.forms['procesar_subida']._resultado_.value;
  51.        
  52.         //obtiene informacion del resultado
  53.         procesar_resultado = resultado.split('|');
  54.         id = procesar_resultado[0];
  55.        
  56.         tipo = procesar_resultado[2];
  57.        
  58.         switch(tipo)
  59.         {
  60.             case 'imagen':
  61.                         clase_imagen = 'imagen_multimedia';
  62.                         contenido = procesar_resultado[1];
  63.                         contenido_nombre = procesar_resultado[1];
  64.                         break;
  65.             case 'texto':
  66.                         clase_imagen = 'texto_multimedia';
  67.                         contenido = procesar_resultado[1];
  68.                         contenido_nombre = procesar_resultado[1].slice(0,30)+'...';
  69.                         break;
  70.             case 'video':
  71.                         clase_imagen = 'video_multimedia';
  72.                         contenido = procesar_resultado[1];
  73.                         contenido_nombre = procesar_resultado[1].split('\#');
  74.                         contenido_nombre = contenido_nombre[0];
  75.                         break; 
  76.             default:
  77.                
  78.                         break;
  79.         }
  80.        
  81.         // crea un div "elemento multimedia" dentro del contenedor
  82.        
  83.         agregar = document.getElementById('contenedor_elem'+id);
  84.         nuevo_elemento = document.createElement('div');
  85.        
  86.         nuevo_id_mult = existe_div('multimedia_elem',id,id);
  87.         alert('TIPO DEVUELTO :'+ typeof(nuevo_id_mult))
  88.    
  89.        
  90.         alert('ESTO DEVOLVIO LA FUNCION EXISTE DIV: ' + nuevo_id_mult)
  91.         nuevo_elemento.id = nuevo_id_mult;
  92.         //alert('NUEVO ID: '+nuevo_id_mult);
  93.         alert('CREA UN DIV ->('+nuevo_id_mult+') Y LO AGREGA AL CONTENEDOR-> contenedor_elem'+id)
  94.        
  95.         nuevo_elemento.className = 'elementos_multimedia';
  96.         agregar.appendChild(nuevo_elemento);
  97.        
  98.         //guarda el resultado procesado del frame en el nuevo elemento multimedia creado
  99.         incluir_contenido = document.getElementById(nuevo_id_mult);
  100.        
  101.         //obtiene el contenido de los elementos multimedia ya cargados
  102.         contenido_actual = incluir_contenido.innerHTML;
  103.         //comprueba si habia contenido creado o no
  104.         if(contenido_actual == ''){contenido_actual = '';}else{contenido_actual = incluir_contenido.innerHTML;}
  105.        
  106.         incluir_contenido.innerHTML = contenido_actual+'<div class="elementos_multimedia_caja"><input type="hidden" name="'+nuevo_id_mult+'" value="' + contenido + '|' + tipo  + '"/>'+
  107.                                     '<div class="'+clase_imagen+'"></div><div class="nombre_multimedia"><label>'+ contenido_nombre + '</label><div class="eliminar_elemento"><a href="#" onclick="eliminar_elemento_multimedia(event,\''+nuevo_id_mult+'\',\''+id+'\')">X</a></div></div></div>';
  108.    
  109.        
  110.         cadena_multimedia = document.forms['contenidos'].cadena_elementos_multimedia.value;
  111.        
  112.         if(cadena_multimedia == '')
  113.         {
  114.             document.forms['contenidos'].cadena_elementos_multimedia.value = nuevo_id_mult;
  115.         }
  116.         else
  117.             {
  118.                 document.forms['contenidos'].cadena_elementos_multimedia.value = cadena_multimedia + '|' + nuevo_id_mult;
  119.             }
  120.        
  121.     }
  122.  
  123. }

Código HTML:
Ver original
  1. <input type="button" value="Crear nuevo div" onclick="guardar_elementos_en_input();"/>
  2. <div class="contenedor_elementos" id="contenedor_elem0"><div id="multimedia_elem0-0" class="elementos_multimedia"><div class="elementos_multimedia_caja"><input type="hidden" value="video pepe#http://aasda-c.com.ar|video" name="multimedia_elem0-0"><div class="video_multimedia"></div><div class="nombre_multimedia"><label>video pepe</label><div class="eliminar_elemento"><a onclick="eliminar_elemento_multimedia(event,'multimedia_elem0-0','0')" href="#">X</a></div></div></div></div></div>
  3. <form id="procesar_subida" name="procesar_subida"><input type="hidden" value="0|video pepe#http://aasda-c.com.ar|video" name="_resultado_" id="_resultado_"></form>
  #2 (permalink)  
Antiguo 23/03/2012, 17:37
Avatar de gilber966  
Fecha de Ingreso: abril-2010
Mensajes: 117
Antigüedad: 14 años
Puntos: 4
Respuesta: Esta funcion retorna un resultado correcto pero al guardar es undefined

Tal ves debas declarar variables globales fuera de las funciones
  #3 (permalink)  
Antiguo 23/03/2012, 18:33
Usuario no validado
 
Fecha de Ingreso: febrero-2012
Mensajes: 24
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Esta funcion retorna un resultado correcto pero al guardar es undefined

Cita:
Iniciado por gilber966 Ver Mensaje
Tal ves debas declarar variables globales fuera de las funciones
Gracias gilber966 pero ya lo he intentado colocando como global a la variable nuevo_id que es la de retorno pero sigue pasando lo mismo.... en el alert de la funcion devuelve el resultado correcto, pero cuando la funcion "devuelve el control" para que siga la ejecucion del código, la variable que debería recibir el resultado, contiene "undefined".... probe todo lo que se, lei todo lo que pude sobre esto, pero no encuentro el porque.. o por lo menos no me doy cuenta. muchas gracias por la ayuda de todos modos!

Espero que alguien pueda darme una mano con esto, ya no se que puede ser.. Gracias nuevamente
  #4 (permalink)  
Antiguo 26/03/2012, 08:17
Usuario no validado
 
Fecha de Ingreso: febrero-2012
Mensajes: 24
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Esta funcion retorna un resultado correcto pero al guardar es undefined

Hice muchas pruebas y llegue a la conclusion que el problema no esta en mi función existe_div(div,numero,padre); lo que hice es lo siguiente, probe en vez de retornar el resultado, reemplazar el return y en su lugar probe colocar el resultado con javascript en un input y me guarda perfecto el valor, pero no logro entender por que cuando llamo a la funcion con el return( tal cual el código posteado) dentro de otra funtion (en este caso dentro de guardar_elementos_en_input()) el valor que recibe la variable donde guardo el resultado es "undefined".

Ya no se que mas probar si alguien tiene una sugerencia será muy bienvenida, quiza vean algo que no vi, Muchas gracias.

PD: para que se entienda mejor, solo coloquen el código que postee mas arriba en un solo archivo y veran los resultados a los que me refiero .
  #5 (permalink)  
Antiguo 26/03/2012, 10:35
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
Puntos: 1485
Respuesta: Esta funcion retorna un resultado correcto pero al guardar es undefined

¡buenas!
tu caso es bastante simple. en la mayoria de los casos, cuando haces recursividad tienes que devolver el valor de esa recursión. es decir, asumiendo que el proceso va por el segundo nivel de recursión y se encontró un valor válido, entonces ese segundo nivel de recursión devuelve el valor al nivel anterior. pero si ese nivel anterior (primer nivel de recursión) no devuelve el valor, entonces la función devuelve undefined. fíjate en la línea #18 no estás devolviendo el resultado de esa próxima recursión.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #6 (permalink)  
Antiguo 26/03/2012, 18:54
Usuario no validado
 
Fecha de Ingreso: febrero-2012
Mensajes: 24
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Esta funcion retorna un resultado correcto pero al guardar es undefined

Gracias zerokilled! si me di cuenta hoy cuando segui probando y lo arregle de esta manera para el que le sirva:

Código Javascript:
Ver original
  1. function existe_div(div,numero,padre)//Ej div-> input- numero-> 1
  2. {
  3.     alert('LLEGAN LOS DATOS: DIV->'+div+'< NUMERO->'+numero+'< PADRE:->'+padre+'<')
  4.     if(padre != ''){padre_id = '-'+padre;}else{var padre_id = '';}
  5.     nuevo_id = '';
  6.     nuevo_id = div+numero+padre_id;
  7.    
  8.     alert('f existe: Nuevo id1: '+ nuevo_id)    
  9.    
  10.         if(document.getElementById(nuevo_id) != null)
  11.         {
  12.             alert('El div ->' + nuevo_id + 'Ya existe!');
  13.                
  14.                 siguiente = (parseInt(numero)+1);
  15.                
  16.                 //nuevo_id = div + siguiente + '-' + padre_id;
  17.                
  18.                 existe_div(div,siguiente,padre);
  19.                
  20.         }
  21.        
  22.  
  23.         alert('f existe- > RETORNA: '+ nuevo_id);
  24.                
  25.         return nuevo_id;
  26.                
  27.  
  28.  
  29. }


de todos modos, en la linea 18 -> existe_div(div,siguiente,padre);

no hice un retorno por que no lo necesito, necesito que siga la recursividad hasta que el div conformado no exista solo en ese caso la función tiene que devolver el valor, no entendi esa parte que comentaste por eso repregunto para que me quede mas claro , te referias a que devuelva un false por ejemplo para indicar que debe seguir la recursividad? muchisimas gracias por la ayuda!

es increible como uno a veces se traba con cosas tan tontas jaja pero bueno
  #7 (permalink)  
Antiguo 27/03/2012, 02:02
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
Puntos: 1485
Respuesta: Esta funcion retorna un resultado correcto pero al guardar es undefined

la solución que implementas es practicamente lo mismo. pero de igual forma parece que no haz entendido lo que quise señalar. te muestro una imagen de más o menos el flujo de tu código inicial. esta compuesta por tres columnas: inicio, ciclo 1 y ciclo 2. el código representa una versión bien reducida de lo que tenías. el texto en rojo es la porción de código que se interpreta en ese ciclo, el texto en verde es el valor que devuelve el ciclo, y la línea que conecta las diferentes secciones es el punto en que activa las distintas secciones. como podrás analizar, en el ciclo 1 se asume que la condición es cierta y por tanto vuelve a invocar la misma función. en el ciclo 2 se asume que la condición evalua a falso y por tanto devuelve un valor. nótese particularmente en el ciclo 1 cuando recibe el valor de ciclo 2, este no hace ninguna operación adicional con el valor recibido. por tanto, ciclo 1 continua la interpretación saltando else y finaliza porque no hay más instrucciones. como la función no devuelve explicitamente un valor, automáticamente devuelve undefined al proceso que lo invocó. lo que te quise explicar antes fue que tenías que devolver ese valor que (en este ejemplo hipotético) ciclo 1 recibe de ciclo 2. es decir, ubicarle un return de esa invocación: return fn().

NOTA 1: ahora no vayas a cambiar el código actual, porque tal como lo tienes es practicamente lo mismo a lo que te quise decir. aunque, deberías hacer la variable nuevo_id local.

NOTA 2: puede que la imagen se vea pequeña, pero si abres la imagen en una pestaña sola lo verás en tamaño normal.

__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #8 (permalink)  
Antiguo 27/03/2012, 16:32
Usuario no validado
 
Fecha de Ingreso: febrero-2012
Mensajes: 24
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Esta funcion retorna un resultado correcto pero al guardar es undefined

Muchas gracias zerokilled! me quedo clarisimo, ya entendi el "por que" gracias por tomarte el tiempo de explicarlo te felicito, me fue de mucha ayuda.

Saludos!

Etiquetas: function, return, undefined
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:01.