【问题标题】:jsonp callback function not getting called with jQueryjsonp回调函数没有被jQuery调用
【发布时间】:2013-08-20 20:45:38
【问题描述】:

我已经搜索了这个站点和其他地方,试图解决我在使用 jsonp 时遇到的问题。首先,这是我拥有的代码:

url =  "http://mydomain.com/return_json";

$.ajax({
    url: url, // + '?callback=?' --I realized this is not necessary with dataType: 'jsonp'
    dataType: 'jsonp',
    crossDomain: true,
    error: function(xhr, status, error) {
            console.log(xhr);
            console.log(status);
            console.log(error);
        },
    success: function(dataWeGotViaJsonp){
        var text = '';
        var len = dataWeGotViaJsonp.length;
        for(var i=0;i<len;i++){
            item = dataWeGotViaJsonp[i];
            text += '<p>' + item + '</p>';
        }
        $('#action_target').html(text);
    }
});

在发送端,/return_json url 是一个 Django 站点,它通过以下方式发送 json 数据:

def return_json(request):

    data = [{'testing': 'testing'}, {'one': 1, 'two': 2, 'three': 3}]

    return HttpResponse( json.dumps(data), content_type="application/javascript" )

正如您在 JavaScript 中看到的那样,我在出错时不加选择地将所有内容转储到控制台中。这是它的输出:

Object { readyState=4, status=200, statusText="success"}
parsererror
Error: jQuery110207276483389928793_1377030169256 was not called

firebug 的“net”区域显示该 url 为: http://mydomain.com/return_json? callback=jQuery110209170565296948737_1377029879665&amp;_=1377029879666

它还表明响应中包含有效的 JSON。它甚至有一个带有漂亮输出的 JSON 部分。所以,显然我的问题是 jQuery 自动生成的回调函数在那里,但没有被调用。我使用为 jsonp 设置的 $.ajax 和 $.getJSON 方法得到了相同的结果。在这一点上我唯一能想到的就是我应该在发送方以某种方式将 json 数据包装在一个函数中,但我的印象是接收方会处理这个问题。如果有人能看出我做错了什么,将不胜感激。

==================================更新完整答案========== ===============

Hamish 在下面有正确的答案,尽管它只需要两个小调整。以下是使用 Django 以 JSONP 格式发送数据的方法:

def return_json(request):
#                      ^--------I didn't need a parameter in this situation
json_data = ["one", "two", "three"]

return render_to_response("uitest/jsonp_template.html", Context({
    'callback': request.GET.get('callback'),
    'json': mark_safe(json.dumps( json_data )),
#                ^------------------------------This keeps your JSON from getting mangled in 
#                                               URL                                                      
}), mimetype="application/javascript")
#^---------------------This closing parentheses was missing in Hamish's answer at the time
#                      of this writing.                                         

【问题讨论】:

  • JSONP 不返回 JSON。 JSONP 返回一个函数调用,将 JSON 传递给它。您的回复应采用jQuery1239823492834(YOUR JSON HERE); 的形式,您可以在其中使用request 并获取“回调”项来获取函数的名称。然后你按照我刚才提到的格式构建响应

标签: javascript jsonp


【解决方案1】:

JSONP 响应实际上是一个 脚本 响应 - 类似于:

callbackFunctionName([{'testing': 'testing'}, {'one': 1, 'two': 2, 'three': 3}]);

创建一个返回 application/javascript 响应的模板,该模板对函数 request.GET.get('callback') 进行函数调用,并将 JSON 的主体作为唯一参数。

类似:

def return_jsonp(request, json_data)
    return render_to_response("jsonp_template.html", Context({
        'callback': request.GET.get('callback'),
        'json': json.dumps(json_data),
    }, mimetype="application/javascript")

jsonp_template.html 只是:

{{ callback }}({{ json }});

【讨论】:

  • 请注意,整个模板可能是矫枉过正,也许只是从一个字符串渲染:)
  • 啊,所以我的怀疑是正确的。我需要使用发件人方面的功能对其进行格式化。这是我在 Django 中看到的第一个尝试这样做的示例,所以谢谢你。看来您在参数 2 中缺少 Context 的右括号。当我添加它时,我仍然得到相同的总体结果,但是响应中没有 JSON 数据,它只有 jQuery random-名称功能坐在那里。我会错过应该触发它的东西吗?
  • 我忘记用之前的评论通知你了。
  • 您应该拥有带有 JSON 主体的函数 - 此时它不再是真正的 JSON。能发回发回的内容和错误响应吗?
  • 当然,一切都一样,包括控制台错误/内容。唯一不同的是在net下,和相应的get请求,有函数名,jQuery110206621304255184078_1377125326378
猜你喜欢
  • 2013-04-25
  • 2013-10-21
  • 2012-06-25
  • 2017-07-26
  • 2013-02-16
  • 1970-01-01
  • 2013-06-17
  • 1970-01-01
  • 2014-04-06
相关资源
最近更新 更多