Home arrow Blog arrow GreyBox

5月
24
2008

GreyBoxが動かない: GreyBox Show plugin

diggに追加!

GreyBoxが動かないことでの説明は、簡単ですが以前にもしていますが、あらためておさらいします。

動かない原因のほとんどが、window.onloadイベントを上書きしてしまっていることが原因です。それは、GreyBoxに限らず、multiboxでもlightboxでも上書きしてしまったら結果は同じです。

まず、winodow.onloadについてとてもわかりやすくどう書いていると動かなくなるのかを説明されているサイトがありましたのでご覧ください。

イベントに処理を追加する

後で追加されるwindow.onloadイベントの追加方法が、すでに追加されているイベントを上書きするような追加方法で記述されていると、GreyBoxのwindow.onloadイベントが実行されません。GreyBoxでは、AJSというJavascriptライブラリを使っておりAJSライブラリで用意されているonloadイベント追加メソッドは、

AJS.AEV(window, 'load', .....);

です。

例えば、GreyBoxのライブラリを読み込んだ上で下記のようなコードを書いてみます。

例:1

<script type="text/javascript">
window.onload = function(){
	alert('before AJS');
}
AJS.AEV(window, 'load', function() {
      GB_show("Hello world", "http://google.com");
 });

</script>
</head>
<body onload="alert('body');">
<script type="text/javascript">
window.onload = function(){
	alert('after AJS');
}
</script>

実行結果は、"after AJS"のみ表示されるだけです。では、少し変更してみます。

例:2

<script type="text/javascript">
window.onload = function(){
	alert('before AJS');
}
AJS.AEV(window, 'load', function() {
      GB_show("Hello world", "http://google.com");
 });

</script>
</head>
<body onload="alert('body');">
<script type="text/javascript">
//window.onload = function(){
//	alert('after AJS');
//}
</script>

最後のwindow.onloadをコメントアウトして実行すると、"body"と表示されるだけです。また、少し変更してみます。

例:3

<script type="text/javascript">
window.onload = function(){
	alert('before AJS');
}
AJS.AEV(window, 'load', function() {
      GB_show("Hello world", "http://google.com");
 });

</script>
</head>
<body>
<script type="text/javascript">
//window.onload = function(){
//	alert('after AJS');
//}
</script>

さらにbody部のonloadを消して実行すると、"before AJS"と表示され、GoogleのページがGreyBoxによって表示されます。

Joomla!でヘッドタグにGreyBoxライブラリのScriptタグが書き込まれるタイミングは、テンプレートに依存しており、また大抵headタグ開始直後に書き込まれるようになっていると思います。とすれば、後から書かれるJavascriptの影響を受けるのは当然です。その後から書かれているonloadイベントがイベント追加タイプでなかったらたとえGreyBoxで無くてもonloadイベントは消失してしまうので注意しなければなりません。

では、どのように対策すれば良いのか。

たとえば、例:1の場合以下のように書き換えます。

<script type="text/javascript">
window.onload = function(){
	alert('before call AJS');
}
AJS.AEV(window, 'load', function() {
      GB_show("Hello world", "http://google.com");
 });
</script>
</head>
<body>
<script type="text/javascript">
AJS.AEV(window, 'load', function(){
	alert('body');
});
AJS.AEV(window, 'load', function(){
	alert('after AJS');
});
</script>

これですべてのonloadイベントが実行されます。

もっと簡略に書くと

<script type="text/javascript">
AJS.AEV(window, 'load', function() {
	alert('after AJS');
	alert('body');
	GB_show("Hello world", "http://google.com");
	alert('before call AJS');
});
</script>
</head>
<body>

このようにも書けます。イベントの順番が異なりますがそれは実行してみればわかります。

これは、GreyBoxに限らず、Javascriptを使用する以上避けては通れません。onloadイベントを追加する場合は、必ず先に登録されているイベントがあることを考慮し、イベントを追加するようにコードを書かなければなりません。Javascriptライブラリを使用されている場合はそれが考慮されていることが多いですが中には考慮されていない物もあるので注意が必要です。その時はそのライブラリの書式にしたがってonloadイベントの登録をするか、最初に紹介させていただいたサイトで説明されているような関数を独自に使用して登録しなければなりません。

特定のJavascriptライブラリに依存していないJoomla!を使用しているなら、独自関数をお薦めします。それは、そのサイトが特定のライブラリに依存しているならそのライブラリのものを使用すれば良いと思いますが、独自関数であればどのライブラリにも依存しないから例えライブラリが、ロードされていなくても実行されるからです。Joomla!1.5では、デフォルトでmootoolsをサポートしているのでそのライブラリを使用するようにすることが、親切かもしれません。(これは開発者またはテンプレート作成者に対してです。)また、そのためのメソッドも備えているようです。

Joomla!では、手軽にサードパーティーのエクステンションを利用できるので便利なのですが、JavascriptやPHPコードは限られた環境でのみ動作する物かもしれません。私もつい先日Fireboardを表示するとJavascriptが動かなくなったので調べたらFireboardは、JQueryを使っているんですね。multiboxと干渉していて気づきましたが、他のライブラリの使用を考慮した書き方をされているようで一行付け加えるだけで動作しました。最初からその一行を書いておいて欲しかったですが・・・。私も気をつけねばなりませんね。

開発・テスト中のCombineコンポーネントでは、開発者にやさしいメソッドを提供しています。onloadイベントをCombineがサポートしているのでそこに書き加えるだけで一括でonloadイベントが書き出されます。サポートしているライブラリは、mootools, Prototype, JQuery, Originalです。メリットは、干渉が無い・ソースが綺麗になることです。

次回は他のライブラリでのonloadを書いてみます。

 

Related Articles

テンプレートを変更してみました
最初に・・・ トップページでリンクさせていただいていたサイトをトップメニューからのリンクページに変更させていただきましたのでこの場を借りてお断りいたします。   新しいエクステンション...
GreyBoxが動かない(2) : GreyBox Show Plugin
前記事でGreyBoxが使っているJavascrptライブラリであるAJSライブラリでのwindow.onloadを書きました。 続いて他のJavascriptライブラリでのwindow.onloa...
XMLで再びはまる
今、テスト中のGreyBoxプラグインを編集していてまた、XMLファイルではまりました。何もしてないはずなんだけど、インストールできない。「またか!」と、XMLエディタを起動しようと思ったら...
80codeでのJoomla!
このサイトを置いている80codeサーバーでは通常のJoomla!のデフォルトの設定では正しく動きません。 異なる点 (私の場合だけのものもあるかもしれない。) htaccessは使...
Joomla!1.5.5がリリースされました : Joomla!1.5
おおきな変更は無さそうですが、様々なバグ修正が行われています。 このサイトで公開しているエクステンションには影響はなさそうです。   先日書いたタイトルがダブるというのも修正され...
コンテンツを分けないと:Joomler!.net
自分で見ていてもうちのサイトって見づらい。 昨日もエクステンションのインストール方法はどこに書いてあるのかと質問がメールで来ていて、自分で自分のサイトを探しましたよ。 「確か書いたよなぁ~。」っと...
MovableType XML-RPCを一部アップデートしました
今回は、Joomla!1.0.13用のEnglish版のみです。 環境は人によって異なるので面倒ですね。決まった環境で作成するのなら楽ですが・・・。今回は、ロシア語のサイトだと動かないと問い合わせが...
こうしてくれると解決が早い
エクステンションやJoomlaに問題があったとき、テストサイトを作ってもらえると解決が早いです。(問題の程度にもよりますので一概に言えませんけどね。)  先日問い合わせのあった方は、自らテストサイト...
blueprintという選択肢
CSS Framework Blueprintが0.4になってました。 Blueprint: A CSS Framework  このサイトのテンプレートはblueprintを使っています。ちゃんと指...
リボンをオンラインで作成
ページの端っこにリボンがかかっているのをよく見かけるのですが、オンラインで作成してくれるところがありました。 少しではあるかと思いますが、テンプレート作成の一助にいかが? ...
Joomla!での分岐処理
SnapCasa : サイトサムネイル & Joomla!1.5テンプレート
Firefox の アドオン
Windows Live Writerのナイスなプラグイン
バックエンドのテンプレート
サーバーを移転してみました : Joomler!.net
Joomla! 1.0.13 Demo
いろいろあるんですね。Theme:Ubuntu
Joomla!じゃぱんのフォーラムにやっとログインできた
Custom Login Module 1.0.0

joomler_kun_48.gif Blog
Joomler! Blog

for Mobile