@People 对这个问题投反对票:它有什么问题?我没有提供哪些信息?
我正在尝试通过 javascript 从域 A 到域 X 进行跨域服务调用,但不知何故,从未命中console.log('OK');
行。console.log('1');
线被击中。
如何确保行console.log('OK');
已执行?
www.domainA.com/test.aspx
<script type="text/javascript">
(function () {
var ttScript = document.createElement('script'); ttScript.async = true;
ttScript.src = '//www.domainX.com/js/test.js?v=1';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ttScript);
})();
</script>
www.domainX.com/js/test.js
(function () {
console.log('1');
$.ajax({
url: "//www.domainX.com/iplookup.php",
data: null,
type: 'GET',
async: false,
crossDomain: true,
dataType: 'jsonp'
}).done(function (data) {
console.log('OK');
});
})();
我尝试了jsonp
,并json
dataType
.但是当将其设置为 json
或将crossDomain
设置为 false
时,我得到: XMLHttpRequest cannot load http://www.domainX.nl/iplookup.php?callback=jQuery1102023322901595383883_1419031985295&_=1419031985296. Request header field X-Requested-With is not allowed by Access-Control-Allow-Headers.
www.domainX.com/iplookup.php
我尝试过有和没有Access-Control-Allow-Origin
<?php
header('content-type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
$data = json_encode($_SERVER['REMOTE_ADDR']);
echo "jsonp_callback($data);";
//print json_encode($_SERVER['REMOTE_ADDR']);
?>
使用上述配置,我的Chrome控制台中没有收到任何错误。在网络下,我看到在请求页面www.domainA.com/test.aspx
时成功加载了测试.js
我在"响应"选项卡下的"网络"选项卡下进行了检查,我看到正在调用//www.domainX.com/iplookup.php",它返回我期望的值,在本例中为 IP 地址。
我还能做什么?
使用 jsonp 时,您通常会请求这样的文件:
jsonp_callback(yourDataHere);
并且此文件包含在您的文档中,使值在调用函数时可访问。所以你的 php 文件必须回显这样的东西:
<?php
$data = json_encode($_SERVER['REMOTE_ADDR']);
echo $_GET['jsonp_callback']."($data);";
?>
请注意,您必须将 jsonp 函数添加到 $.ajax 中:
$.ajax({
url: "//www.domainX.com/iplookup.php",
async: false,
jsonp: 'jsonp_callback',
dataType: 'jsonp'
}).done(function(data){
console.log(data);
});
顺便说一句:你为什么要同步通话?
编辑:我写的有点废话。我更新了我的答案。您请求的文件只是以您的数据作为参数调用函数。然后,回调是函数本身。Jquery通常应该为你处理这个问题,并使数据在.done((中可用。在这里阅读手册!