prototype.js, IEではEventインスタンスがFirefoxと違っている

クリックをオブザーブしたハンドラに送られる Event インスタンスの中身が IE だけ微妙に違ってた。

HTML

<div id="thumbnail">
	<a href="images/image1.jpg" class="gallery"><img src="images/image1-thumb.jpg" alt="画像1" /></a>
	<a href="images/image2.jpg" class="gallery"><img src="images/image2-thumb.jpg" alt="画像2" /></a>
	<a href="images/image3.jpg" class="gallery"><img src="images/image3-thumb.jpg" alt="画像3" /></a>
</div>

Javascript

document.observe("dom:loaded",
	function (){$$('. gallery').each(
		function (element) {
			element.observe("click",clickHandler)
		})
	}
);
function clickHandler (event) {
	....
}

prototype.jsを使ってハンドラに送られた Event インスタンスを調べてみた。

Object.keys(event);
Object.values(event);

IE には Event インスタンスに currentTarget が存在しない。
また、 target は [objcect] になっておりその中身も [object HTMLImageElement] な Firefox などとは若干違っている。

希望は
currentTarget : a タグ
target : img タグ

IE は currentTarget が無いので a タグの DOM を取得するのにどうすんだろうが調べてみるきっかけ。
今回の script では a タグの href が必要だっただけなので無理矢理ごまかした。

IE, target.href プロパティ。
target(img)に本来は存在しない href プロパティがあった。
中身は img タグ src の値。

な〜んかへんなの。
多分、IEがやっちまってるのだろうと納得しておく。

update 2009-09-09
イベントを発生させた要素を取得するメソッドがありました。

event.element();

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください