views:

53

answers:

3

I finally succeeded in using Ajax to get SOMETHING sent from one page to another! What I'm trying to do is pass an array from a PHP file to a Javascript file, and the Javascript file is receiving this in this.responseText:

<html>
<head>

    <script type="text/javascript">
        var jsonArray = ["chickens","horses","cows","werewolves","zombies","vampires","phantoms","U.S. Congressmen","performance artists","pieces of fencepost","barnhouses","robots","cyborgs"]

    </script>
</head>
</html>

I tried running eval() and alerting the result, but no result appears. How do I successfully extract the array from this.responseText?

Edit Here is my function thus far:

/*
 * Function: selectVictim
 * Called from function laserOn()
 *
 * Selects a random victim from a list of victims
 *
 * @return String: victim
 */
function selectVictim()
{
var params = "url=queenofsheep.com/Sheep/victims.php";
var request = new ajaxRequest();

request.open("POST", "victims.php", true);
request.setRequestHeader("Content-Type",
                             "application/x-www-form-urlencoded");
request.setRequestHeader("Content-Length", params.length);
request.setRequestHeader("Connection", "close");

request.onreadystatechange = function ()
{
    if (this.readyState == 4)
    {
        if (this.status == 200)
        {
            if (this.responseText != null )
            {
                var vicArray = eval('('+this.responseText+')');
                var numVic = Math.floor(Math.random() * (vicArray - 1));
                alert(vicArray);
            }
            else alert("Ajax error: No data received");
        }
        else alert("Ajax Error: " + this.statusText);
    }
}

request.send(params);
}    

Second Edit The file containing the array (in PHP) is as follows:

<html>
<head>
<?php

$victims = array(

    // Animals
    "chickens",
    "horses",
    "cows",

    // Supernatural
    "werewolves",
    "zombies",
    "vampires",
    "phantoms",

    // Human
    "U.S. Congressmen",
    "performance artists",

    // Inanimate, non-mechanical
    "pieces of fencepost",
    "barnhouses",

    // Mechanical
    "robots",
    "cyborgs"

);

?>

    <script type="text/javascript">
        var jsonArray = <?php echo json_encode($victims); ?>


    </script>
</head>
</html>
A: 

You can use the library on json.org or use eval("(" + this.responseText + ")");

Generally you want to use a library to parse the JSON string instead of eval because eval is generally unsafe.

Ken Struys
+1  A: 

If your php page is returning all the text that you reported (with <html> etc...) then your output is not a JSON object, but an html page. Your response should contain only your serialized JSON object (and the proper http response headers)...

Once you have 'cleaned' your output you can use JSON2 library to parse your object: http://www.json.org/js.html

var myObject = JSON.parse(myJSONtext);
mamoo
+1  A: 

That does not look like a proper JSON response from the server, because it contains HTML code and then a chunk of javascript. The response should contain only javascript code containing data, like

var data = ["chickens","horses","cows","werewolves","zombies"]";

You can then eval() the string and it will work.

As said above, eval() might be unsafe, so, if using jQuery, you can use the $.parseJSON function which is safe.

To return the JSON correctly, don't output HTML at all in the page, just do something like

<?php

    $victims = ...; // fill array

    echo json_encode($victims);
?>
axel_c
Okay, so I put the array in a .json file, but now eval is coming up with `undefined`.
Andrew
I'm not sure what you mean by 'i put the array in a json file'. The victims.php file should do any processing you need of the post data, and then echo ONLY the JSON data back. You should also set the response type to 'text/json'.Use firebug mozilla extension to examine what you're sending and what you're receiving, the ajax call should return only escaped javascript code
axel_c