2012-05-07 1 views
10

Non riesco a capire come leggere correttamente la mia risposta JSON da una richiesta jQuery $ .post().

Nella sottostante Codice jQuery, ho popolano un array associativo di stringhe da elementi dal DOM basato sul corrispondente "color_entry_id" che uso come chiave:

var image_links = {}; 
$(this).find('input[name="color_id"]').each(function() { 
    var color_entry_id = $(this).val(); 
    var image_link = $(this).parent().find('input[name="edit_image"].' + color_entry_id).val(); 
    image_links[color_entry_id] = image_link; 
}); 

poi faccio la richiesta POST, invio la mia serie di "link_immagine":

$.post(
    "test.php", 
    { id: product_id, "images[]": jQuery.makeArray(image_links) }, 
    function(data) { 
     var response = jQuery.parseJSON(data); 
     $.each(response.images, function(index, item) { 
      alert(item); 
     }); 
    } 
); 

Inoltre, come sopra indicato, cerco di scorrere la matrice di risposta e di uscita di ogni voce, che voglio essere una stringa, ma ho solo "[object Object ] "come valore avvisato. Non so come farlo visualizzare le stringhe che sto cercando di mostrare!

Ecco il codice PHP per test.php:

<?php 
    $product_id = $_POST['id']; 
    $images = $_POST['images']; 

    $response = array(); 
    $response['id'] = $product_id; 
    $response['images'] = $images; 

    echo json_encode($response); 
?> 

Ed ecco ciò che la parte rilevante del DOM assomiglia:

<input type='hidden' value='{{ color_entry_id }}' name='color_id' /> 
<p><img src='{{ color_img_link }}' /></p> 
<p>Image Link: <input class='{{ color_entry_id }}' name='edit_image' type='text' size='150' value='{{ color_img_link }}' /></p> 
<div class='colors {{ color_entry_id }}'> 
    <div class='img_color'> 
     <a href='javascript:void' style='background:...' class='selected'></a> 
     <p>...</p> 
    </div> 
</div> 

Mi chiedo se forse sto facendo la codifica JSON in modo errato sul lato PHP o se sto scorrendo la risposta in modo errato nel jQuery. Ogni aiuto è molto apprezzato!!

+0

Cosa si aspetta 'makeArray' fare per il vostro' oggetto image_links'? E avrai più fortuna con 'console.log' per il debug,' alert' fa un casino di cose quando le stringe. –

+0

Hmm, questo è quello che avevo usato in precedenza per un'applicazione diversa che funzionava bene. Non dovrei usarlo? – jrubins

+0

Ma perché stai usando 'makeArray'? Cosa ti aspetti '$ .makeArray ({a: 'b', c: 'd'})' da fare? Qual è il server che si aspetta di trovare in '$ _POST ['images']'? –

risposta

21

Ok then..the L'oggetto dati che stai recuperando dal post è: {"id":"abc","images":[{"color123":"somelink.com\/123","color223":"somelink.com\/‌​223"}]};

Se cambi l'avviso, troverai i valori che stai cercando:

$.post(
    "test.php", 
    { id: product_id, "images[]": jQuery.makeArray(image_links) }, 
    function(data) { 
     var response = jQuery.parseJSON(data); 

     var images = response.images[0]; 
     for (var i in images){ 
      alert(images[i]); 
     } 
    } 
); 
+0

Grazie! Per qualche motivo ho aggiunto json_encode ($ images) al mio php che era il motivo per cui stava rovinando. – jrubins

23

$ .post aspetta xml per impostazione predefinita, è necessario specificare il formato di risposta

$.post(
    "test.php", 
    { id: product_id, images : jQuery.makeArray(image_links) }, 
    function(response) { 
     // Response is automatically a json object 
     for(var i = 0; i < response.images.length; i++) { 
      alert(response.images[i]); 
     } 
    }, 'json' // <-- HERE 
); 

Inoltre, considerare l'aggiunta di un'intestazione tipo di contenuto nello script php

<?php 
    header("Content-type: application/json"); // Adding a content type helps as well 
    $product_id = $_POST['id']; 
    $images = $_POST['images']; 

    $response = array(); 
    $response['id'] = $product_id; 
    $response['images'] = $images; 

    echo json_encode($response); 
    ?> 
+0

Grazie per i suggerimenti! Ma ancora non aiuta ad afferrare le informazioni di cui ho bisogno. Qualche suggerimento per quell'aspetto? – jrubins

+0

Ho aggiornato la parte javascript della risposta, prova che :) Non hai bisogno di fare "immagini []", poichè pubblicare un array javascript lo fara 'automaticamente per te – Bryan

+0

Che passa semplicemente ogni lettera della risposta stringa una alla volta. Non prende la stringa intera e non ho idea del perché – jrubins

2

Un esempio di base piuttosto sarebbe qualcosa di simile:

$.post('test.php', {"id": 42}, function (json) { 
console.log(json); 
}, 'json'); 

PHP esempio

$number = rand(1,$_POST["id"]); 
return print json_encode($number);