这里有两个页面,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
我不得不从本地磁盘加载网页“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);
}
});
它的工作,所有你需要:
PHP:
header('Access-Control-Allow-Origin: http://www.example.com');
header("Access-Control-Allow-Credentials: true");
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
JS (jQuery ajax):
var getWBody = $.ajax({ cache: false,
url: URL,
dataType : 'json',
type: 'GET',
xhrFields: { withCredentials: true }
});