jQuery和JSONP - 跨域和相同的域

时间:2013-01-21 17:46:23

标签: jquery jsonp

我理解JSONP如何工作的理论,但有关细节或语法的一些事情让我望而却步。我正在研究的一个例子是引用旋转器",它在使用JSON的单个域上运行良好,但我也希望在另一个域上使用它,只更新一个数据源

(旁注:我很奇怪,当调用域名为subdomain.mydomain.com时,请求mydomain.com弹出一个CORS问题。希望子域名没有受到影响!!)

我有一个JSON文件,我用静态函数填充,如下所示:

quotator.testimonialFetch(
{
    "testimonials": [
        {
            "quote": "Amazing product!",
            "quotedName": "Somebody",
            "quotedTitle": "Director of Yoyos",
            "company": "Kramerica",
            "products": ["product1"],
            "yearmonth": 201212,
            "active": true
        },
        {
            "quote": "Never seen anything like it.",
            "shortquote": "When quote is too long, use this.",
            "quotedName": "Fflewddur Fflam",
            "quotedTitle": "",
            "company": "Prydain",
            "products": ["product1","product2"],
            "yearmonth": 201212,
            "active": false
        }
    ]
}
);

我没有使用$.getJSON简写(附加回调),而是使用更详细的$.ajax()方法:

$.ajax({
   type: 'GET',
    url: 'http://www.mydomain.com/assets/testimonials.json',
    async: false,
    jsonpCallback: 'quotator.testimonialFetch',
    contentType: "application/json",
    dataType: 'jsonp',
    success: function(json) {
       console.log('success!');
       console.dir(json.testimonials);
    },
    error: function(e) {
       console.log('some sort of error!');
       console.log(e.message);
    }
});

它没有记录成功,但无论我是否在mydomain.com或sub.mydomain.com内拨打电话,都会记录错误。错误是某些东西是"未定义"。不确定那可能是什么。

所以,主要的是......不确定在哪里放置处理逻辑。它应该直接进入$.ajax()的回调吗?我确实创建了一个匹配填充名称的函数,它确实收到了数据对象:

quotator.testimonialFetch = function(data) {
// using the document ready function as a safety net; maybe I don't need to defer?
$(document).ready(function() {
        quotator.quoteobj = data.testimonials;
        console.log(quotator.quoteobj); // logs the object I'm expecting! Yay!
        };
    });
}

知道它的作用并不重要,或者至少我认为这不重要。重要的是:

- 当从sub.mydomain.com进行$.ajax()调用时,逻辑开始,引号被处理,结果有点成功......"排序"因为尽管$.ajax调用返回了JSONP,但是会触发错误回调,然后使用回调函数正确处理数据......?!

- 当从mydomain.com进行$.ajax()调用时,我得到了我想要的对象,但我无法处理它。我可以看到我的JSONP响应,但$.ajax成功回调本身没有处理,因为会触发错误回调。然后quotator.testimonialFetch()未被触发......由于是同域而不是跨域?

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

您无法使用JSONP执行错误回调或同步AJAX。 The docs似乎没有对同一服务器调用做出异常。