执行跨域 JavaScript 永远不会命中 .done 中的代码



@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((中可用。在这里阅读手册!

相关内容

  • 没有找到相关文章

最新更新