【问题标题】:Javascript events firing in undesired orderJavascript 事件以不希望的顺序触发
【发布时间】:2013-02-02 08:18:02
【问题描述】:

问题:

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 请求,一切都会好起来的。或者,你将如何解决这个问题?我尝试在 mouseout 中使用一个简单的标志,但无法正常工作。

【问题讨论】:

    标签: javascript ajax google-maps google-maps-api-3 google-places-api


    【解决方案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();
        }
    }
    

    【讨论】:

    • 是的,这对我有用。谢谢你,+1 - 如果没有其他不那么骇人听闻的解决方案,我会将其标记为正确;)你现在已经解决了我的问题。
    • 没问题。我不认为这太'hackish' BTW。即使有办法取消请求,我也会推迟它。如果用户将鼠标移出那么快,这仍然意味着该请求是不必要的。
    猜你喜欢
    • 2011-07-17
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多