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化されたコードです。

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」が表示されます。

いくつかのテスト後の2回目の更新

わかった。オペラでの位置共有を拒否すると、それが機能することがわかりました(デフォルトでは、ユーザーが自分のジオロケーションをWebサイトと共有してくれるかどうかさえ尋ねないため、クロムで機能します)

ジオロケーションのコード:

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は、デフォルトでクロムで正常に機能し、ジオロケーションへのアクセスを拒否した場合は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によって示唆されているように]-それはアラートがまったくないことを意味します-エラー関数の場合私はaswer4を取得し、したがって私は生成されたものを見ることができますHTML。

成功関数の場合、空の(子が追加されていない)#typesがあります。

成功関数がNOTSUCCESSになる原因がわかりません(:))

4

1 に答える 1

0

わかりました、それで私はそれを理解しました-それはかなり単純でしたが...

取得するジオロケーションデータは住所であるため、境界は非常に小さいため、逆ジオコーディング(results [6] .formatted_address)を使用して都市を抽出してから、その逆ジオコーディングをジオコーディングする必要があります(ジオコーディング->リバース->再度ジオコード)そしてそれは動作します!

したがって、問題はジオコーディングにありました(住所の境界が都市全体ではないとは考えていませんでした(そもそも明らかだったはずですが、そうではありませんでした)。

HTML5ジオコーディングは都市に関する情報を持っている可能性があります(LANとLNGだけでなく、Firefoxには何かがありますが、それはFirefoxだけであり、HTML5全体ではありません)が、それが良いかどうかはわかりません(私の個人的な知識の欠如この特定の分野の瞬間)

したがって、誰かが似たようなものに到達した場合->境界を確認してください;)

コメントとご意見ありがとうございます。

于 2012-12-01T18:13:31.423 に答える