2017-04-07 23 views
1

ページに3つのタブがあり、Openlayerマップがデフォルトでは現在のページではない2番目のページにある場合。 2番目のタブをクリックすると地図タイルが読み込まれません。 Web文書ウィンドウのサイズを変更したときにのみマップタイルが読み込まれます。これはすべてのブラウザで起こっています。あなたの参照のためのコードは以下の通りです。 jsfiddle linkOpenlayersタイルがタブ付きWebページにロードされていない

<!DOCTYPE html> 
 
<html> 
 
<head> 
 
<link rel="stylesheet" href="https://openlayers.org/en/v4.0.1/css/ol.css" type="text/css"> 
 
<style> 
 
.map { 
 
     height: 400px; 
 
     width: 100%; 
 
     } 
 
body {font-family: "Lato", sans-serif;} 
 

 
/* Style the tab */ 
 
div.tab { 
 
    overflow: hidden; 
 
    border: 1px solid #ccc; 
 
    background-color: #f1f1f1; 
 
} 
 

 
/* Style the buttons inside the tab */ 
 
div.tab button { 
 
    background-color: inherit; 
 
    float: left; 
 
    border: none; 
 
    outline: none; 
 
    cursor: pointer; 
 
    padding: 14px 16px; 
 
    transition: 0.3s; 
 
    font-size: 17px; 
 
} 
 

 
/* Change background color of buttons on hover */ 
 
div.tab button:hover { 
 
    background-color: #ddd; 
 
} 
 

 
/* Create an active/current tablink class */ 
 
div.tab button.active { 
 
    background-color: #ccc; 
 
} 
 

 
/* Style the tab content */ 
 
.tabcontent { 
 
    display: none; 
 
    padding: 6px 12px; 
 
    border: 1px solid #ccc; 
 
    border-top: none; 
 
} 
 

 
/* Style the close button */ 
 
.topright { 
 
    float: right; 
 
    cursor: pointer; 
 
    font-size: 20px; 
 
} 
 

 
.topright:hover {color: red;} 
 
</style> 
 
</head> 
 
<body> 
 

 
<p>Click on the x button in the top right corner to close the current tab:</p> 
 

 
<div class="tab"> 
 
    <button class="tablinks" onclick="openCity(event, 'London')" id="defaultOpen">London</button> 
 
    <button class="tablinks" onclick="openCity(event, 'Paris')">Paris</button> 
 
    <button class="tablinks" onclick="openCity(event, 'Tokyo')">Tokyo</button> 
 
</div> 
 

 
<div id="London" class="tabcontent"> 
 
    <span onclick="this.parentElement.style.display='none'" class="topright">x</span> 
 
    <h3>London</h3> 
 
    <p>London is the capital city of England.</p> 
 
</div> 
 

 
<div id="Paris" class="tabcontent"> 
 
    <span onclick="this.parentElement.style.display='none'" class="topright">x</span> 
 
    <h3>Paris</h3> 
 
    <p>Paris is the capital of France.</p> 
 
    <div id="map" class="map"></div> 
 
</div> 
 

 
<div id="Tokyo" class="tabcontent"> 
 
    <span onclick="this.parentElement.style.display='none'" class="topright">x</span> 
 
    <h3>Tokyo</h3> 
 
    <p>Tokyo is the capital of Japan.</p> 
 
</div> 
 
<script src="https://openlayers.org/en/v4.0.1/build/ol.js" type="text/javascript"></script> 
 
<script> 
 
function openCity(evt, cityName) { 
 
    var i, tabcontent, tablinks; 
 
    tabcontent = document.getElementsByClassName("tabcontent"); 
 
    for (i = 0; i < tabcontent.length; i++) { 
 
     tabcontent[i].style.display = "none"; 
 
    } 
 
    tablinks = document.getElementsByClassName("tablinks"); 
 
    for (i = 0; i < tablinks.length; i++) { 
 
     tablinks[i].className = tablinks[i].className.replace(" active", ""); 
 
    } 
 
    document.getElementById(cityName).style.display = "block"; 
 
    evt.currentTarget.className += " active"; 
 
} 
 

 
// Get the element with id="defaultOpen" and click on it 
 
document.getElementById("defaultOpen").click(); 
 

 
    var map = new ol.Map({ 
 
     target: 'map', 
 
     layers: [ 
 
      new ol.layer.Tile({ 
 
      source: new ol.source.OSM() 
 
      }) 
 
     ], 
 
     view: new ol.View({ 
 
      center: ol.proj.fromLonLat([37.41, 8.82]), 
 
      zoom: 4 
 
     }) 
 
     }); 
 
</script> 
 

 
</body> 
 
</html>

答えて

0

それがページに表示されていないときに、画像が読み込まれていないので、主な問題はあります。だからこそ背景が見えないのです。

私はこの問題を抱えていましたが、私はJSをこれに取り組むように変更しました。

これはJsFindleが最適な解決策ではありませんが、機能します。

<!DOCTYPE html> 
<html> 
<head> 
<link rel="stylesheet" href="https://openlayers.org/en/v4.0.1/css/ol.css" type="text/css"> 
<style> 
.map { 
     height: 400px; 
     width: 100%; 
     } 
body {font-family: "Lato", sans-serif;} 

/* Style the tab */ 
div.tab { 
    overflow: hidden; 
    border: 1px solid #ccc; 
    background-color: #f1f1f1; 
} 

/* Style the buttons inside the tab */ 
div.tab button { 
    background-color: inherit; 
    float: left; 
    border: none; 
    outline: none; 
    cursor: pointer; 
    padding: 14px 16px; 
    transition: 0.3s; 
    font-size: 17px; 
} 

/* Change background color of buttons on hover */ 
div.tab button:hover { 
    background-color: #ddd; 
} 

/* Create an active/current tablink class */ 
div.tab button.active { 
    background-color: #ccc; 
} 

/* Style the tab content */ 
.tabcontent { 
    display: none; 
    padding: 6px 12px; 
    border: 1px solid #ccc; 
    border-top: none; 
} 

/* Style the close button */ 
.topright { 
    float: right; 
    cursor: pointer; 
    font-size: 20px; 
} 

.topright:hover {color: red;} 
</style> 
</head> 
<body> 

<p>Click on the x button in the top right corner to close the current tab:</p> 

<div class="tab"> 
    <button class="tablinks" onclick="openCity(event, 'London')" id="defaultOpen">London</button> 
    <button class="tablinks" onclick="openCity(event, 'Paris'); newMap('Paris')">Paris</button> 
    <button class="tablinks" onclick="openCity(event, 'Tokyo')">Tokyo</button> 
</div> 

<div id="London" class="tabcontent"> 
    <span onclick="this.parentElement.style.display='none'" class="topright">x</span> 
    <h3>London</h3> 
    <p>London is the capital city of England.</p> 
</div> 

<div id="Paris" class="tabcontent"> 
    <span onclick="this.parentElement.style.display='none'" class="topright">x</span> 
    <h3>Paris</h3> 
    <p>Paris is the capital of France.</p> 
    <div id="map" class="map"></div> 
</div> 

<div id="Tokyo" class="tabcontent"> 
    <span onclick="this.parentElement.style.display='none'" class="topright">x</span> 
    <h3>Tokyo</h3> 
    <p>Tokyo is the capital of Japan.</p> 
</div> 
<script src="https://openlayers.org/en/v4.0.1/build/ol.js" type="text/javascript"></script> 
<script> 
function openCity(evt, cityName) { 
    var i, tabcontent, tablinks; 
    tabcontent = document.getElementsByClassName("tabcontent"); 
    for (i = 0; i < tabcontent.length; i++) { 
     tabcontent[i].style.display = "none"; 
    } 
    tablinks = document.getElementsByClassName("tablinks"); 
    for (i = 0; i < tablinks.length; i++) { 
     tablinks[i].className = tablinks[i].className.replace(" active", ""); 
    } 
    document.getElementById(cityName).style.display = "block"; 
    evt.currentTarget.className += " active"; 
} 

// Get the element with id="defaultOpen" and click on it 
document.getElementById("defaultOpen").click(); 
var maps = {}; 
function newMap(name){ 

     if(!maps[name]){ 

    maps[name] = new ol.Map({ 
     target: 'map', 
     layers: [ 
      new ol.layer.Tile({ 
      source: new ol.source.OSM() 
      }) 
     ], 
     view: new ol.View({ 
      center: ol.proj.fromLonLat([37.41, 8.82]), 
      zoom: 4 
     }) 
     }); 

    } 


}  
</script> 

</body> 
</html> 

これらは私が変更した部分です。

<button class="tablinks" onclick="openCity(event, 'Paris'); newMap('Paris')">Paris</button> 

var maps = {}; 
function newMap(name){ 

     if(!maps[name]){ 

    maps[name] = new ol.Map({ 
     target: 'map', 
     layers: [ 
      new ol.layer.Tile({ 
      source: new ol.source.OSM() 
      }) 
     ], 
     view: new ol.View({ 
      center: ol.proj.fromLonLat([37.41, 8.82]), 
      zoom: 4 
     }) 
     }); 

    } 

} 
+0

を発射されます。 –

+0

私が変更した部品を分離しました。これらの部品もあなたのコードに変更しましたか?あなたのコードベースをもう少し近くに変えることができますか? –

0
あなたは自分の openCity()機能でこれを追加することができ、それが動作します

if(cityName == 'Paris') { 
    map.updateSize(); 
} 

の作業フィドル:https://jsfiddle.net/rLa0bk2d/1/

+0

jsfiddle上でさえ、これは動作しません。 –

0

ホープ、これはタブのonclickイベントに

の作品このように関数を追加する

<button class="tablinks" onclick="openCity(event, 'Paris'), init()">Paris</button> 

その後、jsのコードに関数initを作成し、それ

function init() { 
    var map = new ol.Map({ 
     target: 'map', 
     layers: [ 
     new ol.layer.Tile({ 
      source: new ol.source.OSM() 
     }) 
     ], 
     view: new ol.View({ 


     center: ol.proj.fromLonLat([37.41, 8.82]), 
     zoom: 4 
     }) 
    }); 
    } 

https://jsfiddle.net/4cm8eqvn/2/

1

の内側に、私はときに呼び出され、新しいマップを作成することをされて働いているコードベースに問題がマップを置きます私はこの

onclick="openCity(event, 'Paris'), init()" 

これはもう一つのマップのdivコンテナを作成しているようなもので、新しいマップを作成しようとするので、もしページがロードされています。

私は

map.updateSize(); 

を使用して、問題が解決することですが、私はonClickイベントで非同期的にそれを呼び出していますがこれは私のコードベースでは動作しません

setTimeout(function() { Compass.map.updateSize(); }, 0); 
関連する問題