1

私の JavaScript (下記) は非常に乱雑で、解決できなかったエラーが含まれています。エラーは showPosition 関数内にあります (関数内に関数がありますが、これはお勧めできません)。
JavaScript を試し始めたばかりなので、簡単な質問でしたら申し訳ありません。また、私が立ち往生している領域を強調する JavaScript の jsFiddle も提供しました ( http://jsfiddle.net/dnUTx/ )。

jsFiddle では、25 行目に「関数宣言をブロックに配置しないでください」というエラーが表示されます。

どんな助けでも大歓迎です。

// JavaScript Document

var x = document.getElementById("info");

function getLocation() {
    if (navigator.geolocation) {
        navigator.geolocation.watchPosition(showPosition, showError, clearWatch, {
            enableHighAccuracy: true,
            maximumAge: 30000,
            timeout: 30000
        });
    } else {
        x.innerHTML = "Your browser does not support the geolocation () API.";
    }
}
var flightPathCoordinates = [];
var lat1, lng1, first_check = false;

function showPosition(position) {
    if (!first_check) {
        lat1 = position.coords.latitude;
        lng1 = position.coords.longitude;
        first_check = true;
    } else {
        function distanceFrom(points) {
            var lat1 = points.lat1;
            var radianLat1 = lat1 * (Math.PI / 180);
            var lng1 = points.lng1;
            var radianLng1 = lng1 * (Math.PI / 180);
            var lat2 = points.lat2;
            var radianLat2 = lat2 * (Math.PI / 180);
            var lng2 = points.lng2;
            var radianLng2 = lng2 * (Math.PI / 180);
            var earth_radius = 3959; // or 6371 for kilometers
            var diffLat = (radianLat1 - radianLat2);
            var diffLng = (radianLng1 - radianLng2);
            var sinLat = Math.sin(diffLat / 2);
            var sinLng = Math.sin(diffLng / 2);
            var a = Math.pow(sinLat, 2.0) + Math.cos(radianLat1) * Math.cos(radianLat2) * Math.pow(sinLng, 2.0);
            var distance = earth_radius * 2 * Math.asin(Math.min(1, Math.sqrt(a)));
            return distance.toFixed(3);
        }
        var distance = distanceFrom({
            "lat1": lat1,
            "lng1": lng1,
            "lat2": position.coords.latitude,
            "lng2": position.coords.longitude
        });
    }
    x.innerHTML = "Latitude: " + position.coords.latitude +
        "<br>Longitude: " + position.coords.longitude +
        "<br>Accuracy: " + position.coords.accuracy +
        "<br>Altitude: " + position.coords.altitude +
        "<br>Altitude Accuracy: " + position.coords.altitudeAccuracy +
        "<br>Heading: " + position.coords.heading +
        "<br>Speed (km): " + position.coords.speed * 3.6 +
        "<br>Timestamp: " + new Date(position.timestamp).toLocaleString() +
        "<br>Distance Travelled (km): " + distance +
        "<br>Stopwatch: " + min + ":" + sec + ":" + msec;

    lat = position.coords.latitude;
    lon = position.coords.longitude;
    latlon = new google.maps.LatLng(lat, lon);
    mapholder = document.getElementById('mapholder');

    var myOptions = {
        center: latlon,
        zoom: 16,
        mapTypeId: google.maps.MapTypeId.ROADMAP,
        mapTypeControl: true,
        navigationControlOptions: {
            style: google.maps.NavigationControlStyle.SMALL
        }
    };
    var map = new google.maps.Map(document.getElementById("mapholder"), myOptions);

    //Bicycle Store
    var request = {
        location: (latlon),
        radius: '1000',
        types: ['bicycle_store']
    };
    infowindow = new google.maps.InfoWindow();
    var service = new google.maps.places.PlacesService(map);
    service.nearbySearch(request, callback);

    function callback(results, status) {
        if (status == google.maps.places.PlacesServiceStatus.OK) {
            for (var i = 0; i < results.length; i++) {
                var place = results[i];
                createMarker(results[i]);
            }
        }
    }

    function createMarker(place) {
        var placeLoc = place.geometry.location;

        //Custom Marker 1
        var image1 = '../images/logo_marker1.png';
        var marker1 = new google.maps.Marker({
            position: place.geometry.location,
            map: map,
            icon: image1,
            title: "Bicycle Store"
        });
        google.maps.event.addListener(marker1, 'click', function () {
            infowindow.setContent(place.name);
            infowindow.open(map, this);
        });
    }

    //Bicycle Layer
    var bikeLayer = new google.maps.BicyclingLayer();
    bikeLayer.setMap(map);

    //Custom Marker 2
    var image2 = '../images/logo_marker2.png';
    var marker2 = new google.maps.Marker({
        position: latlon,
        map: map,
        icon: image2,
        title: "You are here!"
    });

    //Panoramio Layer
    var panoramioLayer = new google.maps.panoramio.PanoramioLayer();

    panoramioLayer.setUserId("7467601");
    panoramioLayer.setMap(map);
    google.maps.event.addListener(panoramioLayer, 'click', function (event) {
        var attribution = document.createTextNode(event.featureDetails.title + ": " + event.featureDetails.author);
        var br = document.createElement("br");
        var link = document.createElement("a");
        link.setAttribute("href", event.featureDetails.url);
        link.appendChild(attribution);
    });

    //Polyline Layer
    flightPathCoordinates.push(new google.maps.LatLng(position.coords.latitude, position.coords.longitude));
    var flightPath = new google.maps.Polyline({
        path: flightPathCoordinates,
        strokeColor: "#FF0000",
        strokeOpacity: 1.0,
        strokeWeight: 2
    });
    flightPath.setMap(map);
}

function showError(error) {
    switch (error.code) {
        case error.PERMISSION_DENIED:
            x.innerHTML = "User denied the request for Geolocation.";
            break;
        case error.POSITION_UNAVAILABLE:
            x.innerHTML = "Location information is unavailable.";
            break;
        case error.TIMEOUT:
            x.innerHTML = "The request to get user location timed out.";
            break;
        case error.UNKNOWN_ERROR:
            x.innerHTML = "An unknown error occurred.";
            break;
    }
}

function clearWatch() {
    navigator.geolocation.clearWatch(showPosition);
}
4

1 に答える 1

2

まあ、私にとって質問は完全に明確であり、新しいメンバーに+1のjsfiddleも提供します。

あなたの問題は2倍です:

ローカル変数distanceを使用して文字列を作成しますx.innerHTML。ただし、ifステートメントの句でdistanceのみ定義されます(正確には割り当てられます) 。else

次に、ブロック内で「関数宣言」を使用していますが{}、これは構文的に違法です! これは、ブロックにはステートメントのみを含めることができ、FunctionDeclaration である SourceElements を含めることができないためです。
そのため、if/else/while/for ブロック内では「関数式」を使用する必要があります。
例:var identifier=function(//args){//code};
これが、JSFiddle の JSHint が表示するエラー メッセージの理由です。

私の変更を確認するには、このフィドルの更新を参照してください (jshint を検証するだけですが、これはコードの一部にすぎないため、これ以上試す方法はありません)。

関数の最初の -clause のvar distance=0前にローカル変数として追加し、 -clause内に変更しました。ifshowPositionfunction declarationfunction expressionelse

幸運を!

于 2013-03-27T16:33:55.140 に答える