使用.ajax(JQuery)跨域问题到我拥有的域 - 简单的PHP页面

时间:2012-01-07 20:59:25

标签: jquery ajax cordova xmlhttprequest

所以我知道这是一个常见的问题,很多人都在谈论它,但觉得我的情况很独特,可能不像其他人那样参与其中。

我有一个主机网站并尝试使用JQ和PhoneGap构建iPhone应用程序。

我希望人们能够从应用程序将他们的分数传递到我的主域,但是我感到害怕: “Access-Control-Allow-Origin不允许使用原点null。” 当我试着这样称呼时:

$.ajax({
        type: "POST",
        url: 'http://www.homesite.com/thephppage.php',
        data: {
            'guid': '12333-54',
            'score': 52,
            'initials': 'tod'
        },
        success: function (data) {
            try {

                }
                else {

                }
            }
            catch (err) {
                alert(err);
            }
        },
        error: function (xhr) {
            alert(xhr.responseText);
        }
    });

由于这是对我所拥有的域名的呼唤,我能做些什么来纠正这个问题?

感谢。 Ť

4 个答案:

答案 0 :(得分:5)

您拥有这两个域的事实并未改变ajax请求不能跨域的事实。

  

由于这是在呼唤我所拥有的域名,我能做些什么来纠正这个问题吗?

请查看设置CORS,这应该允许您进行这些跨域请求。另外,根据jQuery docs,jQuery应该支持CORS请求 - 主要是

  

xhrFields (已添加1.5.1)Map要设置fieldName-fieldValue对的映射   在本机XHR对象上。例如,您可以使用它进行设置   如果需要,withCredentials为true,用于跨域请求。

     

$ .ajax({url:a_cross_domain_url,xhrFields:{         withCredentials:true}});在jQuery 1.5中,withCredentials属性未传播到本机XHR,因此   要求它的CORS请求将忽略此标志。出于这个原因,我们   如果您需要使用它,建议使用jQuery 1.5.1+。


  

目前,由于Firefox中存在一个bug .getAllResponseHeaders()   尽管.getResponseHeader('Content-Type')返回空字符串   返回非空字符串,自动解码JSON CORS响应   在Firefox中使用jQuery不受支持。

答案 1 :(得分:3)

您必须将crossDomain更改为true

检查jquery ajax api和选项 http://jqapi.com/#p=jQuery.ajax

答案 2 :(得分:2)

为避免从应用中调用其他域名,您可以在主机网站上创建一个页面,将分数注册转发到您的主域。然后,您可以在主机网站上调用此页面。

您可以使用PHP使用HttpRequest::send

转发数据

例如(不包括用户身份验证):

$url = 'http://mydomain.com/score.php';
$r = new HttpRequest($url, HttpRequest::METH_GET);
$r->addQueryData(array('initials' => $initials, 'score' => $score));

try {
    $json = $r->send()->getBody();
    // output the response to forward it to the app
    echo $json;
} catch (HttpException $ex) {
    // handle error
}

答案 3 :(得分:0)

WORKING !!! OH GLORY !!! (有点):这就是我做的......

我没有使用.ajax,而是采用了JSONP路线(有点),并动态地添加了一个标签:

var head = document.getElementsByTagName('head')[0];
  script = document.createElement('script');
  script.type = 'text/javascript';
  script.src = 'http://thesite.co/thepage.php?var1=123&var2=432&var3='ttt';
  head.appendChild(script);

我甚至不必给它一个CALLBACK方法因为(因为我拥有目标站点并且知道它的到来)在我的PHP端,我用这样的methodName包装返回:

$ encoded = json_encode($ json); echo“testMethod(”。$ encoded。“)”; 除了我的DARN iPhone和iPad模拟器外,这种方法非常出色! (天哪,我需要购买真正的设备...)所以我仍然不知道这是否适用于实际设备,但它现在可以在Chrome和Safari中使用...让我希望我能弄明白如何让它在手机上运行!

感谢大家的帮助!

==========第二个更好的移动解决方案======================这比JSONP - 动态脚本解决方案更好。 ..

在你的Phonegap和JQ电话下你的头脑中插入这个标签。

<script type="text/javascript">
        $(document).bind("mobileinit", function () {
           $.mobile.allowCrossDomainPages = true;
        });
    </script>

然后在XCODE Resources文件夹的Phonegap.plist文件中,将域添加到外部域...即。 phonegap.com。 (不要使用http或www)。