这里有两个页面,test.php和testserver.php。

test.php

<script src="scripts/jq.js" type="text/javascript"></script>
<script>
    $(function() {
        $.ajax({url:"testserver.php",
            success:function() {
                alert("Success");
            },
            error:function() {
                alert("Error");
            },
            dataType:"json",
            type:"get"
        }
    )})
</script>

testserver.php

<?php
$arr = array("element1",
             "element2",
             array("element31","element32"));
$arr['name'] = "response";
echo json_encode($arr);
?>

现在我的问题是:当这两个文件都在同一服务器(本地主机或web服务器),它的工作和警报(“成功”)被调用;如果它在不同的服务器上,即web服务器上的testserver.php和localhost上的test.php,则它不工作,并且alert(“错误”)正在执行。即使AJAX内部的URL更改为http://domain.example/path/to/file/testserver.php


当前回答

它在PHP中工作,只需将此添加到所服务的页面:

header("Access-Control-Allow-Origin: *");
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');

PS:我用方便和有用的方法制作了自己的xhr套件sa_ajax。(https://github.com/osergioabreu/sa_ajax/)

其他回答

这是可能的,但您需要使用JSONP,而不是JSON。斯特凡的线索给你指明了方向。jQuery AJAX页面有更多关于JSONP的信息。

Remy Sharp有一个使用PHP的详细示例。

同源策略确实阻止了JavaScript跨域发起请求,但是CORS规范只允许您正在寻找的那种API访问,并且得到当前一批主要浏览器的支持。

查看如何为客户端和服务器启用跨源资源共享:

http://enable-cors.org/

“跨域资源共享(CORS)是一个实现跨域边界真正开放访问的规范。如果你提供公共内容,请考虑使用CORS将其开放给通用JavaScript/浏览器访问。”

有一些使用JSONP的例子,其中包括错误处理。

但是,请注意,使用JSONP时不会触发错误事件!参见:http://api.jquery.com/jQuery.ajax/或jQuery ajax请求使用jsonp错误

我不得不从本地磁盘加载网页“file:///C:/test/htmlpage.html”,调用“http://localhost/getxml.php”url,并在IE8+和Firefox12+浏览器中做到这一点,使用jQuery v1.7.2 lib来最小化样板代码。在阅读了几十篇文章之后,我终于明白了。以下是我的总结。

服务器脚本(.php, .jsp,…)必须返回http响应头Access-Control-Allow-Origin: * 在使用jQuery ajax之前,在javascript中设置这个标志:jQuery.support.cors = true; 你可以设置标志一次或每次使用jQuery ajax函数 现在我可以在IE和Firefox中阅读。xml文档。其他浏览器我没有测试。 响应文档可以是纯/文本,xml, json或其他任何东西

下面是一个jQuery ajax调用的例子,其中包含一些调试系统。

jQuery.support.cors = true;
$.ajax({
    url: "http://localhost/getxml.php",
    data: { "id":"doc1", "rows":"100" },
    type: "GET",
    timeout: 30000,
    dataType: "text", // "xml", "json"
    success: function(data) {
        // show text reply as-is (debug)
        alert(data);

        // show xml field values (debug)
        //alert( $(data).find("title").text() );

        // loop JSON array (debug)
        //var str="";
        //$.each(data.items, function(i,item) {
        //  str += item.title + "\n";
        //});
        //alert(str);
    },
    error: function(jqXHR, textStatus, ex) {
        alert(textStatus + "," + ex + "," + jqXHR.responseText);
    }
});

使用JSONP。

jQuery:

$.ajax({
     url:"testserver.php",
     dataType: 'jsonp', // Notice! JSONP <-- P (lowercase)
     success:function(json){
         // do stuff with json (in this case an array)
         alert("Success");
     },
     error:function(){
         alert("Error");
     }      
});

PHP:

<?php
$arr = array("element1","element2",array("element31","element32"));
$arr['name'] = "response";
echo $_GET['callback']."(".json_encode($arr).");";
?>

echo可能是错误的,我已经有一段时间没用php了。在任何情况下,你都需要输出callbackName('jsonString'),注意引号。jQuery会传递自己的回调名称,所以你需要从get参数中获取。

正如Stefan Kendall所发布的,$.getJSON()是一个简便方法,但随后你需要附加'callback=?'到url作为GET参数(是的,值是?,jQuery用自己生成的回调方法替换它)。