您好我正在尝试仅使用JavaScript
和HTML
来从网址中读取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数据但没有回调函数。
为你的帮助干杯。
答案 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进行处理。