【问题标题】:jQuery and JSONP - cross-domain and also same domainjQuery 和 JSONP - 跨域和同域
【发布时间】:2013-01-04 20:16:58
【问题描述】:

我了解 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() 调用时,逻辑启动,引号被处理,结果有点成功......“有点”,因为虽然 JSONP 是由$.ajax调用,错误回调被触发,然后用回调函数正确处理数据...?!

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

感谢您的宝贵时间。

【问题讨论】:

  • 您不能使用 JSONP 进行错误回调或同步 AJAX。 The docs 似乎对同一服务器调用没有例外。
  • 这可能与您选择的函数名称有关:quotator.testimonialFetch 要使其工作,jQuery 必须创建一个对象并为其分配一个函数。尝试使用没有. 的东西。
  • 谢谢,布雷兹。我不知道为什么,但删除这些回调就可以了。凯文,我有一个应用程序对象已经称为“报价员”;抱歉,我绕过了在示例代码中的解释。 :-)
  • 作为答案提交。不知道这是否是问题的原因,但认为您应该从那里开始。

标签: jquery jsonp


【解决方案1】:

您不能使用 JSONP 执行错误回调或同步 AJAX。 The docs 似乎对同一服务器调用没有例外。

【讨论】:

  • 我真的不知道为什么,但删除这些回调就可以了。
猜你喜欢
  • 2013-10-23
  • 2011-07-25
  • 2013-04-04
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 2011-02-02
相关资源
最近更新 更多