【问题标题】:jQuery cross-domain request returns 'undefined'jQuery 跨域请求返回“未定义”
【发布时间】:2013-10-04 20:52:11
【问题描述】:

在阅读了关于 stackoverflow 的各种示例后,我编写了这个函数:

function showGetResult(crossDomainUrl) {
    $.ajax({
        url: crossDomainUrl,
        type : 'GET',
        crossDomain: true,
        success: function (data) {
            debug(data);
            return data;
        }
    });
}

并用这个来调用它

alert(showGetResult(crossDomainUrl));

但我得到的只是'undefined',这是在内容脚本内的网络浏览器扩展中使用的。

【问题讨论】:

  • 虽然相似的两者并没有像这里的许多其他示例那样解决我的问题,但请参阅我的评论 - “谢谢这有效,但我需要获取一个 javascript 文件。我尝试了数据类型值 jsonp、脚本和 html一切都失败了。见 - jsfiddle.net/tsyGj"
  • @Stacked — 你有两个不同的问题。标记为重复的问题解决了返回数据的问题。您的另一个问题(我们只能从您的 JSFiddle 中得知,而不是从您问题中的任何代码中得知)是同源政策,这已包含在 this other duplicate question 中。
  • @Quentin 我应该删除这个吗?

标签: javascript ajax jquery cross-domain


【解决方案1】:

这是因为 Ajax 请求是异步运行的。 return data 不做任何事情。您可以将其更改为(更新以反映 cmets 中的请求以便能够下载脚本):

function showGetResult(crossDomainUrl) {
    return $.ajax({
        url: crossDomainUrl,
        type : 'GET',
        dataType: 'script',
        crossDomain: true
     });
}

showGetResult('http://code.jquery.com/ui/1.10.3/jquery-ui.js')
    .done(function(data) {
        alert("success: " + data);
    })
    .fail(function(jqXHR, textStatus, ex) {
        alert("failed: " + textStatus);
    });

要真正跨域调用,您需要使用 jsonp 或脚本。阅读此wiki,了解有关同源政策的更多信息。有关使用 jsonp 的更多信息,请参阅this answer

上面的代码会将下载的jscript注入到dom中执行

【讨论】:

  • 我在代码中对此进行了测试,但没有触发警报,与 jsfiddle.net/UmxRr 相同?
  • 与您的原始代码一样,只处理了成功。我添加了失败处理程序,请参阅jsfiddle.net/UmxRr/2
  • 但为什么一开始就失败了?
  • 根据您的要求更新了下载脚本的答案。
  • 仍然给success: undefined
【解决方案2】:

$.ajax() 设置查询,并立即返回,所以函数在请求完成之前返回。使用 success 指定在查询完成时调用的函数。

function showGetResult(crossDomainUrl) {
    $.ajax({
        url: crossDomainUrl,
        type : 'GET',
        crossDomain: true,
        success: showData
    });
}

function showData(data){
    debug(data);
    return data;
}
showGetResult(crossDomainUrl);

http://jsfiddle.net/5J66u/8/ - (已更新以指定 jsonp 和更好的 URL)

【讨论】:

  • 感谢这个工作,但我需要获取一个 javascript 文件。我尝试了数据类型值 jsonp、脚本和 html,但都失败了。见 - jsfiddle.net/tsyGj
  • showGetResult 函数仍将返回 undefinedshowData 返回无关紧要。
猜你喜欢
  • 2018-01-05
  • 1970-01-01
  • 2014-09-01
  • 1970-01-01
  • 2012-12-04
  • 2017-06-26
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
相关资源
最近更新 更多