我已经查看了我可以在这里找到的所有答案,但无法解决这个问题。我很确定我没有错过任何明显的东西。
我正在尝试加载基于纬度的地图标记。问题是当我尝试将 AJAX 响应作为 responseXML 返回时,它始终为空,如果我使用 responseText 它工作正常,但显然下一步不起作用。
这是生成 XML 的 PHP:
<?php
header('Content-type: text/xml');
?>
<?xml version="1.0" encoding="ISO-8859-1"?>
<properties>
<![CDATA[
<?php
if ($body != null):
foreach ($body as $property): ?>
<property>
<lat><?php echo $property -> lat; ?></lat>
<long><?php echo $property -> long; ?></long>
<name><?php echo $property -> property_name; ?></name>
</property>
<?php endforeach;
endif; ?>
]]>
</properties>
我可以在 Fiddler 中看到请求成功
GET /letsgo/index.php/hotmaps/get_properties_ajax/22.270888501350186/22.288560098193066/114.13720860290528/114.19827713775635 HTTP/1.1
实体内容类型:text/xml
虽然当我在提琴手的 XML 视图中查看它时它似乎是空的,
这是原始响应
HTTP/1.1 200 OK
Date: Tue, 15 Jan 2013 11:04:27 GMT
Server: Apache/2.4.2 (Win32) PHP/5.4.4
X-Powered-By: PHP/5.4.4
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 310
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<properties>
<![CDATA[
<property>
<lat>22.2776</lat>
<long>114.173</long>
<name>Kaxo Tower test</name>
</property>
<property>
<lat>22.2803</lat>
<long>114.16</long>
<name>Kuno Tower</name>
</property>
]]>
</properties>
这是每次移动地图时调用的创建标记函数
// make the ajax request
function loadXMLDoc(downUrl){
var xmlhttp;
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else {// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
//var propertiesXml = xmlhttp.responseText; // WORKS FINE!!
var propertiesXml = xmlhttp.responseXML; // ALWAYS null
//alert(propertiesXml);
var propertiesRows = propertiesXml.getElementsByTagName("property");
for (var i = 0; i < propertiesRows.length; i++) {
var propertiesRow = propertiesRows[i];
var xmlLat = propertiesRow.getElementsByTagName("lat")[0];
var xmlLong = propertiesRow.getElementsByTagName("long")[0];
var propertyLatLong = new google.maps.LatLng(parseFloat(xmlLat.firstChild.data),parseFloat(xmlLat.firstChild.data));
// create each marker
createMarker(propertyLatLong);
}
}
}
xmlhttp.open("GET", downUrl, false); // false or true? makes no difference
xmlhttp.setRequestHeader("Content-type", "text/xml");
xmlhttp.send();
}
这是我用 null 提供 getElementsByTagName 的错误,Chrome 控制台说
未捕获的类型错误:无法调用 null 的方法“getElementsByTagName”
这是在我的本地 Apache 上运行的
有什么建议么?
/** 更新 - 工作代码 **/
<!DOCTYPE html>
<html>
<head>
<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" src="https://maps.googleapis.com/maps/api/js?key=APIKEYHERE&sensor=false">
</script>
<script type="text/javascript">
// initialise map
function initialize() {
// set starting latlong
var myLatlng = new google.maps.LatLng(22.2776, 114.173);
// set initial map options
var mapOptions = {
center: myLatlng,
zoom: 13,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
// create the map
var map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
// listen for changes in map bounds - after map has stopped moving!!
google.maps.event.addListener(map,'idle', function () {
loadByBounds(map);
});
}
// if the bounds have changed
function loadByBounds(map) {
var bounds = map.getBounds();
var swPoint = bounds.getSouthWest();
var nePoint = bounds.getNorthEast();
// specific co ordinates
var swLat = swPoint.lat();
var swLng = swPoint.lng();
var neLat = nePoint.lat();
var neLng = nePoint.lng();
var downUrl = "<?php echo site_url('hotmaps/get_properties_ajax'); ?>/"+swLat+"/"+neLat+"/"+swLng+"/"+neLng;
// load the
loadXMLDoc(downUrl, map);
// clear icons outside of bounding box
//....
}
// make the ajax request
function loadXMLDoc(downUrl, map){
var xmlhttp;
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else {// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
var propertiesXml = xmlhttp.responseText; // WORKS FINE!!
// remove whitespaces from start and end (.trim() doesnt work)
propertiesXml = propertiesXml.replace(/^\s+|\s+$/g,'');
// manually parse to XML DOM object
var parser = new DOMParser();
var xmlDoc;
try {
xmlDoc = parser.parseFromString (propertiesXml, "text/xml");
} catch (e) {
alert ("XML parsing error.");
return false;
};
//console.log(xmlDoc);
// get each property
var propertiesRows = xmlDoc.getElementsByTagName("property");
//alert(console.log(propertiesRows));
for (var i = 0; i < propertiesRows.length; i++) {
var propertiesRow = propertiesRows[i];
var xmlLat = propertiesRow.getElementsByTagName("lat")[0];
var xmlLong = propertiesRow.getElementsByTagName("long")[0];
var propertyLatLong = new google.maps.LatLng(parseFloat(xmlLat.firstChild.data),parseFloat(xmlLong.firstChild.data));
// create each marker
createMarker(propertyLatLong, map);
}
}
}
xmlhttp.open("GET", downUrl, false);
xmlhttp.setRequestHeader("Content-type", "text/xml");
xmlhttp.send();
}
// create new markers
function createMarker(propertyLatLong, map){
var dynamicMarker = new google.maps.Marker({
map:map,
draggable:false,
position: propertyLatLong
});
debugger;
}
</script>
</head>
<body onload="initialize()">
<div id="map_canvas" style="width:100%; height:100%"></div>
</body>
</html>