0

2つのものが表示される画面があります。

  1. Google ストリート マップは、Openlayers を使用してレンダリングされます。
  2. サイド パネルがレンダリングされ、国とその年間人口増加のリストが表示されます。

以下のコードは、アイデアを説明しています。コードは HTML で記述されます。

<body>
 <div id="map" style="z-index:0;"></div>
 <div id="sidePanel" style="position:absolute;
                            top:0px;
                            left:0px;
                            width:30%;
                            height:100%;
                            z-index:1;
                            background-color:black">
 //content in this div will be filled dynamically through ajax call
 </div>
</body>

すべてが完璧に表示されました。しかし、マウスをクリックした#sidepanelままドラッグすると#map、マウスクリックを受け取り、画面上で「パン操作」が発生します。

クリックされたときに「#map」がマウスクリックを受け取ることは望ましくありません#sidepanel。また、#sidepanelそのdivにマウスを置いてダブルクリックすると、ダブルクリックが発生#mapし、ズーム操作が発生します。#mapと を分離したい#sidepanel

この問題は、Firefox および Chrome ブラウザーでのみ発生しています。IE は私の要件に対して正常に動作しています。いくつかのアイデアを提案してください。お待ち頂きまして、ありがとうございます。

これが私の完全なコードです

<html>
<head>
<title>Map</title>
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false&v=3.6"></script>
<script src="http://openlayers.org/api/OpenLayers.js"></script>
</head>
<body onload="RenderGoogleMap();">
<div id="Map_Screen" style="z-index: -1;"></div>
<div id="sidePanel" style="overflow:hidden;position:absolute;top:0px;left:0px;width:35%;height:100%;background-color:black;"></div>
</body>
</html>
<script type="text/javascript">
function RenderGoogleMap() {
        var options = {
            projection : "EPSG:900913",
            units : "m",
            maxResolution : 156543.0339,
            maxExtent : new OpenLayers.Bounds(-20037508.34, -20037508.34,20037508.34, 20037508.34),
            displayProjection : new OpenLayers.Projection("EPSG:4326")
        };
        map = new OpenLayers.Map('Map_Screen', options);
        var gmap = new OpenLayers.Layer.Google("GoogleMap", { 'sphericalMercator' : true, numZoomLevels : 18 });
        map.addLayers([ gmap ]);
            map.zoomTo(3);
        var control = map.addControl( new OpenLayers.Control.Navigation() );
        control.activate();
    }
</script>
4

2 に答える 2

1

sidePanel の位置を絶対位置に設定したため、sidepanel div がマップの上にある可能性がありますか? position:absolutesidePanel CSS コードから を削除してみてください。

アップデート:

問題は、マップの幅が 100% に設定されていて、サイドパネルがその上に重なっていたことでした。これを行う代わりに、サイドパネルの幅を 35% に保ち、右マージンを 2% 追加し、マップを 62% に設定しました。このようにして、サイドパネルとマップが重ならないようにするため、サイドパネルをクリックしても、マップはまったく影響を受けません。

コードを参照してください:

<html>
<head>
<title>India</title>
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false&v=3.6"></script>
<script src="http://openlayers.org/api/OpenLayers.js"></script>
<script type="text/javascript">
function RenderGoogleMap() {
        var options = {
            projection : "EPSG:900913",
            units : "m",
            maxResolution : 156543.0339,
            maxExtent : new OpenLayers.Bounds(-20037508.34, -20037508.34,20037508.34, 20037508.34),
            displayProjection : new OpenLayers.Projection("EPSG:4326")
        };
        map = new OpenLayers.Map('Map_Screen', options);
        var gmap = new OpenLayers.Layer.Google("GoogleMap", { 'sphericalMercator' : true, numZoomLevels : 18 });
        map.addLayers([ gmap ]);
        var control = map.addControl( new OpenLayers.Control.Navigation() );
        control.activate();
    }
</script>
</head>
<body onload="RenderGoogleMap();">
<div id="sidePanel" style="float:left;width:35%;margin-right:2%;height:100%;background-color:black;"></div>
<div id="Map_Screen" style="float:left;width:62%;"></div>
</body>
</html>

更新 2:

オーバーレイが必要で、サイド パネルでマップを操作したくない場合は、このコードを試してください。マップz-indexを -1 に、オーバーレイz-indexを 999 に設定します。

<html>
<head>
<title>Map</title>
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false&v=3.6"></script>
<script src="http://openlayers.org/api/OpenLayers.js"></script>
</head>
<body onload="RenderGoogleMap();">
<div id="Map_Screen" style="z-index: -1;"></div>
<div id="sidePanel" style="z-index:999;overflow:hidden;position:absolute;top:0px;left:0px;width:35%;height:100%;background-color:black;"></div>
</body>
</html>
<script type="text/javascript">
function RenderGoogleMap() {
        var options = {
            projection : "EPSG:900913",
            units : "m",
            maxResolution : 156543.0339,
            maxExtent : new OpenLayers.Bounds(-20037508.34, -20037508.34,20037508.34, 20037508.34),
            displayProjection : new OpenLayers.Projection("EPSG:4326")
        };
        map = new OpenLayers.Map('Map_Screen', options);
        var gmap = new OpenLayers.Layer.Google("GoogleMap", { 'sphericalMercator' : true, numZoomLevels : 18 });
        map.addLayers([ gmap ]);
            map.zoomTo(3);
        var control = map.addControl( new OpenLayers.Control.Navigation() );
        control.activate();
    }
</script>
于 2013-01-19T21:31:29.827 に答える
0

イベント ハンドラーが何らかの方法でイベントをインターセプトしない場合、Javascript イベントは通常、DOM 内の特定の順序で他の要素にバブルされます。通常、最初に最上位 (最高の z インデックスを持つ) 要素イベント ハンドラーが呼び出され、次にバブリングを妨げるものがない場合は次のイベント ハンドラーが呼び出されることを意味します。

バブリングを停止するイベント ハンドラーをアタッチでき#sidePanelます。これはブラウザーごとに異なる方法で行われます。jQueryを使用している場合は、簡単に実行できます

$("#sidePanel").on("click", function(event) {
  event.stopPropagation();
});

イベント バブリングの詳細 http://www.quirksmode.org/js/events_order.html

#sidePanelしたがって、バブルからブロックする必要があるすべてのイベントをキャッチする必要があります#map。これらにはonmousedownonmouseupなどが含まれる場合があります。

于 2013-01-19T22:38:03.897 に答える