doodle開発記 石丸健太郎

子供の転地療養のため住み慣れた東京を離れ湖と山に囲まれた諏訪の地にて21世紀的なワークライフバランスのあり方を模索中。GPSケータイとGoogleMapsを連携させたマッシュアップサイト「doodle」を中心に、関連サービスの開発日記を綴ります。

2007年02月18日

インターネットサイトは開けません。操作は中断されました。

GoogleMapsで何か開発された方であれば、必ずや一度は通る登竜門?
このメッセージに途方にくれた方も多いのではないでしょうか?
私もその一人。ちょっとググってもわんさか出てきます。

IEでGoogleMapsを扱おうとすると、単純な表示なら問題なくてもちょっとタグをいじっただけでこのような意味不明なメッセージで表示ができなくなってしまう。しかもFireFoxのような親切なエラーコンソールもないので、エラー内容も行数も怪しげで、こんなんでどうやってデバックせいっちゅうの。

結局レンダリングのタイミングでIEの気に障る部分がでるとこのエラーが出るようで、iframeで呼び出すかbody onloadで呼び出すと出なくなるというのが解決策の模様。ここまではよかった。

iframeは動的なサイトでは非常に扱いづらいのでonloadを使うことになるのだが、onloadでなければ駄目ということは、データがすべて呼び込まれたあとに実行されるということを意味するのと、処理を関数にひとまとめにする必要があるということを意味する。

一方どういうわけかIEではGoogleMapsのMAPオブジェクトを生成するのに
varで変数を宣言しないと動いてくれないのである。(他のブラウザではそんなことはない)

しかしだ。varで宣言してしまうと関数内のローカル変数として扱われてしまうので、onloadの中に入れてしまうと、外からMapを参照したいときにスコープから外れて実行できなくなってしまうのだ。
すべてCGI処理するのならまったく問題ないのであるが、Ajaxで通信したい場合、onloadで呼ばれるのは初回のみなので困ったことになる。どうしたものか。。。

わかってしまえば、バカバカしいというか単純なのだが、
varによる変数の定義とMapオブジェクトの生成を同時にしなければいけない理由はない。

つまり
var map;
と先に宣言しておいて関数内で
map = new GMap2(document.getElementById("map"));
とすれば後から定義した関数の中からでもどこからでもMapオブジェクトが参照できるので
IEでも他のブラウザでも問題なく動くというわけだ。

何気にこのサイトのサンプルスクリプトを見て気がつきましたよ。THX。
動いたときには思わずプラトーンばりにガッツポーズしてしまいました。。

しかし、、まあ、たったこの一行に気がつくのにえらい時間がかかってしまったというわけで。OTL。。。情けない。。


追記

IEではHTML中に定義されたID名もJavaScriptのグローバル変数として認識されてしまうらしいのでmapを描画するdivのID名とインスタンスを生成する変数名とを違うものに変えるか、もしくはvarでローカルスコープにするしかないようですね。ちなみにIEerBugというのを使うとIEでも多少エラートレースができるようになります。それにしてもIEはキャッシュの問題などもあり一筋縄ではいきませんので、治らないと思っても再度キャッシュをクリアするなどすると動いたりします。あと生成したMapオブジェクトを後からリサイズしようとしても機嫌が悪くなることもあるようです。サイズはMAPオブジェクト生成前に指定すると回避できる場合も多いようです。IE手ごわし。。。

posted by けひん at 00:00| 長野 雨| Comment(7) | TrackBack(1) | ハマリ道 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
はじめまして。
いきなりの訪問で伺いたいことがあるのですが。。。

今私もgooglemapをwebサイトに載せようとしているんですが、どうにもこうにもIEベースブラウザはうまくいきません。。
一応onloadを使用してみたのですが、やっぱりうまくいきませんでした。そもそもjavascriptもあまり知らないですし、書き方が間違っている可能性も大ですが。。。

それでググっていたら偶然にもこのページにたどり着き、表示されるように修正されたってのを拝見してお力になって頂けないかと書き込みをしました。

突然で申し訳ないのですが、どうかお力になってください。お願いします。
Posted by こうた at 2007年03月12日 20:38
>こうたさん こんにちわ

お力になれるといいのですが、IEは未だに私も苦労しています。IE以外(FireFoxやOpera)で動くことを前提にしますが、対処療法としてはonload以外にmapオブジェクトを操作しているコードがどこかにないでしょうか?
そのコードで怪しそうなものを</body>の後ろに置くとうまくいったりします。これは何を意味しているかと言うと、onloadは読み込み完了時に実行されるのですが、その前にmapオブジェクトを操作しようとするとIEは気に食わないらしく、まずmapオブジェクトをきちんと実行した後に動かす必要があるということです。

それとこの記事に書いている変数のスコープも気をつけてみてください。onloadに入れていると言うことはすなわち関数にひとまとめにしているはずで、その中でvarで宣言したものは基本的にはローカルでしか動かないので、それを関数の外でも使いたいのであれば外側でvarの宣言をしてから使うと言うのも手です。
頑張ってください。
Posted by けひ at 2007年03月12日 23:12
>けひんさん

ご回答ありがとうございます!!!
返信するのが遅くなり申し訳ありません。

やっぱりIEはあまり良くないんですかね。。
わかりました。ちょっとコードを探ってみます。
まだまだ初心者なものでどこが該当コードかわからないかもしれませんが…^^;

とりあえずいろいろいじってみて、なんとか表示されるようやってみます。
ありがとうございました。
Posted by こうた at 2007年03月14日 12:14
>こうたさん


IEは確かに厄介なのですが、かといって無視できないほどの圧倒的なシェアですので、対応せざるを得ないですよね。
もしそのサイトのマップ部分がiframeにできるんでしたら、それがエラー回避の早道かもしれませんよ。いまやFireFoxでもiframe見られますからね。。。

Posted by けひ at 2007年03月14日 20:24
はじめまして、コメント残していきます。

本文より
>一方どういうわけかIEではGoogleMapsのMAPオブジェクトを生成するのに
varで変数を宣言しないと動いてくれないのである。(他のブラウザではそんなことはない)
ってことを知らず、二日悩んでました。

var=map;
として、その後map=・・・と書いていったら解決しました。

今度そうすると、onload関数外の、マーカーを呼び出す関数(addMarker())にエラーが出たんですが、強引にaddMarker(map)とすることで解決しました。

どこを検索してもなかなかこの答えにめぐり合えなかったので、本当に感謝しています。

ありがとうございました
Posted by haruka at 2008年05月23日 11:05
すいません、上のコメに自レスです。

>今度そうすると、onload関数外の、マーカーを呼び出す関数(addMarker())にエラーが出たんですが、強引にaddMarker(map)とすることで解決しました。

そんなことありませんでした;キャッシュを消してからリロードしたら問題ありませんでした;
Posted by haruka at 2008年05月23日 12:25
>harukaさん

お役に立てて何よりです。
わかってしまえば単純なんですが、
同じことで悩む人がひとりでも減ればと思い恥ずかしながらブログにしました。
お役に立てて嬉しいです。
Posted by けひん at 2008年05月23日 15:52
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/34097037

この記事へのトラックバック

インターネットサイトを開けません
Excerpt: 最近、よく「インターネットサイト http://fatman.gone.jp/ を開けません。操作は中断されました。」というメッセージが表示され、エラーページに飛ばされてしまいます。何回か試すと見える..
Weblog: Le Petit Royaume - blog
Tracked: 2008-06-04 12:50
Powered by Seesaa