0

問題:

mouseoutイベントの発生が早すぎて、ユーザーがマーカー上でマウスをドラッグする速度が速すぎると、インフォボックスが開いたままになります。つまり...ユーザーがマーカーにすばやく出入りすると...mouseoverイベントが発生し、次にmouseoutイベントが発生します...しかし、placesServiceコールバックが実行されてib.open()呼び出されます。

コード:

map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions);

var request = {
    key: 'for_my_eyes_only',
    location: new google.maps.LatLng(some_lat, some_lng);,
    radius: '500',
    types: ["restaurant"]
};

var service = new google.maps.places.PlacesService(map);
service.search(request, placesCallback);

function placesCallback(results, status) {
    if (status == google.maps.places.PlacesServiceStatus.OK) {
        for (var i = 0; i < results.length; i++) {

            var place = results[i];
            var marker = new google.maps.Marker({
                map: map,
                position: place.geometry.location,
            });

            //Infobox settings
                var ib = new InfoBox({
                    //a bunch of irrelevant properties.
                });

            google.maps.event.addListener(marker, 'mouseover', markerMouseOverFactory(place, marker, ib));
            google.maps.event.addListener(marker, 'mouseout', markerMouseOutFactory(ib));
        }
    }
}

function markerMouseOverFactory(place, marker, ib){
    return function(){
        var detailService = new google.maps.places.PlacesService(map);
        detailService.getDetails({reference: place.reference}, function(details, status){
            if (status == google.maps.places.PlacesServiceStatus.OK) {
                ib.setContent(/*set some content using details*/);
                ib.open(map, marker);
            }
        });
    }

}

function markerMouseOutFactory(ib){
    return function(){
        ib.close();
    }
}

質問:

グーグルマップのAJAXリクエストを放棄する方法はありますか?mouseoutリスナーでAJAXリクエストを放棄できれば、すべてがうまくいくでしょう。または、これをどのように解決しますか?マウスアウトで単純なフラグを使用しようとしましたが、機能しませんでした。

4

1 に答える 1

1

私の知る限り、API でリクエストをキャンセルする方法はありません。しかし、私がすることは、mouseoverイベント内で実行されるコールバックを遅らせることです。そのため、ユーザーが指定された時間よりも長くマウスを保持した場合; それは彼/彼女が表示されることを望んでいることを意味しinfoboxます.

回避策:

var delayTimer, delay = 800; //less than 1 sec. delay
google.maps.event.addListener(marker, 'mouseover', function() {
    delayTimer = setTimeout(function() { 
        markerMouseOverFactory(place, marker, ib); 
    }, delay);
});

google.maps.event.addListener(marker, 'mouseout', markerMouseOutFactory(ib));
function markerMouseOutFactory(ib){
    clearTimeout(delayTimer); //clear timeout here
    return function(){
        ib.close();
    }
}
于 2013-02-18T03:03:10.927 に答える