1

我想阅读此页面的 json 内容:http://89.92.40.250:8010/dreamteam/interface/get_event_detail.php?id=397使用 javascript。

所以我开始了这个脚本:

var req = new XMLHttpRequest();
    req.open("GET", "http://89.92.40.250:8010/dreamteam/interface/get_event_detail.php?id=397", true); 
    req.onreadystatechange = monCode;   
    req.send(null);      

    function monCode() { 
        if (req.readyState == 4) { 
            var doc = eval('(' + req.responseText + ')');
            alert(req.responseText);
        }
    } 

当我想显示我使用的内容时 alert(req.responseText); 我没有看到内容。另外我有一个 Firebug 语法错误:语法错误:var doc = eval('(' + req.responseText + ')');

JSONP 不可能。

我们可以提取页面的内容,然后将其转换为 JSON 格式然后解析它吗?

4

4 回答 4

1

由于跨域限制,这是不可能的;您的页面应托管在同一主机上。

您可以投资以下替代方案:

  • 使用 JSONP(在您的情况下可能不起作用)
  • 在将提取文件内容的同一主机上使用服务器端脚本(如代理)
  • 查看配置跨域访问控制的方法:https ://developer.mozilla.org/En/HTTP_access_control (您也不太可能选择)
于 2012-05-13T11:58:31.920 回答
1

如果您无法创建自己的代理,则应使用 YQL 以避免跨域问题。

这是一个示例网址id=397

http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20json%20where%20url%3D'http%3A%2F%2F89.92.40.250%3A8010%2Fdreamteam%2Finterface%2Fget_event_detail.php%3Fid%3D397'&format=json&diagnostics=true

你可以像这样动态设置id,

var id = 397;
var baseurl = "http://query.yahooapis.com/v1/public/yql?q=";
var q = "select * from json where url = 'http://89.92.40.250:8010/dreamteam/interface/get_event_detail.php?id="+id+"'";  
var url = baseurl + encodeURI(q) + "&format=json&diagnostics=true";
var req = new XMLHttpRequest();
req.open("GET", url, true);
req.onreadystatechange = monCode;
req.send(null);

function monCode() {
    if (req.readyState == 4) {
        var data = JSON.parse(req.responseText).query.results;
        console.log(data);
        //console.log(data.event);
        alert(data.event.title);
    }
}​

是一个 jsFiddle DEMO

YQL 的使用限制

  • 每个应用程序限制(由您的访问密钥标识):每天 100,000 次调用
  • 每个 IP 限制:/v1/public/ :每小时 2,000 次呼叫;/v1/yql/ : 每小时 20,000 次通话
于 2012-05-13T13:06:07.350 回答
0

由于您正在从 127.0.0.1 向 89.92.40.250:8010 发出请求,这将是一个跨域请求,即使您访问同一台机器上的不同端口(如 127.0.0.1:8080),它也是一个跨域请求。

如果您可以控制 89.92.40.250:8010 呈现的内容,您可以使用jsonp它来绕过跨域限制,但它需要在后端进行一些更改,或者您可以使用http://jsonp.jit.su/提供的功能它基本上代表您联系服务器,创建一个jsonp您可以处理的响应。

于 2012-05-13T12:15:11.173 回答
0

正如我在上面的评论中所说,您不能执行跨域 AJAX 请求。浏览器通常禁止这样做。

如果你真的想做一个跨域请求,有几个选项,一个是代理(配置你的本地网络服务器以将请求发送到远程服务器),另一个是JSONP)。

JSONP 基本上包括在script您的 HTML 文档中添加一个额外的标签,同时使用请求 URL 作为src. 这允许您绕过跨域安全控制,因为您始终可以包含来自其他站点的 JS 资源。但是,远程服务器必须知道它必须对请求应用前缀(即read_data({ /* JSON response */});,否则返回的信息将不会被处理。

更新

例如,jQuery 可以透明地处理 JSONP,就好像它是一个普通的 AJAX 请求一样:

http://api.jquery.com/jQuery.ajax/

IE:

$.ajax({url:'http://your/request/url/',
        jsonp: 'your_desired_prefix',
        success: function(result) {
          /* result should hold you JSON data */
        });
于 2012-05-13T12:35:56.770 回答