2005年9月19日月曜日

onload時に複数のfunctionを実行するJavaScript

昨日に引き続きJavaScriptねたです。
ページを表示した時点でJavaScriptを実行したい場合、
>

window.onload=function(){ alert('called when window is loaded.'); }
<
のようにwindowオブジェクトのonloadイベントに実行したいfunctionをセットしてやればいいのですが、これだと、オンロード時にひとつのfunctionしか実行できません。
そこで、オンロード時に複数のfunctionを実行できるようなスクリプトを書いてみました。今回のコードはnaoyaさんのprototype.js でデザインパターン - IteratorのエントリにあるIteratorパターンのコードをそのまま借りたリスペクト指向プログラミングになってますw

>

//multiple_onload.js
var OnloadFunction = Class.create();
OnloadFunction.prototype = {
initialize : function(func) {
this.func = func;
},
getFunc : function() {
return this.func;
}
};

var OnloadFunctions = Class.create();
OnloadFunctions.prototype = {
initialize : function() {
this.last = 0;
this.functions = new Array();
},
getFunctionAt : function(index) {
return this.functions[index];
},
appendFunction : function(func) {
this.functions[this.last] = func;
this.last++;
},
getLength : function() {
return this.last;
},
iterator : function() {
return new OnloadFunctionIterator(this);
}
}

var OnloadFunctionIterator = Class.create();
OnloadFunctionIterator.prototype = {
initialize : function(functions) {
this.functions = functions;
this.index = 0;
},
hasNext : function () {
return this.index < this.functions.getLength();
},
next : function() {
return this.functions.getFunctionAt(this.index++);
}
}

var onloadFunctions = new OnloadFunctions();

function multipleOnload () {
var it = onloadFunctions.iterator();
while (it.hasNext()){
var func = it.next();
func.func();
}
}

window.onload = multipleOnload;

<

使用方法はこんな感じです。
動作させるにはprototype.jsが必要なので最初にインクルードしています。

>


<html>
<head>
<script type="text/javascript" src="/js/prototype-1.3.1.js" ></script>
<script type="text/javascript" src="/js/multiple_onload.js" ></script>
<script type="text/javascript">
functon foo() {alert('foo');}
functon bar() {alert('bar');}
functon baz() {alert('baz');}

onloadFunctions.appendFunction(new OnloadFunction(foo) );
onloadFunctions.appendFunction(new OnloadFunction(bar) );
onloadFunctions.appendFunction(new OnloadFunction(baz) );
</script>
</head>
<body>
...
</body>
</html>

<
まず、multiple_onload.jsをインクルードしておきます。そして、定義したfunctionをappendFunctionメソッドを使ってセットしておきます。
これでfoo,bar,bazがオンロード時に順番に実行されます。


2005年9月18日日曜日

画像のスワップをクラス名で制御するJavaScript(プリロード付き)

ちょっとJavaScriptをまじめに勉強しようかと思い始めました。
というわけで、手始めにマウスオーバーすると別画像に切り替わるスクリプトを書いてみました。
マウスオーバーで画像が切り替わるなんて、Dreamweaver使えばJavaScriptを知らなくてもできてしまうんですが、Dreameweaverが吐き出すコードはHTMLタグの中にonload="xxxxxxxx"とか、onmouseover="xxxxx"をやたらと追加して、非常に見づらいのです。
これだとテキストエディタでちょろっとHTMLを編集したい時に大変ですし、きっとGoogleさんもクロールしにくいでしょうから、imgタグに予めスワップ用に設定しておいたクラス名を記述しておけば、マウスオーバー、マウスアウトで画像が切り替わるようにしてみました。

作成したスクリプトはこんな感じです。クラス名から要素を取得するところはprototype.jsから借りてきました。

>

// swap_image.js
var imagesNormal = new Object();
var imagesHilite = new Object();

function SwapImage (name,normalSrc,hiliteSrc) {
this.name = name;
this.normalSrc = normalSrc;
this.hiliteSrc = hiliteSrc;
}

function setupSwapImages(swapImages) {
preloadSwapImages(swapImages);
setupSwapEvent(swapImages);
}


function preloadSwapImages (a) {
for (var i=0; i < a.length; i++){
imagesNormal[a[i].name] = new Image();
imagesNormal[a[i].name].src = a[i].normalSrc;
imagesHilite[a[i].name] = new Image();
imagesHilite[a[i].name].src = a[i].hiliteSrc;
}
}

function setupSwapEvent (a) {
for (var i=0; i<a.length; i++){
var images = getElementsByClassName(a[i].name);
for (var j=0; j<images.length; j++){
var image = images[j];
if (image.getAttribute("src")){
image.onmouseover = function () {swapImage( this, "hilite" );}
image.onmouseout = function () {swapImage( this, "normal" );}
}
}
}
}

// 2006-05-15追記
function swapImage(image,type){
if (type=="hilite") {
image.src = imagesHilite[image.className].src;
} else if (type=="normal") {
image.src = imagesNormal[image.className].src;
}
}
// 追記ここまで(こぴぺしわすれ・・。)

// copied from prototype.js v1.3.1
// http://prototype.conio.net/
function getElementsByClassName (className) {
var children = document.getElementsByTagName('*') || document.all;
var elements = new Array();

for (var i = 0; i < children.length; i++) {
var child = children[i];
var classNames = child.className.split(' ');
for (var j = 0; j < classNames.length; j++) {
if (classNames[j] == className) {
elements.push(child);
break;
}
}
}

return elements;
}
<

実際の使用例はこんな感じです。クラス名により画像のスワップを制御するようにすることで、HTMLがすっきりしました。さらにhead要素内のscriptタグを削除してもValidなHTMLのままってところもいいですよね。

>


<html>
<head>
<script type="text/javascript" src="/js/swap_image.js" ></script>
<script type="text/javascript">

var swapImages = [
new SwapImage('class01','/images/foo.gif', '/images/foo_onmouse.gif'),
new SwapImage('class02','/images/bar.gif', '/images/bar_onmouse.gif'),
new SwapImage('class03','/images/baz.gif', '/images/baz_onmouse.gif')
];

window.onload = function () {setupSwapImages(swapImages);};
</script>
</head>
<body>

<img src="/images/foo.gif" class="class01" />
<img src="/images/bar.gif" class="class02" />
<img src="/images/baz.gif" class="class03" />

</body>
</html>
<



2005年9月15日木曜日

Sledge::Dispatcherリリース

Sledge用のmod_perlハンドラSledge::Dispatcherがリリースされたみたいです。

トリガのCGIファイルを作らないですむのはかなり便利ですね。
もうひとつ僕がいいなーとおもったのは、URLからPages内のdispatchメソッドがどこにあるかわかりやすくなるなーという点。

トリガのCGIファイルを使う場合、CGIファイル内に呼び出すPagesクラスを記述するのですが、Pagesクラスならどのクラスも
呼べるので、適当に設計して作っていると、URLとPagesクラスが対応しなくなっちゃうときがあるんです。特に僕はちょっと考えたら、
まず手を動かしちゃう人なので、うまく対応しなくなってCGIファイルを編集しなおしなんてことをよくやっちゃいます。

なので、dispatchメソッドを書いた時点でURLが決定するSledge::Dispatcherはかなりイイ!と思いました。

via: #!shebang.jp:Sledge::Dispatcher





Google Blog Search 突然リリース

Googleのブログ検索が突然リリースされたようです。

Google Blog Search

ブログ検索もGoogleがすべて持っていってしまうのか、今後に注目です。



2005年9月12日月曜日

Class::DBI 3.0.1の中身は0.96

MFPMのRecent MailでClass::DBIが3.0.1にバージョンアップしたことを知りました。

search.cpan.org: Tony Bowden / Class-DBI-3.0.1

早速何が変わったのかChangesを見てみると、、

>

3.0.1 UNRELEASED

- Code is identical to 0.96
- New section added to documentation on Release Philosophy
- Replace eq_set with is_deeply in t/04 to work around Test::More bug

3.0.0 UNRELEASED

- IDENTICAL to 0.96. Only difference is version renumbering.
<

ということで、中身は0.96と同じで、バージョンを付け直しただけみたいです。
これから大きなバージョンアップを行う下準備というところでしょうか。



2005年9月3日土曜日

オフィス崩壊

会社倒産とかそういうことではありませんw


[Vcube][解体]
壁撤去3
created by horiuchi.


会議室の数を増やすため、オフィスの解体工事が始まりました。
今まで1つだった会議室が週明けには5つに増えることになります。



>





撤去完了


Originally uploaded by horiyasu.

<

壁の撤去にかかった時間は30分くらい。あっという間になくなってしまいました。




2005年9月1日木曜日

ぐっさんのムービーブログがスタートしました。

OCNムービーブログの第2弾、ぐっさんこと山口智充さんによる「ぐっさん部屋 > 山口智充ムービーブログ 15秒のドウガ」が本日スタートしました。

初回からかなり体を張ったムービーになってますw


ちなみに相武紗季さんのときと同じく、ムービーティッカーも同時に提供しています。
実際に貼り付けるとこんな感じ。


貼り付け用のHTMLはこちらから取得できます。