问题描述:

I'm currently working with the Google Maps V3 API, and I'm animating a marker to travel a predetermined route. The route information is stored in two separate arrays, lat for the latitude coordinates, and lon for the longitude coordinates. I'm experiencing a logic issue when trying to build buttons to pause and resume the marker's movement. Here is the code:

 var paused = 0; //paused state

var interval = 1000; //interval for animation (ms)

function clickPause() {

paused = 1;

}

function clickPlay() {

paused = 0;

}

function moveToStep(yourmarker,yourroute,c) {

var LatLon;

var time;

var hours;

var minutes;

var seconds;

var finalTime;

var stopTime;

if (yourroute.length > c) {

LatLon = new google.maps.LatLng(lat[c],lon[c]);

yourmarker.setPosition(LatLon);

document.getElementById("currlat").innerHTML = lat[c];

document.getElementById("currlon").innerHTML = lon[c];

document.getElementById("currtime").innerHTML = c+1;

hours = 7+Math.floor((c+1)/3600);

minutes = Math.floor((c+1)/60);

seconds = (c+1)-minutes*60;

if(minutes == 60) {

minutes = 0;

}

finalTime = str_pad_left(hours,'0',2)+':'+str_pad_left(minutes,'0',2)+':'+str_pad_left(seconds,'0',2);

document.getElementById("finaltime").innerHTML = finalTime;

if(paused == 1) {

stopTime = c+1;

window.setInterval(function(){

if(paused == 0) {

moveToStep(yourmarker,yourroute,stopTime);

}

},interval);

}

else {

window.setTimeout(function(){

moveToStep(yourmarker,yourroute,c+1);

},interval);

}

}

}

function str_pad_left(string,pad,length) {

return (new Array(length+1).join(pad)+string).slice(-length);

}

function jumpTo(value) {

alert(value);

moveToStep(marker,lat,100);

}

function initialize() {

var mapOptions = {

center: new google.maps.LatLng(31.26,121.45),

zoom: 12,

mapTypeId: google.maps.MapTypeId.ROADMAP

};

var map = new google.maps.Map(document.getElementById("map_canvas"),

mapOptions);

var marker = new google.maps.Marker({map: map,});

var newLatLng = new google.maps.LatLng(lat[0],lon[0]);

marker.setPosition(newLatLng);

moveToStep(marker,lat,0);

}

Right now, I have two buttons, one which calls the clickPause() function, and one that calls the clickPlay() function. The pausing works fine, but when I try to resume, the marker exhibits some very strange behavior.

Essentially, it seems that the marker is jumping back to the position where it was last paused, then quickly jumping forward again, and doing this every time the marker position updates (which is once per 1000 milliseconds, or once per second, as set by the interval variable.)

Has anyone seen this type of behavior before? I don't understand what is wrong with my logic in these lines, which I'm sure is the culprit:

 if(paused == 1) {

stopTime = c+1;

window.setInterval(function(){

if(paused == 0) {

moveToStep(yourmarker,yourroute,stopTime);

}

},interval);

}

else {

window.setTimeout(function(){

moveToStep(yourmarker,yourroute,c+1);

},interval);

}

All I'm doing is checking if the simulation is paused, and if it is, check if it has been unpaused, then once it is, resume the movement of the marker. Once I have pressed the resume button, the code should go straight to

 window.setTimeout(function(){

moveToStep(yourmarker,yourroute,c+1);

},interval);

because the value of paused has been returned to 1.

Can anyone help me out?

网友答案:

You need to clear the interval in order to stop it from firing after you resumed. This means that you need to store the identifier returned by setInterval and pass it to clearInterval when needed.

var pauseInterval; // interval identifier (outside the moveToStep function)

if (paused == 1) {
    stopTime = c+1;
    pauseInterval = setInterval(function() {
        if(paused == 0) {
            moveToStep(yourmarker, yourroute, stopTime);
        }
    }, interval);
} else {
    clearInterval(pauseInterval);
    setTimeout(function() {
        moveToStep(yourmarker, yourroute, c+1);
    }, interval);
}
相关阅读:
Top