0

すでに数日間デバッグを試みているという深刻な問題があります。ユーザーに現在の緯度と経度を取得し、それらを変数に格納するスクリプトがあります。ただし、この関数の外部で// initマップゾーンでこれらの変数を使用しようとすると、マップが表示されません。変数を警告することにより、位置関数の外側で変数が「未定義」に設定されていることがわかります。これが私のコードです:

//main function here
function initialize() {
var lat;
var lon;

//check if user has geo feature
if(navigator.geolocation){

navigator.geolocation.getCurrentPosition(
//get position
function(position){
    lat = position.coords.latitude;
    lon = position.coords.longitude;
    },
// if there was an error
function(error){
    alert('ouch');
});
}
//case the users browser doesn't support geolocations
else {
alert("Your browser doesn't support geolocations, please consider downloading Google Chrome");
}
//init map
var myOptions = {
    center: new google.maps.LatLng(lat, lon),
    zoom: 16,
    mapTypeId: google.maps.MapTypeId.ROADMAP
    };
var map = new google.maps.Map(document.getElementById("map_canvas"),
        myOptions);

}

助けてくれてありがとう、アリエル

4

2 に答える 2

4

これは、関数内で変数を宣言するためです。変数は関数に対してプライベートになり、initialize関数内からのみアクセスできます。初期化関数の外部で変数にアクセスできるようにする必要がある場合は、変数宣言を関数の外に移動します。

var lat;
var lon;
function initialize() {
...

JavaScriptの変数スコープに関する このMDNの記事をご覧ください。

アップデート

コードをもう一度見てみると、問題は可変スコープではなく、インデントによって混乱していることがわかりました。私はGeolocationAPIに精通していませんが、問題はnavigator.geolocation.getCurrentPosition()、ユーザーがWebサイトにデバイスの位置を取得することを許可するのを待つ必要があるため、非同期である可能性があると考えています。そのためmyOptions、実際の位置が取得される前に割り当てられます。したがって、割り当てられたときにlatlngはまだ定義されていませんmyOptions

代わりにこれを試してください:

//main function here
function initialize() {
var lat, lon, map, myOptions;

//check if user has geo feature
if(navigator.geolocation){

navigator.geolocation.getCurrentPosition(
//get position
function(position){
    lat = position.coords.latitude;
    lon = position.coords.longitude;

    //init map
    myOptions = {
       center: new google.maps.LatLng(lat, lon),
       zoom: 16,
       mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    map = new google.maps.Map(document.getElementById("map_canvas"),
        myOptions);
},
// if there was an error
function(error){
    alert('ouch');
});
}
//case the users browser doesn't support geolocations
else {
alert("Your browser doesn't support geolocations, please consider downloading Google Chrome");
}
}
于 2012-03-09T17:05:40.310 に答える
0

他の答えの修正の詳細。スコープの問題は関係ありません。lat元のコードで定義されてlonおり、質問の作成者が使用しているコンテキストの範囲内にありますalert

これを証明する実行可能な例を次に示します。

function getPos( f ) {
    var position = new Object();
    position.coords = new Object();
    position.coords.latitude = 5;
    position.coords.longitude = 10;
    f( position );          
}


function initialize() {
    var lat;
    var lon;
    getPos(

        function(position){
            lat = position.coords.latitude;
            lon = position.coords.longitude;
            }

            );

       alert( lat + " " + lon );

}


initialize(); //expected 5 & 10

とにかく、これは純粋なJSの問題ではないようです。これは、使用しているGoogleAPIの問題のようです。このAPIについて、または間違って呼び出しているかどうかについての知識がないため、この質問にはそのようなタグを付ける必要があります。

于 2012-03-09T17:38:50.510 に答える