views:

2367

answers:

4

I am trying to use the getJSON function in jQuery to import some data and trigger a callback function. The callback function doesn't run. However, if I try the same thing with the get function, it works fine. Strangely, it works with the get function even when I pass "json" as the type. Why is this happening? I tested the following file in Firefox 3 and IE 7:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;
<html><head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
<title>ajax test</title>
<script type="text/javascript" src="/jquery-1.3.2.min.js"></script>
</head>
<body>
<input type="button" id="test1" value="get">
<input type="button" id="test2" value="getJSON">
<input type="button" id="test3" value="get with json type">
<script type="text/javascript">
$("#test1").click(function() {
    $.get("index.html",
     function(response) {
      alert('hi');
      //works
     }
    )
});

$("#test2").click(function() {
    $.getJSON("index.html",
     function(response) {
      alert('hi');
      //doesn't work
     }
    )
});

$("#test3").click(function() {
    $.get("index.html",
     function(response) {
      alert('hi');
      //works
     },
     "json"
    )
});
</script>
</body></html>

This seems to happen no matter what URL I access, as long as it's on the same domain. I tried passing some data and that doesn't make a difference.

Of course I can work around the problem by using the get function like I did in my 3rd test function, but I am still curious as to why this is happening.

I know there is a similar question asked here but it didn't answer my question.

+6  A: 

The json needs to be valid, otherwise the callback will not fire.

karim79
Thank you for the fast response.
mikez302
It is true, Firefox and IE react differently to invalid JSON
Jon Winstanley
this is one of those things that seems unbelievable - why would it silently fail? but it's absolutely true. http://www.jsonlint.com/ is a good validator.
matt lohkamp
A: 

Under the surface, when you call getJSON, this is what's happening:

// ~ line 3216
getJSON: function( url, data, callback ) {
    return jQuery.get(url, data, callback, "json");
}, // ... rest of jQuery core

So there must be some other thing preventing the callback from firing...

I would start by alerting different things (not just 'hi') on each callback, that way you know which one is failing/succeeding.

J-P
A: 

As mentioned by numerous others, you need valid JSON (i.e. complies with the rules at http://json.org/) for getJSON to work (this means you cannot get HTML via getJSON as in your example).

The reason the last test works is because the last parameter "json" is not being interpreted as the "type". Because the following does NOT work:

$("#test3").click(function() {
    $.get("index.html",
        '',
        function(response) {
                alert('hi');
                //works
        },
        "json"
    )
});
grammar31
A: 

Hi, I had the same issue despite having well formed JSON etc. I was able to query my webservice, and get a response, however, my callback function wasn't firing. After scrounging the net, i most interwebers suggested using 'jsonp', which i did since my app performs some cross domain calls, and also added 'callback?' to my url. This didn't work but that including the callback with the returned JSON solved my problem. The code below explains what i mean:

//server side json formed somewhere up here
String data = callback + "("+ json +")" ;

the response resulting from this is something like "jsonp1280403476086([{"Name":"Jack Sparrow" which jQuery seemed to not have a problem and so never died on me.

Hope this helps.

Carl_Platt