Home arrow Extensions 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

サーバーを移転してみました : Joomler!.net
昨日、朝からまた、サイトにアクセスできなくなってしまっていたのですぐに障害報告が無いかチェックしたが、報告は何もないのでサポートに報告を入れた。しばらくしたら直るだろうとしばらく放置。時間をおいてアク...
バックエンドのテンプレート
管理画面のテンプレートってみなさん変更したりしていますか?複数のサイトをJoomla!を使って管理しているとどのサイトの管理画面かすぐにわかりませんよね。管理画面のテンプレートを変更してサイ...
いやあ~ほんとごめんなさい
joomlaeasy.netさんにご迷惑かけちゃいました。 私の勘違いで・・・ 「正常に動いているのに動いていないと思いこんでいました。」 てっきり画像がGreyBoxで表示されるものだと思いこんでし...
HTMLコードでモジュールを作成 : EarthShots.org
ブックマークを眺めていて(本当は整理しようと思っていたのだが、あまりにもずさんな登録方法なためあきらめた。)EarthShots.orgというサイトが登録されていた。ずっと以前だと思います。 ...
Firefox の アドオン
Firefoxのアドオンは、様々なものが公開されています。このサイトのブラウザ別上位は、1位がFirefoxでなんとほぼ50%の方がFirefoxで閲覧されているようです。2位は、IEで37...
80codeでのJoomla!
このサイトを置いている80codeサーバーでは通常のJoomla!のデフォルトの設定では正しく動きません。 異なる点 (私の場合だけのものもあるかもしれない。) htaccessは使...
GreyBoxが動かない(2) : GreyBox Show Plugin
前記事でGreyBoxが使っているJavascrptライブラリであるAJSライブラリでのwindow.onloadを書きました。 続いて他のJavascriptライブラリでのwindow.onloa...
Windows XPのClearType
Windows XPをお使いの方なら見たことがあると思う。Vistaは忘れました。 「画面のプロパティ」「デザイン」「効果」と、たどっていくと 「次の方法でスクリーンフォントの縁を滑らかにす...
GreyBox Show 1.0.1 : アップデートしました Update!!
GreyBox Show 1.0.1 for 1.0.x Joomla!のデフォルトサイトキャッシュがONの時は、自動で記事内にスクリプトコードを出力するようにしました。 キャッシュパラメータを付加...
ログアウトしたらログイン画面にもどる : Joomla!1.0.x Hack
Joomla!1.5では、管理画面からログアウトすると管理画面のログイン画面にリダイレクトします。ですが、Joomla!1.0.xではサイトトップに戻ってしまい、もう一度ログインしたい時などに不便を...
PagePeelが邪魔でGreyBoxが閉じられない
Joomla!1.5.5がリリースされました : Joomla!1.5
以前にご紹介したHttpLoggerに
このままいくとWEB上ですべて・・・?#02
Linux からも投稿できる ScribeFire
画像に合わせてテキストが・・・: CSS
テンプレートを更新しました
このままいくとWEB上ですべて・・・?#01
JBackupプラグインをアップデートしました : Joomla! JBackup Plugin
様々なブログエディタを試したみた

C_square_trans.png Components
Joomla! Extensions
M_square_trans.png Modules
Joomla! Extensions
P_square_trans.png Plugins
Joomla! Extensions
Templates
Joomla! Extensions
a_delphi.gif Delphi for PHP
Delphi for PHP related

for Mobile