使用Django回调的Javascript getJSON问题

使用Django回调的Javascript getJSON问题,javascript,jquery,django,getjson,Javascript,Jquery,Django,Getjson,我正试图使用此脚本拨打电话,但收到“未捕获的SyntaxError:意外标记:” 我不知道我哪里出了问题,我不知道是不是我回电话了。我正在发送一个有效的JSON数据包,所以我认为这不是问题所在。总之,下面是我的html/jquery调用: <script> function loadJSON(){ $.getJSON("http://localhost:8000/api/0.1/tonight-mobile.json&callback=?", function(dat

我正试图使用此脚本拨打电话,但收到“未捕获的SyntaxError:意外标记:

我不知道我哪里出了问题,我不知道是不是我回电话了。我正在发送一个有效的JSON数据包,所以我认为这不是问题所在。总之,下面是我的html/jquery调用:

<script>
function loadJSON(){
    $.getJSON("http://localhost:8000/api/0.1/tonight-mobile.json&callback=?", function(data){
            alert('hey');
             $('result').append(data);
             alert('hey 2'); 
         $.each(data, function(i, json){});

    });
    alert('hey 3');
}
</script>
以下是我的服务器正在记录的请求(因此我知道至少有一个OK状态代码可以记录到这一点):

在我的javascript控制台中显示此错误:

Uncaught SyntaxError: Unexpected token : tonight-mobile.json&callback=jsonp1293142434434:1
如果您需要查看我的JSON格式(如果这是导致此问题的原因),请让我知道,我也可以发布它

提前感谢您的帮助


更新:

以下是来自我的服务器的响应:

{"Places": [{"url": "http://localhost:8000/api/0.1/places/1.plist", "image_url": "http://localhost:8000/static/place_logos/Tsonoqua_Mask.gif", "name": "Boo's Place"}]}
[23/Dec/2010 17:37:22] "GET /api/0.1/tonight-mobile.json&callback=jsonp1293147441552 HTTP/1.1" 200 167

更新2:

我已经成功地让我的回调正常工作了!代码如下:

客户端:

<script>
function loadJSON(){
    $.getJSON("http://localhost:8000/api/0.1/tonight-mobile.json&callback=?", logIt(data));
}
function logIt(data){
    window.console && console.log(data);
    alert('yay!');
}
</script>
这将返回以下响应:

logIt({"Places": [{"url": "http://localhost:8000/api/0.1/places/1.plist", "image_url": "http://localhost:8000/static/place_logos/Tsonoqua_Mask.gif", "name": "Boo's Place"}]})
callback({"Places": [{"url": "http://localhost:8000/api/0.1/places/3.plist", "image_url": "http://localhost:8000/static/place_logos/Bengals_1.png", "name": "Big 12", "events": 2}, {"url": "http://localhost:8000/api/0.1/places/2.plist", "image_url": "http://localhost:8000/static/place_logos/Makonde_Mask.gif", "name": "Harpo's", "events": 0}, {"url": "http://localhost:8000/api/0.1/places/1.plist", "image_url": "http://localhost:8000/static/place_logos/Quintons_1.png", "name": "Quinton's", "events": 1}]})
这就是它应该发挥的作用吗?看来我应该能够简化getJSON调用。。。我只是想确保在继续向前解析响应并将它们设置为页面上的元素之前,我已经正确地完成了回调所需的所有操作


更新3*

所以,我已经取得了相当大的进步!!我使用的是jquerymobile,所以忽略以下一些过度使用的css,它与核心问题无关

我在JSON数据包中的“位置”循环时遇到问题。我得到了多个“位置”的响应,但似乎不知道如何迭代它们。我的每个循环中的“i”变量对第一个元素正常工作,并显示其相应的名称和图像。

我的getJSON和回调方法已演变为:

<script>
function loadJSON(){
    $.getJSON("http://localhost:8000/api/0.1/tonight-mobile.json&callback=?", callback(data));
}
function callback(data){
    $("#tonight-list").each(data.Places, function(i) {
        $(this).append("<li role='option' tabindex='" + data.Places[i] + "' class='ui-li-has-thumb ui-li ui-btn ui-btn-icon-right ui-corner-top ui-corner-bottom ui-controlgroup-last ui-btn-down-c ui-btn-up-c' data-theme='c'><div class='ui-btn-inner ui-corner-top ui-corner-bottom ui-controlgroup-last'><span class='ui-icon ui-icon-arrow-r'></span><div class='ui-btn-text'><img src=" + data.Places[i].image_url + " alt=" + data.Places[i].name + " class='ui-li-thumb ui-corner-tl ui-corner-bl'/><h1 class='list-title ui-li-heading' id='list-title'><a href='detail.html?id=slide' data-transition='slide' class='ui-link-inherit'>" + data.Places[i].name + "</a></h1><span class='ui-li-count ui-btn-up-c ui-btn-corner-all'>" + data.Places[i].events + " events</span></div></div></li>");
    });

}
</script>

我是否混淆了each函数如何迭代JSON(成为)Javascript对象?我很确定每个地方都是我的问题,因为我只得到了“地点”列表的第一个元素。有人能帮我吗?

你在混合JSON和JSONP。Django脚本返回一个JSON对象,而jQuery需要一个用回调参数包装的JSON对象:


回调(JSON字符串)

是要返回jsonp,您需要将响应包装到函数中:

def tonight_mobile(request):

    callback = request.GET.get('callback')

    def with_rank(rank, place):
        return (rank > 0)

    place_data = dict(
        Places = [make_mobile_place_dict(request, p) for p in Place.objects.all()]
    )

    xml_bytes = json.dumps(place_data)
    if callback:
        xml_bytes = '%s(%s)' % (callback, xml_bytes)
    return HttpResponse(xml_bytes, content_type='application/json; charset=utf-8')

看起来不错,您可以简化getJSON调用,如下所示:

function loadJSON(){
    var url = "http://localhost:8000/api/0.1/tonight-mobile.json&callback=?";
    $.getJSON(url, function(data){
        if(data){
            console.log(data.name);
        }
    });
}
在您的python代码中,我会这样做

callback = request.GET.get('callback')
而不是

callback = request.GET.get('callback', 'logIt')

因此,如果不提供回调,将返回json而不是jsonp。

Yup问题在于响应,您返回的是json,而不是jsonp。那么,在我的客户端,如何引用这个包装函数?我不明白我在getJSON中的函数怎么没有做到这一点……您的客户端代码看起来已经正确了。如果URL包含字符串“callback=?”(或类似字符串,如服务器端API所定义的),则请求将被视为JSONP。这是一篇关于json和jsonp的好文章:如果json和请求json的网页位于同一个域上,那么您不需要将其作为jsonp使用。感谢您提供了有用的链接keegan3d(javascriptweblog)——这让我明白了一切是如何工作的jQueryAPI文档没有提供足够的回调功能细节。我已经更新了我的现状,如果你能看一下“更新2”并回复,我将不胜感激!我已经更新了我的问题,并取得了相当大的进展,可以在迭代器上使用一些帮助。如上所述,我已经更新了我的当前情况,并认为我正在正确地进行回调-尽管似乎我应该能够简化对回调函数的客户端调用?嘿,keegan,我已经发布了对我的初始问题的另一个更新,而不是用术语来混乱。:)如果你能对我的迭代器提供一些指导,那就太棒了。:)
function loadJSON(){
    var url = "http://localhost:8000/api/0.1/tonight-mobile.json&callback=?";
    $.getJSON(url, function(data){
        if(data){
            console.log(data.name);
        }
    });
}
callback = request.GET.get('callback')
callback = request.GET.get('callback', 'logIt')