3

我不知道如何在 SO 中搜索这个,所以我问了一个新问题。什么可能导致或我的代码的具体问题是什么:由 Javascript (createElement()appendChild) 生成的 HTML 没有在 Opera 和 Firefox 中显示,但它在 Chromium 中有效。

HTML 生成代码:

function typesOfPlaces(map, bounds) {
  var allowedTypes = [
    "amusement_park",
    "aquarium",
    "art_gallery",
    "cemetery",
    "church",
    "city_hall",
    "hindu_temple",
    "mosque",
    "museum",
    "night_club",
    "park",
    "place_of_worship",
    "rv_park",
    "spa",
    "synagogue",
    "travel_agency",
    "zoo"
  ];
  var typesToDisplay = new Array();
  var request =  {
    bounds: bounds,
    types: allowedTypes
  };
  var service = new google.maps.places.PlacesService(map);
  service.nearbySearch(request, function(results, status) {
    if(status == google.maps.places.PlacesServiceStatus.OK) {
      for(var i = 0; i < results.length; i++) {
        for(var j = 0; j < results[i].types.length; j++) {
          for(var k = 0; k < allowedTypes.length; k++) {
            if(results[i].types[j] == allowedTypes[k]) {
              var allowed = true;
              for(var x = 0; x < typesToDisplay.length; x++) {
                if(allowedTypes[k]==typesToDisplay[x]) {
                  allowed = false;
                }
              }
              if(allowed) {
                typesToDisplay.push(allowedTypes[k]);
              }
            }
          }
        }
      }
      var parent = document.getElementById("types");
      for(var i = 0; i < typesToDisplay.length; i++) {
        var typeBox = document.createElement("div");
        var checkBox = document.createElement("input");
        var checkID = randomString(10);
        var label = document.createElement("label");
        checkBox.setAttribute("type", "checkbox");
        checkBox.setAttribute("id", checkID);
        label.setAttribute("for", checkID);
        label.innerHTML = typesToDisplay[i];
        typeBox.appendChild(checkBox);
        typeBox.appendChild(label);
        parent.appendChild(typeBox);
      }
    }
  });
}//END OF Function

更新评论

randomString 只是用于生成随机字符串的 SO'ed 代码:

function randomString(L) {
  var s= '';
  var randomchar=function() {
    var n= Math.floor(Math.random()*62);
    if(n<10) return n; //1-10
    if(n<36) return String.fromCharCode(n+55); //A-Z
    return String.fromCharCode(n+61); //a-z
  }
  while(s.length< L) s+= randomchar();
  return s;
}

div #types 确实存在,它看起来像这样:

<html>
  <head>
    ...
    <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=MyKey&sensor=false&libraries=places&language=lt"></script>
  </head>
  <body>
    <div>
      <div>
        <div id="types"></div>
      </div>
    </div>
  </body>
</html>

通过查看标签<head>部分,您可以看到 google.maps.places.PlacesService 的导入,<script>您可以在其中看到“&libraries=places”。

一些测试后的第二次更新

好的。我发现如果我拒绝在 Opera 中共享位置,它可以工作(它可以在 chromium 中工作,因为默认情况下它甚至不会询问用户是否愿意与网站分享他的地理位置)

地理定位代码:

function initGeo()
{
    if (navigator.geolocation)
    {
        navigator.geolocation.getCurrentPosition(successFunction, errorFunction);
    }
    else
    {
        errorFunction();
    }
}

所以,不起作用的功能是successFunction(如果用户好心地分享他的地理位置,它将被启动)

function successFunction(position)
{
    var geocoder = new google.maps.Geocoder();
    var abstract_location;
    var latlng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
    geocoder.geocode({'latLng': latlng}, function(results, status) 
    {
        if (status == google.maps.GeocoderStatus.OK) 
        {
            abstract_location = new google.maps.LatLngBounds(
                results[0].geometry.viewport.getSouthWest(), 
                results[0].geometry.viewport.getNorthEast());
        }
        else
        {
            alert("NOT SUCCESS 1");
        }
        showGMap(latlng, abstract_location);
    });
}

还有 errorFunction,如果您拒绝访问您的地理位置,默认情况下可以在 chromium 和 Opera 上成功运行:

function errorFunction(error)
{
    var geocoder = new google.maps.Geocoder();
    if(google.loader.ClientLocation)
    {
        var latlng = new google.maps.LatLng(google.loader.ClientLocation.latitude, google.loader.ClientLocation.longitude);
        geocoder.geocode({'latLng': latlng}, function(results, status) 
        {
            if (status == google.maps.GeocoderStatus.OK) 
            {
                var abstract_location = new google.maps.LatLngBounds(
                    results[0].geometry.viewport.getSouthWest(), 
                    results[0].geometry.viewport.getNorthEast());
            }
            else
            {
                alert("NOT SUCCESS 2");
            }
            showGMap(latlng, abstract_location);
        });
    }
    else
    {
        geocoder.geocode( {'address': 'Vilnius Region, Lithuania'}, function(results, status) 
        {
            if (status == google.maps.GeocoderStatus.OK) 
            {
                var latlng = results[0].geometry.location;
                var abstract_location = new google.maps.LatLngBounds(
                    results[0].geometry.viewport.getSouthWest(), 
                    results[0].geometry.viewport.getNorthEast());
                showGMap(latlng, abstract_location);
            }
            else
            {
                alert("NOT SUCCESS 3");
            }
        });
    }
}

也没有 Chromium 和 Opera 没有给我任何错误,也没有 javascript 异常,也没有一般情况。

所以问题出在成功功能上。因为它甚至没有给我 alert(typesToDisplay.length) [正如 Stuart 在评论中建议的那样] - 这意味着根本没有警报 - 如果出现错误函数,我会得到 aswer 4,因此我可以看到我生成的HTML。

在成功功能的情况下,只有空的(没有任何附加的孩子)#types。

我看不出是什么导致成功函数为 NOTSUCCESS (:))

4

1 回答 1

0

好的,所以我想通了-虽然很简单...

您获得的地理位置数据是一个地址,因此范围非常小,您必须使用反向地理编码(结果 [6].formatted_address)提取城市,然后对该反向地理编码进行地理编码(通过地理编码 - > 反向 - > 再次混淆地理编码)然后它就可以工作了!

所以问题出在地理编码上(没想到地址范围不是整个城市(一开始就应该很明显,但事实并非如此)。

HTML5 地理编码可能有关于城市的信息(不仅是 lan 和 lng,firefox 有一些东西,但那只是 firefox,而不是整个 HTML5),但我不知道它是否好用(缺乏我个人的知识在这个特定领域的时刻)

因此,如果有人确实遇到类似的事情->检查界限;)

感谢您的评论和您的观点。

于 2012-12-01T18:13:31.423 回答