Javascript跨域JSON

时间:2015-08-31 00:29:48

标签: javascript cross-domain jsonp

您好我正在尝试仅使用JavaScriptHTML来从网址中读取json对象。我使用以下代码:

function getJSONP(url, success) {

    var ud = '_' + +new Date,
        script = document.createElement('script'),
        head = document.getElementsByTagName('head')[0]
            || document.documentElement;

    window[ud] = function(data) {
        head.removeChild(script);
        success && success(data);
    };

    script.src = url.replace('callback=?', 'callback=' + ud);
    head.appendChild(script);
}

getJSONP('http://webURl?&callback=?', function(data){
    console.log(data);
});

正如您所猜测的那样,我得到了Not at same origin as the document, and parent of track element does not have a 'crossorigin' attribute. Origin 'null' is therefore not allowed access.

FYI服务器返回JSON数据但没有回调函数。

为你的帮助干杯。

2 个答案:

答案 0 :(得分:7)

服务器需要使用以下标头启用CORS: (这里的答案是肯定的:CORS with php headers

// Allow from any origin
if (isset($_SERVER['HTTP_ORIGIN'])) {
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Credentials: true');
    header('Access-Control-Max-Age: 86400');    // cache for 1 day
}

// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
        header("Access-Control-Allow-Methods: GET, POST, OPTIONS");         

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
        header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

    exit(0);
}

或者服务器需要输出JSONP,如:

echo $_GET['callback'] . '(' . json_encode($whatever) . ')';

如果这不在您自己的服务器上,则另一个选项是在您自己的服务器上创建一个PHP文件,该文件在您需要读取的URL上执行filegetcontents(使用没有cors的JSON数据)并回显相同的JSONP格式的数据。 然后,您可以在纯javascript getJSON函数中使用这个新的PHP文件(url)。

如果没有服务器在中间或cors或jsonp,则无法实现。

答案 1 :(得分:4)

如果你想要一个快速的&工作修复,您可以通过iframe获取内容,或使用像YQL这样的代理。

但我建议使用后端策略来获取您的内容,然后使用javascript进行处理。