2

OpenLayers に問題があり、レイヤーに追加されたクリック イベントの登録を解除しています。基本的に、私がする必要があるのはこれです:

ユーザーがマーカーをクリックすると、「編集」リンクを含むバブルが表示されます。ユーザーがそれをクリックすると、マップ上に新しいレイヤーが作成され、クリック イベントがマップに登録され、ユーザーがマップをクリックするのを待ちます。地図上のどこかをクリックすると、クリックした場所にマーカーが移動します。これはすべて完璧に機能します。

ただし、問題は、ユーザーがクリックしてマーカーを編集し、マップの外側のボタンをクリックしてアクションをキャンセルし、マーカーを移動しない場合、クリック イベントの登録解除が機能しないことです。地図をクリックすると、マーカーが移動します。

コードのサンプルを次に示します。

function move_marker(marker) {
    lmLayer = new OpenLayers.Layer.Markers("Landmark Creation",{displayInLayerSwitcher: false});
    map.addLayer(lmLayer);
    map.events.register("click", lmLayer, function(evt){
        var pixel = new OpenLayers.Pixel(evt.clientX,evt.clientY);
        position = map.getLonLatFromPixel(pixel);
        marker.lonlat = pixel;
        marker.moveTo(pixel);
        marker.draw();
        lmLayer.redraw();
        OpenLayers.Event.stop(evt);
    });
}
function cancel_move() {  // this function is triggered by a button outside of the map element
    lmLayer = map.getLayersByName('Landmark Creation');
    lmLayer[0].events.unregister("click");
    map.events.unregister("click");
    map.removeLayer(lmLayer[0]);
}

キャンセル関数でわかるように、レイヤー名でレイヤーを取得しています。これは、console.log によると、インデックス 0 で見つかります。役立つことを期待して、lmLayer に unregister を追加しましたが、これまでのところ、運がない。次に、マップ要素に unregister 呼び出しを追加し、最後にその新しいレイヤーを削除します。干渉しないようにするためです。

これに関するフィードバックをいただければ幸いです。気がおかしくなりそうだ。

ありがとう!

4

1 に答える 1

3

登録を解除するクリックイベントをOpenLayers 伝える必要があると思います:

var method = function() {
    // Do stuff...
}

map.events.register('click', map, method);
map.events.unregister('click', map, method);

OpenLayers.Events ソースによると、scopemethodがリスナー スタックに存在するかどうかを確認します。

unregister: function (type, obj, func) {
    if (obj == null)  {
        obj = this.object;
    }
    var listeners = this.listeners[type];
    if (listeners != null) {
        for (var i=0, len=listeners.length; i<len; i++) {
   HERE --> if (listeners[i].obj == obj && listeners[i].func == func) { <-- HERE
                listeners.splice(i, 1);
                break;
            }
        }
    }
},

私はそれがあなたのために働くことを願っています:)

于 2011-10-04T06:52:23.203 に答える