1

編集:これに別の日に取り組んだ後、私は何が起こっているのかを知っていると信じていますが、まだ確認していません。確実にわかったら、回答として投稿します。

何が起こっているのかは、Google Maps APIがAjaxLoaderユーティリティを介してGWTから読み込まれているため、USGSOverlayコードを含むjavascriptライブラリが読み込まれているときにgoogle.maps.OverlayViewが解決されないため、次のようになります。

USGSOverlay.ptototype=google.maps.OverlayView();

オブジェクトのプロトタイプ情報を消去します。現在、AjaxLoader.loadApi()メソッドが完了した後、USGSOverlayライブラリを動的にロードするように取り組んでいます。

追加の症状:プロトタイプがgoogle.maps.OverlayView()に設定されている場合、USGSOverlayの継承と、ファイルの下部に追加したテストオブジェクトの継承の両方が壊れます。これらの行をJSライブラリファイルの先頭に追加してUSGSOverlayオブジェクトの継承を変更すると、

function OverlayParent() {
}

OverlayParent.prototype.setMap= function(map) {}

USGSOverlay.prototypeを新しいOverlayParent()と等しくなるように変更すると、継承が機能し、例外は発生しません。this.SetMap(map)は関数ではありません

誰かがこれに対する既成の解決策を持っているなら、私はリンクをいただければ幸いですが、私はこのDOMベースのオンデマンドJavascriptに似た解決策を追求しています


私はJavaScriptを初めて使用しますが、非常に経験豊富なプログラマーであり、これに困惑しています。私はこれに数日間取り組んできましたが、ほとんど進展はありませんでした。最新のバージョンでは、 Google Maps JavaScript APIv3CustomOverlayからほぼ正確にコードをコピーしています。OverlayViewの関連ドキュメントには、「オーバーレイのプロトタイプを新しいOverlayView.prototypeに設定して、このクラスから継承する必要があります」と記載されています。私が経験している問題は、GoogleMapsAPIに固有のものではないと思います。これがコードです。

function USGSOverlay(bounds, image, map) {
  // Now initialize all properties.
  this.bounds_ = bounds;
  this.image_ = image;
  this.map_ = map;

  // We define a property to hold the image's
  // div. We'll actually create this div
  // upon receipt of the add() method so we'll
  // leave it null for now.
  this.div_ = null;

  // Explicitly call setMap() on this overlay

  this.setMap(map);
}

USGSOverlay.prototype = new google.maps.OverlayView();
USGSOverlay.prototype.constructor=USGSOverlay;

前に説明したように、onAdd、draw、およびonRemoveの実装例が続きます。

次の例外をスローする継承されたメソッドsetMapの呼び出しまで、コードをステップスルーすることはすべて問題ないように見えます。

Cannot load Google Maps API to your browser (TypeError): this.setMap is not a function;

火災のバグは、proto変数が設定されていないことを示しています。したがって、継承は行われていません。私はもともとGWTJSNI関数を介してコンストラクターを呼び出していましたが、方程式のその部分を排除するために、渡すパラメーターが適切であることを確認するために2番目のテストJavaスクリプトオブジェクトを作成しました。その関数は次のようになります。

function TestUSGSOverlay(map,inBound) {
  var swBound = new google.maps.LatLng(39.5, -106.0);
  var neBound = new google.maps.LatLng(40.0, -105);
  var bounds = new google.maps.LatLngBounds(swBound, neBound);
  var sw = inBound.getSouthWest();
  var ne = inBound.getNorthEast();

  var marker = new google.maps.Marker({
      position: sw,
      map: map,
      title:"South West Corner"
  });

  var marker2 = new google.maps.Marker({
      position: ne,
      map: map,
      title:"North East Corner"
  });

  // Photograph courtesy of the U.S. Geological Survey
  var srcImage = 'images/DenverWest.png';
  var usgsMap = new google.maps.GroundOverlay(srcImage,bounds);
  usgsMap.setMap(map);
  this.overlay = new USGSOverlay(bounds, srcImage, map);
 }

最後の行をコメントアウトすると、米国地質調査所の地図を使用して、南西マーカーと北東マーカーの間に地図が正しく表示されます。私の実際の要件は、テーブルdivにテキストを表示することですが、可能な限り模倣するために、マップスキャンに置き換えました。

プロトタイプの継承に関する多くの投稿を読んだことがあり、それが些細なことではないことは理解していますが、私が試したことはこれ以上近づいていません。IE 8でも、firefoxと同じ動作をします。あなたが提供できるアドバイスは大歓迎です、私はアイデアを使い果たしています。

4

3 に答える 3

0

ドキュメントによると、Google Charts は 2016 年 2 月 23 日にリリースされ、現在の公式リリースです。

そして、これは更新する必要があることがわかったものです

これが役立つことを願っています!

乾杯、ジェイ

于 2017-01-03T23:26:30.167 に答える
0

私は同じ問題を抱えていましたが、回答で説明した方法でカスタムオーバーレイスクリプトを動的にロードすることに頼るという考えは好きではありませんでした。

どのようにinitialize()関数を呼び出していますか?

次のように Google Maps API をロードしていました。

<!-- I omitted sensor=false so this would fit without scrollbars -->
<script type="text/javascript" 
    src="http://maps.googleapis.com/maps/api/js?callback=initialize">
</script>

に注意して callback=initializeください。これが競合状態の原因でした。callback=initializeAPI を取得するクエリ文字列から削除し、これをinit.jsスクリプトの最後に追加しました。

window.onload = initialize();

それは私のためにそれを解決しました。お役に立てれば!

于 2012-11-12T22:55:18.547 に答える
0

最終的にこの問題を診断して修正することができました。問題は競合状態に似ていますが、正しい順序が発生することはないため、競合状態と呼ぶのをためらっています。

問題は、私が取り組んでいるアプリケーションでは、Google Maps API が Google API のAjaxLoaderオブジェクトを介して読み込まれ、USGSOverlay JavaScript ライブラリがページ読み込みプロセスの一部として読み込まれることです。AjaxLoader は、Google Maps API を GWT エントリ ポイント メソッドから非同期的にロードするか、JavaScript が既にロードされた後に発生する HTML ワールド onLoad でロードします。エラーは報告されておらず、USGSOverlay の JavaScript コンストラクターは存在していましたが、オブジェクトの継承が正しくありませんでした。(余談ですが、この状況を検出するツールを推奨できる人はいますか?)

__proto__USGSOverlay オブジェクトにメンバー変数がないため、無効な継承状態が firebug デバッガーに表示される可能性がありました。この問題を修正するために、AjaxLoader のloadApiメソッドに渡される onLoad コールバック メソッドに USGSOverlay JavaScript ライブラリを動的にロードするロジックを追加しました。残っている唯一の問題は、このアプローチが DOM に依存してページの先頭への追加を検出し、スクリプトの読み込みを実行することでした。これにより、プログラムがライブラリにアクセスしようとしたときにライブラリがロードされないという実際の競合状態が頻繁に発生しました。

Java スクリプトを動的にロードする方法を説明する記事へのリンクを次に示します。DOM ベースのオンデマンド Javascript

ライブラリがロードされていないという競合状態を回避するために、単に追加しました

if (typeof USGSOverlay != 'undefined') { ... }

メソッドを呼び出す前にテストしnew USGSOverlay(...ます。私の実際の OverlayView 派生オブジェクトはホバーに関連しているため、この単純な予防的例外保護は私の目的には十分でした。オーバーレイが初期表示の一部である場合は、より洗練された方法が必要になりますが、それはあなたの問題です:)。その方法については多くの議論があります。

于 2012-10-06T14:41:13.320 に答える