2011-11-17 10 views
1

我创建了一个PHP页面,利用谷歌的JavaScript API调用的跨域AJAX的时候。我正在尝试使用Ajax动态地填充标记的信息窗口,但在xdr.open行上获得权限被拒绝的错误。我检查了与类似错误有关的其他帖子,并尝试了不同的更改,但仍然出现相同的错误。权限被拒绝的错误使用XDomainRequest

<!DOCTYPE html> 
<html> 
<head> 
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script> 

<meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> 
<style type="text/css"> 
html { height: 100% } 
body { height: 100%; margin: 0; padding: 0 } 
#map_canvas { height: 100% } 
</style> 

<script type=text/javascript> 
var marker; 
var map; 
var xdr; 

function loader() 
{ 
     alert("XDR onload"); 
     alert("Got: " + xdr.responseText); 
} 

function Info(pmarker) 
{ 
    google.maps.event.addListener(pmarker, 'mouseover', function() 
    { 
    if (window.XDomainRequest) 
    { 
     xdr = new XDomainRequest(); 
     if(xdr) 
     { 
      document.write('1'); 

      xdr.open("GET", "http://localhost/GMap/GroovyCaller.php?Node=Host1"); 
      xdr.send(); 
      document.write('2'); 
      xdr.onload = loader; 
     } 

     else 
     { 
      document.write('3'); 
      alert('Failed to create'); 
     } 
    } 
    else 
    { 
      document.write('4'); 
      alert('XDR does not exist'); 
    } 
}); 
} 
function createMarker() { 

    var myLatlng = new google.maps.LatLng(-34.397, 150.644); 
    var marker = new google.maps.Marker({ 
     position: myLatlng, 
     map: map, 
     title:"Hello World!" 
     }); 
     Info(marker); 
} 
function initialize() 
{ 
    var latlng = new google.maps.LatLng(-34.397, 150.644); 
    var myOptions = 
    { 
     zoom: 8, 
     center: latlng, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 
    map = new google.maps.Map(document.getElementById("map_canvas"), 
    myOptions); 


    createMarker(); 

} 


</script> 
</head> 
<body onload="initialize()"> 
<div id="map_canvas" style="width:100%; height:100%"></div> 
</body> 
</html> 
+0

此错误无关,与谷歌地图API。据我所知,您只需调用一个本地PHP文件即可。当您在浏览器中打开“http://localhost/GMap/GroovyCaller.php?Node = Host1”时会发生什么? – ThinkingStiff

+0

嗨,谢谢你的回应......如果我直接调用GroovyCaller,我会得到所需的输出。这个问题在我引入了Ajax代码xdomainrequest后开始了。 – A11

+0

我添加了行 header('Access-Control-Allow-Origin:*'); 在php页面的开始处。但是,错误仍然存​​在。 我试图寻找更多的选项来解决这个问题,但什么都没发现。 任何进一步的帮助将不胜感激。 谢谢, 阿什温 – A11

回答

1

GroovyCaller.php返回的HTTP头Access-Control-Allow-Origin?来自http://msdn.microsoft.com/en-us/library/cc288060(v=vs.85).aspx

跨域请求需要文档和服务器之间的双方同意。 [...]如果服务器以*或访问请求文档的确切URL的Access-Control-Allow-Origin标头作为响应,它将仅完成连接。

您的服务器必须知道您的客户端接受跨域连接。您可以从Access-Control-Allow-Origin: *开始工作,然后缩小范围。

2

我有一个类似的问题,我有一个本地域上运行的客户端代码(例如www.domain.local)试图联系服务器localhost。即使当我将Access-Control-Allow-Origin: *添加到服务器响应标头时,我仍然遇到Access Denied。

原来XDomainRequest不喜欢尝试从另一个域访问本地主机。请参阅http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx的第6点。

我的解决方案是创建一个指向用我的hosts文件到本地主机,然后在新的域名指向XDR代替其他假域名。