0

OK、これは主要な編集です。同様の単純なコードの例を示すことでそこに到達できると思いましたが、役に立ちません。

Googleマップを表示し、情報ウィンドウにマーカーを配置する機能があります。これはすべてうまくいきます。次に、マーカーのドロップを少し遅らせたいと思ったので、一度にドロップするのではなく、xx ミリ秒間一時停止してから次のマーカーをドロップしました。私はこれを機能させることができません。私の混乱の主な原因は、JavaScript で for ループが機能する方法について混乱しているように見えることです。

私は setTimeout を使用していましたが、これを機能させることができませんでした。私の混乱は setTimeout とは何の関係もないことに気付きました。私は自分のコードを書いてくれる人を探しているわけではありません。ここで何が欠けているのか理解できません。

forループでこの動作が期待されます...

何かをするために別のことをする次に別のことをする

私が見ていることから、この動作が発生しているように見えます...

何かをするために何か他のことをする(そしてコードを介したループごとにそれをする)次に別のことをする

コードは次のとおりです。

    function delaydropmarkers()
    {
        alert("delaydropmarkers");
    }

    function marker(location) 
    {

        geocoder = new google.maps.Geocoder();
        var latlng = new google.maps.LatLng(37.5, -98.35);
        var mapOptions = 
        {
            zoom: 5,
            center: latlng,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        }

        map = new google.maps.Map(document.getElementById('googleMap'), mapOptions);

        var infowindow = new google.maps.InfoWindow(), marker, i;

        for (i = 0; i < location.length; i++) 
        {

            marker = new google.maps.Marker(
            {
                position: new google.maps.LatLng(location[i][1], location[i][2]),
                animation: google.maps.Animation.DROP,
                map: map
            }
            );

            delaydropmarkers();

            google.maps.event.addListener(marker, 'click', (function (marker, i) 
            {
                return function () 
                {
                    infowindow.setContent(location[i][0]);
                    infowindow.open(map, marker);
                }
            }
            )(marker, i));

        }

    }

そこで、マーカーを作成するマーカー関数を呼び出し、delaydropmarkers 関数に移動して (現在はアラートが含まれているだけです)、リスナーを追加します。私はすべてのマーカーを一度に動かします。前もってお詫び申し上げます。これは私がすでにばかげていると感じていることですが、問題がわかりません。

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

4

1 に答える 1

1

最初の間違いは、W3Schools の使用です。http://ryanblunden.com/please-dont-use-w3schools

必要なときに再帰的に呼び出すことができる独自の関数にします。

function showCars(cars, index) {
    index = index || 0;
    if (index < cars.length) {
        console.log(cars[index]);
        setTimeout(function () {
            showCars(cars, ++index);
        }, 2000);
    }
}

var my_cars = ["BMW", "Volvo", "Saab", "Ford"];
showCars(my_cars);

http://jsfiddle.net/UcWTH/4/

私が使用console.logdocument.writeていて、あなたのコードにあるようではない理由は、後でではなく、ページがレンダリングされているときにのみdocument.write使用する必要があるためです。幸いなことに、それはあなたの場合に当てはまります。残念ながら、それを否定します。setTimeout

を使用setTimeoutすると、最初のパラメーターに指定したコードがX ミリ秒後に非同期で実行されます。その時までに、適切に使用していればsetTimeout、ページがレンダリングされ、ドキュメントが上書きされます。私が言ったように、setTimeout非同期であるため、実際にはJavascript処理を停止/一時停止/停止しません。それがあなたの混乱の元だと思います。2 秒間「遅延」させたいのですが、本当にそれをしたい場合は、ブラウザを 2 秒間フリーズさせます。setTimeoutブラウザをフリーズせずに実行できます。しかし、あなたが考える通常の方法でそれを使用することはできません...そして、それが上記の私のコードが通常のforループではない理由です.

于 2013-01-24T21:35:52.190 に答える