0

我正在使用 Google Store Locator 并设置了一个成功的示例,它在同一页面上显示结果(标准设置与地图上方或左侧的搜索栏)。我正在使用 PHP/MySQL 示例并按照那里的说明进行操作:

https://developers.google.com/maps/articles/phpsqlsearch_v3

它工作正常,但现在我想把它分成两页。基本上第一页会有一个搜索表单,然后第二页会显示结果。我计划使用 GET 变量,然后将其作为 PHP 变量传递到现有的 Javascript 中。

我看了一下这篇文章,看到有人在做与我类似的事情,但没有指向他们的源代码的链接,而且看起来他们可能使用了旧版本的商店定位器,因为 JS 文件名是'不匹配,等等。这是一个好的开始,这与我一直在尝试使用的方法相同(此时未成功):

http://magnusfive.com/forums/2011/10/store-locator-plugin-place-a-statezip-code-form-on-another-page/

我在这里设置了我的示例:

http://miller-media.com/sites/newmaptest/results-test.php?zip_code=94546&radius=200

如果您查看原始 Javascript,您将看到在该页面上运行的所有功能(您也可以在该页面的源代码中看到它们)。我基本上需要更改当有人单击原始页面上的提交按钮时调用的函数。这次我需要在页面加载时运行这些功能,因为它在新页面上。在点击时运行的原始函数如下所示(顺便说一下,body 元素有一个 onload="load()" 作为属性,所以这就是一切开始的地方):

function load() {
  map = new google.maps.Map(document.getElementById("map"), {
    center: new google.maps.LatLng(40, -100),
    zoom: 4,
    mapTypeId: 'roadmap',
    mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU}
  });
  infoWindow = new google.maps.InfoWindow();

  locationSelect = document.getElementById("locationSelect");
  locationSelect.onchange = function() {
    var markerNum = locationSelect.options[locationSelect.selectedIndex].value;
    if (markerNum != "none"){
      google.maps.event.trigger(markers[markerNum], 'click');
    }
  };

  document.onload = searchLocations();
}

function searchLocations() {
 var address = document.getElementById("addressInput").value;
 var geocoder = new google.maps.Geocoder();
 geocoder.geocode({address: address}, function(results, status) {
   console.log('test');
   if (status == google.maps.GeocoderStatus.OK) {
    searchLocationsNear(results[0].geometry.location);
   } else {
     alert(address + ' not found');
   }
 });
}

function clearLocations() {
 infoWindow.close();
 for (var i = 0; i < markers.length; i++) {
   markers[i].setMap(null);
 }
 markers.length = 0;

 locationSelect.innerHTML = "";
 var option = document.createElement("option");
 option.value = "none";
 option.innerHTML = "See all results:";
 locationSelect.appendChild(option);
}

function searchLocationsNear(center) {
 clearLocations(); 

 var radius = document.getElementById('radiusSelect').value;
 var searchUrl = 'test.php?lat=' + center.lat() + '&lng=' + center.lng() + '&radius=' + radius;
 downloadUrl(searchUrl, function(data) {
   var xml = parseXml(data);
   var markerNodes = xml.documentElement.getElementsByTagName("marker");
   var bounds = new google.maps.LatLngBounds();
   for (var i = 0; i < markerNodes.length; i++) {
     var name = markerNodes[i].getAttribute("name");
     var address = markerNodes[i].getAttribute("address");
     var distance = parseFloat(markerNodes[i].getAttribute("distance"));
     var latlng = new google.maps.LatLng(
          parseFloat(markerNodes[i].getAttribute("lat")),
          parseFloat(markerNodes[i].getAttribute("lng")));

     createOption(name, distance, i);
     createMarker(latlng, name, address);
     bounds.extend(latlng);
   }
   map.fitBounds(bounds);
   locationSelect.style.visibility = "visible";
   locationSelect.onchange = function() {
     var markerNum = locationSelect.options[locationSelect.selectedIndex].value;
     google.maps.event.trigger(markers[markerNum], 'click');
   };
  });
}

显然,需要编辑的行是在有人提交表单时使用 Javascript 从页面本身提取值的行。我改变了这一行:

var address = document.getElementById("addressInput").value;

var address = <?php echo $zip_code; ?>;

从 GET 变量声明变量后。然后我改变了这一行:

var radius = document.getElementById('radiusSelect').value;

var radius = <?php echo $radius; ?>;

声明该变量后。当我查看源代码时,它看起来很好,因此它似乎可以正常工作。然后,我尝试通过在代码的不同部分打印到控制台来进行调试,看起来代码挂起的位置就在这一行:

geocoder.geocode({address: address}, function(results, status) {

它不运行该功能。当我在此行之前打印到控制台时,它很好,之后它不打印。所以由于某种原因,该功能不起作用。当我将“地理编码器”写到控制台之前,它会返回:

Yg {geocode: function}

我想一旦我弄清楚是什么导致它挂断,我就可以很好地调试。关于为什么 geocode() 函数无法运行的任何想法?谢谢!

4

1 回答 1

1

Firefox 中的 Firebug 在您的页面上给了我错误:

uncaught exception: InvalidValueError: in property address: 94546

看起来很奇怪,我知道,但谷歌地理编码器需要一个字符串作为你传递给它的“地址”参数,所以我想我会推荐类似的东西:

var address = '<php? echo $zip_code; ?>';

另外,只是想知道你为什么这样做:

  document.onload = searchLocations();

?? searchLocations 不返回值(因此它将 undefined 分配给 document.onload),并且您正在那里调用它,因此基本上与执行以下操作相同:

searchLocations();

另外,只是想知道当您可以使用 javascript 解析当前 url 时,您是否真的有必要通过 php 处理地址等。

于 2013-11-14T08:10:02.633 回答