次のコードでGoogle MAP API v3を使用しようとしています。
<h2>Topology</h2>
<script src="https://maps.google.com/maps/api/js?sensor=false" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="{% url css_media 'tooltip.topology.css' %}" />
<link rel="stylesheet" type="text/css" href="{% url css_media 'tooltip.css' %}" />
<style type="text/css" >
#map_canvas {
width:300px;
height:300px;
}
</style>
<script type="text/javascript">
var latlng = new google.maps.LatLng(-34.397, 150.644);
var myOptions = {
zoom: 8,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("map_canvas"),
myOptions);
</script>
<div id="map_canvas"> </div>
私がこのコードを実行すると、ブラウザはこれを言います。
捕捉されないTypeError:nullのプロパティ「offsetWidth」を読み取ることができません
私は このチュートリアル で与えられた指示に従うので、私にはわかりません。
何か手がかりがありますか。
この問題は通常、JavaScriptが実行される前にそれにアクセスする必要があるmap divがレンダリングされていないことが原因です。
初期化コードはonload関数内またはHTMLファイルの末尾のタグの直前に配置する必要があります。そのため、DOMは実行前に完全にレンダリングされます(2番目のオプションは無効なHTMLに対してより敏感です)。
注意してください、 matthewsheets で指摘されているように、これはそのidを持つdivがあなたのHTMLにまったく存在していないために起こる可能性があります。レンダリングされていません)
wf9a5m75 の投稿からコードサンプルを追加して、すべてを1か所にまとめます。
<script type="text/javascript">
function initialize() {
var latlng = new google.maps.LatLng(-34.397, 150.644);
var myOptions = {
zoom: 8,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("map_canvas"),
myOptions);
}
google.maps.event.addDomListener(window, "load", initialize);
</script>
上記の推奨事項を試した後でも、まだこの問題がある可能性がある他の人では、初期化関数でマップキャンバスに誤ったセレクタを使用すると、この問題が発生する可能性があります。関数が存在しないものにアクセスしようとしているのと同じ問題。あなたのマップIDがあなたの初期化関数とあなたのHTMLの中で一致することを再確認するか、あるいはこれと同じエラーが投げられるかもしれない。
言い換えれば、あなたのIDが一致することを確認してください。 ;)
googleはサンプルでid="map_canvas"
とid="map-canvas"
を使用しています。IDを再確認し、再確認してください。D
年、geocodezipの答えは正しいです。そのため、コードを次のように変更します。(まだ問題がある場合、または将来的に他のユーザーがいる場合)
<script type="text/javascript">
function initialize() {
var latlng = new google.maps.LatLng(-34.397, 150.644);
var myOptions = {
zoom: 8,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("map_canvas"),
myOptions);
}
google.maps.event.addDomListener(window, "load", initialize);
</script>
マップオプションでcenter
またはzoom
を指定していない場合も、このエラーが発生する可能性があります。
それで、これを機能させるための失敗シナリオを追加します。私は<div id="map>
を持っていて、その中で私はマップをロードしていました:
var map = new google.maps.Map(document.getElementById("map"), myOptions);
divは最初は非表示で、幅と高さの値は明示的に設定されていなかったので、サイズはwidth x 0
でした。 CSSでこのdivのサイズをこのように設定したら
#map {
width: 500px;
height: 300px;
}
すべてうまくいった!これが誰かに役立つことを願っています。
この問題を抱えている可能性がある他の人たちのために、私は自己終了<div id="map1" />
タグを使用していました、そして2番目のdivは表示されず、ドームにいるようには見えません。 2つのオープンタグとクローズタグ<div id="map1"></div>
に変更するとすぐにうまくいきました。 hth
私は私の中に一重引用符がありました
var map = new google.maps.Map( document.getElementById('map_canvas') );
二重引用符で置き換えます
var map = new google.maps.Map( document.getElementById("map_canvas") );
これは私にとってトリックでした。
書かないように気をつけて
google.maps.event.addDomListener(window, "load", init())
正しい:
google.maps.event.addDomListener(window, "load", init)
IDが同じで、divに幅と高さがあり、コードが正しくないことを確認したにもかかわらず、IDを(全3か所で) "map-canvas"から "map"に変更して修正しましたウィンドウロード呼び出しの後まで実行されます。それはダッシュではありません。それは "map"以外のどのIDでも機能しないようです。
また、ハッシュ記号(#)をセレクタの内側に配置しないでください。
document.getElementById('#map') // bad
document.getElementById('map') // good
ステートメント。それはjQueryではありません。急いでいる人へのちょっとしたメモです。
私は同じ問題を抱えていたが、問題はズームがグーグルマップに与えられたオプションオブジェクトの中で定義されなかったということだった。
ループ内に複数のマップを作成している場合、単一のマップDOM要素が存在しないと、それらすべてが壊れます。まず、新しいMapオブジェクトを作成する前に、DOM要素が存在することを確認してください。
[...]
for( var i = 0; i <= self.multiple_maps; i++ ) {
var map_element = document.getElementById( 'map' + '-' + i.toString() );
// Element doesn't exist, don't create map!
if( null === map_element ) {
continue;
}
var map = new google.maps.Map( map_element, myOptions);
}
[...]
そしてコントローラーで
google.maps.event.addDomListener(window、 "load"、init){...}の代わりに$ scope.init = function(){...}を使用してください
これがお役に立てば幸いです。
それを解決するためには、スクリプトにasync defer
を追加する必要があります。
これは次のようになります。
<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap"
async defer></script>
非同期遅延の意味については、 こちら を参照してください。
メインのjsファイルから関数を呼び出すことになるので、これがメインのスクリプトをロードしたものの後であることも確認したいと思います。
たまたまasp.net Webフォームを使用していて、マスターページを使用してページの背後のコードにスクリプトを登録している場合は、マップ要素のクライアントID(vb.net)を忘れずに使用してください。
ClientScript.RegisterStartupScript(Me.[GetType](), "Google Maps Initialization", String.Format("init_map(""" & map_canvas.ClientID() & """...
私はパーティーに少し遅れていることを知っています、divがページに存在しないときにもエラーが発生する可能性があることを付け加えたいと思いました。 Googleマップの関数呼び出しを読み込む前に、divが最初に存在するかどうかを確認することもできます。何かのようなもの
function initMap() {
if($("#venuemap").length != 0) {
var city= {lat: -26.2041, lng: 28.0473};
var map = new google.maps.Map(document.getElementById('venuemap'), {
etc etc
}
}
初めてAPIをロードするときは、Placesライブラリの&libraries=places
パラメータを必ず含めてください。
例えば:
<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places">
これを修正するための実際に最も簡単な方法はそれがうまくいったJavascriptコードの前にあなたのオブジェクトを動かすことです。私はあなたの回答オブジェクトがJavaScriptコードの後にロードされていると思います。
<style type="text/css" >
#map_canvas {
width:300px;
height:300px;
}
<div id="map_canvas"> </div> // Here
<script type="text/javascript">
var latlng = new google.maps.LatLng(-34.397, 150.644);
var myOptions = {
zoom: 8,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("map_canvas"),
myOptions);
</script>
<div id="map_canvas"> </div>
map api key callの開始を遅らせる非同期を追加します。
私が扱っていたケースでは、場所が公開されているかどうかに応じて、マップdivが条件付きでレンダリングされました。マップキャンバスdivがページ上にあるかどうかわからない場合は、document.getElementById
が要素を返していることを確認し、存在する場合のみマップを呼び出します。
var mapEle = document.getElementById("map_canvas");
if (mapEle) {
map = new google.maps.Map(mapEle, myOptions);
}
私の場合、この種の問題はdefer
https://developer.mozilla.org/en/docs/Web/HTML/Element/script を使用して解決されました
<script src="<your file>.js" defer></script>
ただし、このオプションに対するブラウザのサポートを考慮する必要があります(私は問題を見たことがありません)。
これは以前に削除された投稿を編集して、リンクされた回答の内容を回答自体に含めるためのものです。この答えを再公開する目的は、この問題に遭遇したことのあるReact 0.9+ユーザーのためのPSAとして機能することです。
このブログ記事をフォローしながら ReactJSを使用する際にもこのエラーが発生しました 。 sahatのコメント はここ に役立ちました - 下のsahatのコメントの内容を参照してください。
act️Reactに関するメモ> = 0.9
V0.9より前では、DOMノードは最後の引数として渡されました。これを使用していたとしても、this.getDOMNode()を呼び出してDOMノードにアクセスできます。
言い換えれば、Reactの最新版のrootNodeパラメータをthis.getDOMNode()に置き換えてください。
window.self
をオーバーライドしていないことを確認してください
私の問題:私はコンポーネントを作成し、var self = this
の代わりにself = this
を書きました。キーワードvar
を使用しない場合、JSはその変数をウィンドウオブジェクトに配置するので、このエラーの原因となるwindow.self
を書き換えました。
私の失敗は使用することでした
zoomLevel
正しいオプションではなく、オプションとして
zoom