Ajax & Javascriptの最近のブログ記事

ブログなどでソースコードを美しく見せるためのライブラリが多数ありますが、今回から「SyntaxHighlighter」を使用することにしました。
やはりソースコードは色分けされていたほうが見やすいですしね。

いろんなライブラリがあるのですが、その中でも「SyntaxHighlighter」の表示の仕方が一番好みだったのと、一番使われているような気がしましたので採用しました。

導入方法は簡単。

SyntaxHighlighterのダウンロードページからダウンロード。いろんな言語のバージョンがあります。(ここでいう言語とはプログラム言語ではなく、英語や日本語といった自然言語のこと)
私が確認した時点(2010年2月13日)では、日本語バージョンは無かったので「English」をダウンロード。

ダウンロードしたファイルを解凍して、サーバーにアップ。
ブログの記事に記述するソースコードの言語(ここでいう言語とはJavaScriptやPHPといったプログラム言語)によって、読み込む JavaScriptが変わります。

プライバシーの問題で、最近何かと話題のGoogle ストリートビュー(Google Street View)

今回はIE(Internet Explorer)でGoogle ストリートビューが見れなくなる不具合の件です。
要するにブラウザでリロード(再読み込み)すると、ストリートビューが表示されなくなるという問題。

正確に言うと、ストリートビューで表示される埋め込みタグ(「HTML を貼り付けてサイトに地図を埋め込みます」で表示されるiframeタグ)を使うと、この不具合が発生します。

もっと正確に言うと、iframeの問題ではなく、iframeのリンク先を直接表示させても、同様の問題が発生します。

ちなみにこの埋め込みタグを使う場合、解決方法は現時点では「ブラウザのキャッシュをクリアする」しかありません。

「またIEか!」と怨嗟の声が聞こえそうですね。キャッシュをクリアする以外の解決方法としては・・・

  1. GoogleがIEに合わせてバージョンアップさせる。
  2. 誰かがIEをこの世から根絶させる。
  3. 別のJavascriptで実現する。

Googleが将来的にバージョンアップするのが一番平和的な解決方法ですが、とりあえず、ちょっと別のJavascriptを使って解決してみます。

 

このブログでは、立ち上げ当初からAdobe AIRやSilverlightなどの、RIA技術を追いかけてきました。
いまでは随分と余計な要素(いわゆるノイズ)が混じるようになってしまいましたが・・・

Adobeの「AIR」Microsoftの「Silverlight」Googleの「Gears」Sunの「Java FX」Curlの「Nitro」等々・・・
いずれも、ブラウザとデスクトップの両方にRIAを実現する技術で、アプローチ方法やベースとなる技術が違うだけで、その狙いはほぼ同じものだと思います。

それは、OSを影の存在にすることです。

ブラウザの枠を超えて、リッチなWebアプリケーションを実現するとか、ブラウザからPCのローカルデータにアクセスすることが「真の」目的ではないと思います。
どちらかというとそれはMicrosoftやAppleといった、OSを提供している企業を刺激しないための目くらましだと思います。

さて、ここ最近の私が個人的に気になった記事が3つあります。

 

先日の記事『シンプルな画像拡大スクリプト「FancyZoom」』で紹介した「FancyZoom」ですが、IEで自分のブログを見たら、ヘッダー部分のレイアウトが崩れていました。

私は普段、Firefoxを使用しているため、IEのチェックが怠りがちで、レイアウト崩れやJavascriptのバグに気づかないことが多々あります。本当は最低でもIE6、IE7、Firefox、Safariあたりはチェックしなくちゃいけないんですけどね。

今回もまさにそのケース。
原因は「FancyZoom」が、bodyタグの直下にdivとtableをひそかに追加しているため。

私のブログの場合、コンテンツ領域をdiv#containerにmargin-top:30pxを指定していました。
「FancyZoom」が追加したdivの高さやポジションの指定のせいで、隣接する要素がうまく取得できず、マージンを取れなかったのが原因です。

Firefoxの拡張「Firebug」を使って判明。

fancy_bug.gif

div#ZoomSpin、div#ZoomBox、div#ZoomCapDiv、div#ShadowBoxという4つのdivに加えて、div#ZoomCapDiv、div#ShadowBoxの中にはtableが追加されています。

Google Static Maps

| コメント(0) | トラックバック(0)

Javascriptを利用できない環境でもGoogle Mapsが利用できるようになりました。

Google Static Maps API

通常のGoogle Maps APIではJavascriptで地図を表示させ、ズーム機能やマウスでドラッグして移動させたり、マウスオンでふきだしを表示させたりなどできました。
ただし、Javascriptを使用できないモバイルサイトでは利用できませんでした。

モバイルでGoogle Mapsを利用したい場合はiアプリ版の「モバイルGoogleマップ」がありましたが、これはドコモの903iシリーズ以降の対応となっており、かなり限定的でした。

これまではモバイル版Yahoo!地図情報にリンクを貼ったりしてモバイルサイトに対応していたのですが、今後はGoogle Static Maps APIにより、Google Mapsも利用できるようになりそうです。

Google Static Mapsは静的なGIF画像を表示させます。
当然、ドラッグして地図を移動させたり、マウスオンでふきだしを表示させたり、ズーム機能は使えません。
しかしながらあらかじめマーカーを表示させたり、通常のマップとモバイル用のマップのいずれかのマップタイプを指定できます。

画像を拡大表示させるJavascriptは数あれど、これほどシンプルなものはないのではないか?と思われるのが「FancyZoom」です。

デモの確認とソースのダウンロードは下記のサイトから。
cabel.name: FancyZoom 1.1

2008年2月8日に1.1にバージョンアップしたようです。

使い方はいたってシンプル。
ダウンロードしてきたスクリプトにリンクを貼ります。

<script src="/js-global/FancyZoom.js" type="text/javascript"></script>
<script src="/js-global/FancyZoomHTML.js" type="text/javascript"></script>

bodyタグにonloadで読み込み。

<body onload="setupZoom()">

あとはサムネールの画像のimgタグにアンカータグで拡大画像へリンクを貼るだけ。

<a href="image.jpg"><img src="image-thumbnail.jpg" /></a>

画像から画像へのリンクは全てスクリプトが効きます。
他の画像拡大スクリプトのように、適用したい画像に記述を追加するのではなく、「適用したくない画像」にだけ、スクリプトを記述します。

rel="nozoom"

この記述を追加すれば、画像拡大しません。
title属性で画像のキャプションもつけることができます。

シンプルでいて利用価値が非常に高いと思われるJavascriptのライブラリが発表されていました。
ブロックレベル要素の高さを揃えることができるという「heightLine.js

複数のブロックレベル要素の高さを揃えれないというCSS固有の問題を解決できるという点で、かなり有意義なのではないでしょうか?
WEB標準に準拠という考え方に固執すると、ブロックレベル要素の高さを揃える必要性に疑問を感じなくもありませんが、現実問題として、デザイン上そういうニーズはあります。

そこだけテーブルレイアウトにしてしまうと、どこか「敗北感」みたいなものがあり、フルCSSレイアウトではなくなります。
そんな時、便利なheightLine.js。
ぜひ今度使わせていただきたいと思います。

このブログで「Google Mapsの埋め込み」という記事を書いた途端に、Google Mapsの方で簡単にブログに埋め込みができるようにアップグレードされました。
世の中そういうものですね。

やりかたは非常に簡単。

Google マップのページにアクセスします。
次に、埋め込みたい地図を表示させます。
それから、右上にある「このページのリンク」をクリック。

googlemap1.gif

サイズなどをカスタマイズもできます。


拡大地図を表示

チェックボックスから特定の数だけチェックさせ、そのvalue値をパラメータとしてリンク先に渡す方法です。
var itemNumで個数を設定。この個数以上、もしくはこの個数以下チェックされていてもアラートを表示させます。
チェックボックスのvalue値をパラメータとして連結させ、リンク先に渡します。
リンク先はjmpURLで設定します。


■Javascriptソース

var itemNum = 3; // 選択する個数を設定 function check() {
  if (document.myform.elements['flag[]'].length) {
    count = 0;
      for (var i=0;i         count ++;
      }
    }
    if (count == itemNum) {
      var jmpURL = "./itemVar?item1=" + document.myform.elements[0].value + "&item2=" + document.myform.elements[1].value + "&item3=" + document.myform.elements[2].value;
      window.location.href= jmpURL;
      return false;
    } else {
      var artTxt = "商品は必ず" + itemNum + "個チェックしてください。";       alert(artTxt);
      return false;
    }
  }
}


■HTMLソース

<p>メニューからご希望の3つをお選びください。</p>
<form id="myform" name="myform" method="post" action="" onsubmit="return check()">
<ul>
<li><input type="checkbox" name="flag[]" value="itm1" />塩ラーメン</li>
<li><input type="checkbox" name="flag[]" value="itm2" />みそラーメン</li>
<li><input type="checkbox" name="flag[]" value="itm3" />しょうゆラーメン</li>
<li><input type="checkbox" name="flag[]" value="itm4" />チャーシューメン</li>
<li><input type="checkbox" name="flag[]" value="itm5" />タンタンメン</li>
</ul>
<p>
<input type="submit" name="Submit" value="送信" />
</p>
</form>

MovableTypeにGoogle Mapsを埋め込みします。
ただMovableTypeのエントリー記事にGoogleMapsを埋め込むのは、他の方でもされていますので、ちょっと違ったアプローチ方法を取ってみました。

■設定条件
「表示する地図の緯度・経度をエントリー記事から指定できるようにする」

つまりあらかじめ決められた座標の地図をエントリーに表示させるのではなく、そのエントリーごと好きな座標の地図を表示できるようにするという条件を設定しました。


■実施手順

Google Mapsを利用するにはGoogleアカウントを取得後、Google Maps API-Sign Upで、API Keyを取得する必要があります。

今回私が取った方法は、MovableTypeのテンプレートにあらかじめAPI Keyを埋め込んでおく方法。

<script type="text/javascript" src="http://maps.google.co.jp/maps?file=api&v=1&key=あなたのKey">

■注意点その1・・・文字コードUTF-8。
Google Maps APIを利用するには文字コードがUTF-8でなくてはなりません。
当ブログはUTF-8で記述しているので問題ありませんが、Shift-JISやEUC-JPでエンコードしている場合は、インラインフレームで呼び出すしかありません。

■注意点その2・・・Javascriptは<head>タグ内に。
FirefoxやOperaなどのブラウザでは問題ないのですが、IEでは<body>タグ内に、Javascriptを記述して直接GoogleMapsを呼び出そうとするとエラーが表示されます。
今回のケースのように、どうしてもエントリー記事内にJavascriptを記述する必要がある場合が出てくるでしょう。
そのときは、<body>タグ内のJavascriptはfunction化します。
<body onload="onLoad()" onunload="GUnload()">というように、<body>タグのonloadでそのfunctionを呼び出します。
※ちなみにonunload="GUnload()"はIEのメモリリーク対策用だそうです。

■ブログのテンプレート
各テンプレートの<head>内に、Google API Keyのソースを記述します。
同時に、緯度と経度、ふきだしに表示させるテキストを引数で受け取るためのスクリプトを記述します。
こちらは外部ファイル化したほうがスマートですが、説明を簡素化するため<head>タグ内に記述します。
引数lat、lon、lotに緯度・経度・文字テキストを受け渡します。
上記で記載の<body>タグのonloadを忘れずに!

<script src="http://maps.google.com/maps?file=api&v=2&key=あなたのKey" type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
function load(lat,lon,lot) {
  if (GBrowserIsCompatible()) {
    var map = new GMap(document.getElementById("map"));
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
    map.centerAndZoom(new GPoint(lon,lat), 2);
    var point = new GPoint(lon,lat);
    var marker = new GMarker(point);
    map.addOverlay(marker);
    var offset = new GSize(0, -20);
    map.openInfoWindow(map.getCenterLatLng(),
    document.createTextNode(lot),offset);
  }
}
//]]>
</script>

■エントリー記事の記述例
ブログのエントリー記事内のGoogleMapsを表示させたい箇所に下記のように記述します。

<div id="map" style="width: 400px; height: 300px"></div>
<script type="text/javascript">
function onLoad() {
load(34.675813, 135.5037,"ハートンホテル南船場");
}
</script>

■実施の埋め込み例
2007年10月6日修正。実際の埋め込み例を削除しました。
理由はいちいちgoogleにアクセスして、ページが重くなるからです。

「Google Mapsの埋め込み(その2)」の記事を参照

このアーカイブについて

このページには、過去に書かれたブログ記事のうちAjax & Javascriptカテゴリに属しているものが含まれています。

前のカテゴリはAdobe AIRです。

次のカテゴリはAptanaです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。