Foros del Web » Programando para Internet » Javascript » Frameworks JS »

Problemas indefinido...?

Estas en el tema de Problemas indefinido...? en el foro de Frameworks JS en Foros del Web. Hola a todos... y voy al grano. Hago clic sobre un enlace @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código HTML: Ver original < div onclick = "detalle(1)" class = ...
  #1 (permalink)  
Antiguo 12/02/2010, 22:32
Avatar de Fernarey1810  
Fecha de Ingreso: noviembre-2008
Mensajes: 214
Antigüedad: 16 años
Puntos: 1
Pregunta Problemas indefinido...?

Hola a todos... y voy al grano. Hago clic sobre un enlace

Código HTML:
Ver original
  1. <div onclick="detalle(1)" class="nombreProducto">

que debe activar esta funcion (esta funcion cuando recibe los resultados llama a esta otra: onfinish: mostrarDetalle, esta definida mas abajo)

Código Javascript:
Ver original
  1. function detalle(id) {
  2.     // busca los detalles del producto en el servidor
  3.     $Ajax("producto.php?id="+id, {
  4.         onfinish: mostrarDetalle,    
  5.         tipoRespuesta: $tipo.JSON,
  6.         avisoCargando: "cargando"
  7.     });
  8. }

Como veran hago una instancia del objeto XMLHttpRequest... utilizando una libreria que funciona perfectamente. Le paso un parametro: producto.php?id=id, por ej onclick="detalle(1)".

El codigo PHP debe retornar un string tipo JSON, funciona perfectamente este codigo, por las dudas lo pongo pero no es el problema (aclaro que todo esto es solo por practica no para una pagina online):

Código PHP:
Ver original
  1. <?php
  2. include 'db.php';
  3.  
  4. $producto = $_GET['id'];
  5.  
  6. $query = "SELECT `productos`.*, `categorias`.`nombre` AS 'categoria' FROM `productos` INNER JOIN `categorias` ON `idCategoria` = `categorias`.`id` WHERE `productos`.`id` = ".$producto;
  7. $result = mysql_query($query, $GLOBALS['DB']);
  8. $count = mysql_num_rows($result);
  9.  
  10. $cadena = "[";
  11. $i = 1;        
  12. while ($row = mysql_fetch_array($result)) {
  13.      $cadena .= "{\"id\": \"".$row['id']."\", \"nombre\": \"".$row['nombre']."\", \"descripcion\": \"".$row['descripcion']."\", \"precio\": \"".$row['precio']."\", \"foto\": \"".$row['foto']."\", \"categoria\": \"".$row['categoria']."\"}";
  14.      
  15.      if ($i != $count)
  16.         $cadena.= ", ";
  17.            
  18.      $i++;
  19. }
  20. $cadena .= "]";
  21. echo $cadena;
  22. ?>

Este es el JSON que retorna, simple una cadena comun y corriente:

[{"id": "1", "nombre": "Aceite de Oliva", "descripcion": "El aceite de oliva es un aceite vegetal de uso principalmente culinario que se extrae del fruto recién recolectado del olivo (Olea europaea) denominada oliva o aceituna.", "precio": "12.5", "foto": "aceite-de-oliva.jpg", "categoria": "Aceites"}]

Cuando quiero interpretar esta cadena, con su respectivo codigo JavaScript:

Código Javascript:
Ver original
  1. function mostrarDetalle(producto) {
  2.     // creo el contenido de la zona de detalle
  3.     var html = "<div class='detalleNombre'>"+producto.nombre+"</div>";
  4.    
  5.     if (producto.foto != "") {
  6.         // si tiene foto, la incluimos
  7.         html += "<img src='img/"+producto.foto+"' class='detalleFoto' />";
  8.     }
  9.     html += "<input type='button' class='detalleAgregar' value='Agregar al Canasto' onclick='agregar("+producto.id+")' />";
  10.     html += "<div class='detalleCategoria'>Categoria: "+producto.categoria+"</div>";
  11.     html += "<div class='detallePrecio'>Precio: $"+producto.precio+"</div>";
  12.     html += "<div class='detalleDescripcion'>"+producto.descripcion+"</div>";
  13.     $("listaDetalle").innerHTML = html;
  14. }

FIREBUG me muestra el siguiente error, y por ende no puedo tomar los datos... Tienen idea que ocurre????

http://s2.subirimagenes.com/imagen/40555711.png

Última edición por Fernarey1810; 12/02/2010 a las 22:56
  #2 (permalink)  
Antiguo 13/02/2010, 06:56
Avatar de MaBoRaK  
Fecha de Ingreso: abril-2003
Ubicación: La Paz - Bolivia
Mensajes: 2.003
Antigüedad: 21 años, 6 meses
Puntos: 35
Respuesta: Problemas indefinido...?

loading.................


Estas accediendo a un Array como un objeto, el objeto se encuentra dentro del array.

[{"id": "1", "nombre": "Aceite de Oliva",

entonces sería

producto[0].nombre o producto[0].categoria


connection closed.
__________________

Maborak Technologies
  #3 (permalink)  
Antiguo 13/02/2010, 10:23
Avatar de Fernarey1810  
Fecha de Ingreso: noviembre-2008
Mensajes: 214
Antigüedad: 16 años
Puntos: 1
Respuesta: Problemas indefinido...?

Hola master. Funcino lo q me dijiste. Pero no entiendo bien la diferencia. Por ej, esto es practicamente lo mismo que lo que estoy conslutando aca, pero funciona, y no colocando el [0] en producto. Fijate:

Cadena JSON:

[{id: 7, nombre: 'Asado', precio: 12}, {id: 5, nombre: 'Carne Picada', precio: 5.3}, {id: 6, nombre: 'Chorizo', precio: 8.9}, {id: 4, nombre: 'Costeleta', precio: 7.8}]

y luego accedo a esos resultados y todo funciona bien:P
ESTO NO FALLA COMO LO OTRO

Código Javascript:
Ver original
  1. function agregarResultado(producto) {
  2.     var div = "<div class='productoResultado' id='producto"+producto.id+"'>";
  3.     div += "<div class='nombreProducto' onclick='detalle("+producto.id+")'>"+producto.nombre+"</div>";
  4.     div += "<div class='precioProducto'>$ "+producto.precio+"</div>";
  5.     div += "<div class='agregarProducto' onclick='agregar("+producto.id+")'>Agregar</div>";
  6.     div += "</div>";
  7.     $("listaResultados").innerHTML += div;
  8.    
  9.     // agregamos el producto al hash
  10.     cacheProductos[producto.id] = {
  11.         nombre: producto.nombre,
  12.         precio: producto.precio
  13.     }
  14. }

Entendes? es lo mismo. La unica diferencia que veo es la forma en la que emplee las comilas entre las 2 cadenas devueltas en JSON.

Etiquetas: ajax
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 04:30.