4

高さと幅を 100% に設定すると、Twitter Bootstrap CSS が競合する必要があると思われます。同様の問題を抱えている人のために残します。

ユーザーがリンクをクリックしたときに Web ページに Google マップを実装しようとしています。すべての PHP は正常に動作しますが、何らかの理由で Google マップが表示されません。API ドキュメントのすべての例を読み直し、再すべてのコードを読みますが、まだ機能していない理由がわかりません..

地図を表示するページはこちら

注: PHP は正常に動作し、スクリプトはページの読み込み時に読み込まれますが、マップは読み込まれません。

<?php
    /* Include header and config and set variable*/
    require_once('config.inc.php');
    require_once($rootdir . $dirsubfolder . 'navbar.php');
    $route = $_GET['route'];
?>

<?php
/* User wants to retrieve their route */
if (isset($route)) {
?>


<?php
/* User wants Route 1 */
if (strcmp($route, "sunroute1") == 0) {
?>
<script type="text/javascript">
      function initialize() {
        var mapOptions = {
          center: new google.maps.LatLng(-34.397, 150.644),
          zoom: 8,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        var map = new google.maps.Map(document.getElementById("map_canvas"),
            mapOptions);
      }

      function loadScript() {
        var script = document.createElement("script");
        script.type = "text/javascript";
        script.src = "http://maps.googleapis.com/maps/api/js?key=WORKINGKEYk&sensor=true&callback=initialize";
        document.body.appendChild(script);
      }

    window.onload = loadScript;
</script>
<?php
printf('worked');
} else { printf('failed'); }
?>

<div class="container">
    <div class="hero-unit">
        <div id="map_canvas" style="width: 100%; height: 100%"></div>
    </div>
</div>








<?php
    /* End isset(route) */
    }
    /* Include footer */
    require_once($rootdir . $dirsubfolder . 'footer.php');
?>

そして私のfooter.phpの中に私は持っています

<script src="https://maps.googleapis.com/maps/api/js?key=MYKEYWORKING&sensor=false"></script>

view sourceページからはこちら

<script type="text/javascript">
      function initialize() {
        var mapOptions = {
          center: new google.maps.LatLng(-34.397, 150.644),
          zoom: 8,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        var map = new google.maps.Map(document.getElementById("map_canvas"),
            mapOptions);
      }

      function loadScript() {
        var script = document.createElement("script");
        script.type = "text/javascript";
        script.src = "http://maps.googleapis.com/maps/api/js?key=WORKING&sensor=true&callback=initialize";
        document.body.appendChild(script);
      }

    window.onload = loadScript;
</script>
worked
<div class="container">
    <div class="hero-unit">
        <div id="map_canvas" style="width: 100%; height: 100%"></div>
    </div>
</div>

そして、フッターの私のスクリプト

      <script src="http://code.jquery.com/jquery-latest.js"></script>
      <script src="js/bootstrap-transition.js"></script>
      <script src="js/bootstrap-alert.js"></script>
      <script src="js/bootstrap-modal.js"></script>
      <script src="js/bootstrap-dropdown.js"></script>
      <script src="js/bootstrap-scrollspy.js"></script>
      <script src="js/bootstrap-tab.js"></script>
      <script src="js/bootstrap-tooltip.js"></script>
      <script src="js/bootstrap-popover.js"></script>
      <script src="js/bootstrap-button.js"></script>
      <script src="js/bootstrap-collapse.js"></script>
      <script src="js/bootstrap-carousel.js"></script>
      <script src="js/bootstrap-typeahead.js"></script>
      <script src="https://maps.googleapis.com/maps/api/js?key=WORKING&sensor=false"></script>
</body>
</html>
4

2 に答える 2

2

高さと幅を 100% に設定すると、Twitter Bootstrap CSS が競合する必要があると思われます。同様の問題を抱えている人のために残します。

于 2013-03-03T05:40:24.747 に答える
1

それが問題だったというあなたの言う通りですheight:100%が、Bootstrap との不可解な競合ではありません。何が間違っているのかを正確に確認するのに十分なコードを示していませんでしたが、同様の問題を何度も見たり経験したりして、それが何であるかについてかなり良い考えを持っています.

マップを初期化した時点では、hero-unit要素にはまだ高さや幅が指定されていないため、高さがゼロになっていると思われます。このため、map_canvas要素の高さもゼロです。結局のところ、ゼロの 100% はゼロです。

を呼び出すとnew google.maps.Map()、指定した要素の現在の高さmap_canvas、つまりゼロを使用してマップが作成されます。これではうまくいきません。

後でhero-unit高さを指定しても、それは修正されません。確かに、これで一致するheight:100%ようmap_canvasにサイズも変更されますが、Maps API はこれが起こったことを知りません!

要素に明示的な高さを与えるか、要素のサイズを変更したmap_canvasにこの呼び出しを行うことで、これを修正できます。

google.maps.event.trigger( map, 'resize' );

これにより、Maps API は新しい要素のサイズを確認し、それに応じて調整するように指示されます。これは、サイズ変更可能なマップが必要な場合に行う呼び出しでもありresizeます。マップ要素でイベントをリッスンし、イベントが発生したときにその呼び出しを行います。

説明するために、いくつかのロギングがスローされたコードの非常に単純化されたバージョンを見てみましょう。

<!DOCTYPE html>
<html>
<head>
    <title>CSS Width and Height Test</title>
</head>

<body onload="test()">

    <div id="container">
        <div id="hero-unit">
            <div id="map_canvas"
                style="width: 100%; height: 100%"
            ></div>
        </div>
    </div>

    <script>
        function test() {
            var hero = document.getElementById('hero-unit');
            var canvas = document.getElementById('map_canvas');

            console.log(
                'Canvas size before setting hero size: ' +
                canvas.offsetWidth + 'x' +
                canvas.offsetHeight
            );

            hero.style.height = '300px';
            hero.style.width = '400px';

            console.log(
                'Canvas size after setting hero size: ' +
                canvas.offsetWidth + 'x' +
                canvas.offsetHeight
            );
        }
    </script>

</body>
</html>

そのページを保存し、お気に入りのブラウザーで開発者ツール コンソールを開いて表示すると、ログ メッセージを確認できます。たとえば、Windows 上の Chrome では、F12キーを使用して開発者ツールを開き、[コンソール] タブをクリックします。

次のように表示されます (幅の値はブラウザ ウィンドウの幅によって異なります)。

Canvas size before setting hero size: 1244x0      css-height.html:20
Canvas size after setting hero size: 400x300      css-height.html:29

ご覧のとおり、親のサイズが変更される前は、map_canvas高さがゼロで、幅が予想よりも大きくなっています。

関連するコメント:

ここで行ったようにブラウザーの開発者ツールを使用することに慣れていない場合は、時間をかけて慣れてください。特に Chrome には、その開発者パネルに素晴らしいツール セットがあります。次のステートメントを任意の場所に追加することで、JavaScript コードにブレークポイントを設定できます。

debugger;

または、開発者ツールでソース ファイルを表示し、左マージンをクリックします。ブラウザーがブレークポイントで停止すると、JavaScript 変数やあらゆる種類のものを調べることができます。開発者ツール パネルの [要素] タブを使用して、いつでも DOM 要素を調べることができます。このバグについては、[Elements] タブのツリー ビューで見つけてmap_canvas、[Computed Styles] を確認すると、高さがゼロであることがわかります。

また、 PHP コードを完全に無視することで、Maps API コードをデバッグする際のトラブルを回避できます。Maps API は JavaScript API です。PHP コードは認識されません。あなたのサイトが PHP で書かれたことさえ知りません。ブラウザーに配信される最終的な HTML/CSS/JavaScript コードだけが表示されます。

最後に、Maps API を 2 回読み込んでいるようです。最初はインライン スクリプトを使用し、後で非同期メソッドを使用しています。一度で十分です。非同期読み込みが必要でない限り、簡単にするためにインライン スクリプトを使用します。

于 2013-03-03T09:43:25.233 に答える