一尘不染

JavaScript jQuery AJAX跨域

javascript

这是两个页面,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服务器)时,它可以工作并被alert("Success")调用;如果它在不同的服务器上,则意味着Web服务器上的testserver.php和localhost上的test.php,它不起作用,并且alert("Error")正在执行。即使ajax内的URL更改为http://domain.com/path/to/file/testserver.php


阅读 396

收藏
2020-04-22

共1个答案

一尘不染

使用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).");";
?>

回声可能是错误的,因为我使用过php已经有一段时间了。无论如何,您都需要输出callbackName('jsonString')引号。jQuery将传递它自己的回调名称,因此您需要从GET参数中获取该名称。

正如Stefan Kendall 所说$.getJSON()是一种简写方法,但是您需要将'callback=?'它作为GET参数追加到url(是,值是?,jQuery用它自己生成的回调方法替换了它)。

2020-04-22