またまた"Prototype.js"についてのちょっとしたメモ
下記のような簡単なスクリプトで

document.observe('dom:loaded', function(event) {
    var item = new Image();
    item.src = 'image.jpg';
    $$('body')[0].insert(item);
    item.observe('click', function(event) {
        alert(event.element().src);
    });
});

SafariやFirefox、Operaでは問題なく写真をクリックしたときにイベントが実行される
ところがIEでは実行されない。ステータスバーにはエラーのアイコン。
メッセージを見てみると"item.observe('click', function(event){})"の部分が問題ありらしい
itemオブジェクトに対してうまくイベントが設定されないようだ。
これは下記のようにすればうまくいったりする。

document.observe('dom:loaded', function(event) {
    var item = new Image();
    item.src = 'images/small/IMG_08.jpg';
    $$('body')[0].insert(item);
    Event.observe(item, 'click', function(event) {
        alert(event.element().src);
    });
});

ただ単に'item.observe'としているか'Event.observe'としているかの違いだが、これは多分

var item = new Image();

この部分が原因なのだろう。
普段Prototype.jsを使っているとPrototype特有のメソッドなのか、Javascriptネイティブのメソッドなのか分からなくなってしまうがこの

new Image();

はJavascriptネイティブのメソッドだ。
そしてIE以外ではそれらから得たオブジェクトも'Prototype'による拡張がされているんだと思う。
ところがIEでだけその魔法(?)がかからずエラーになってしまう・・。という事なんだろう。
実際

var item = new Image();

の所を

var item = new Element('img');

と、するだけでうまくいくし、或いは

var item = new Image();

と、この状態のまま

$(item).observe('click', function(event) {});

と、$()で囲ってやるだけでもいい
似たような理由でIE以外だと

document.body.insert(elem);

はうまくいくがIEだと

$(document.body).insert(elem);
か
$$('body')[0].insert(elem);

こうしないと駄目だ

カテゴリ:

トラックバック(0)

トラックバックURL: http://blog.beanz-net.jp/beanz_mtos/mt-tb.cgi/78

コメントする