jQuery と object タグの怪 (その2)

jQuery と object タグの怪 の続き。

コメントいただきました

コメント欄で id:coma2nid:coma2n さんのコメントを読んで Silverlight.js の存在を思い出した。

Silverlight.jsのヘルパー関数を使えってことなのかなー。ちょっと調べてみます。

Silverlight.js の存在を完全に忘れていたが、過去の自分が書いていた…。

silverlight.js は SDK インストール時に C:\Program Files\Microsoft SDKs\Silverlight\v2.0\Tools に展開されている。HTML で書くよりも細かな設定ができる印象だ。いくつかの付加機能も魅力的。Flash での swfobject みたいな感じ。

Silverlight 2 開発のバリエーション - てっく煮ブログ

そういえばそんなものがあったなぁ。

Silverlight.js を読む

で、さっそく読んでみた。

Oh! Obfuscated!!! 読めねー。

こういうときは、偉い人にソースを整形してもらう。なんでもいいんだけど、私は JsDecoder - javascript decoder - decode obfuscated script というのを使ってる。

出てきたコードがこんな感じ。

Silverlight.createObject = function (l, g, m, j, k, i, h)
{
    // 最初のほう省略
                slPluginHTML = Silverlight.buildHTML(b, a) ;
    // 間らへんも省略

        if (b.parentElement) {
            b.parentElement.innerHTML = slPluginHTML;
        }
        else {
            return slPluginHTML;
        }
    }
}

Silverlight.buildHTML = function (c, d)
{
    var a = [], e, i, g, f, h;
    if (Silverlight.ua.Browser == "Safari")
    {
        a.push("<embed ");
        e = "";
        i = " ";
        g = '="';
        f = '"';
        h = ' type="application/x-silverlight-2-b1"/>' + "<iframe style='visibility:hidden;height:0;width:0'/>"
    }
    else
    {
        a.push('<object type="application/x-silverlight-2-b1" data="data:application/x-silverlight-2-b1,"');
        e = ">";
        i = ' <param name="';
        g = '" value="';
        f = '" />';
        h = "</object>"
    }
    a.push(' id="' + c.id + '" width="' + c.width + '" height="' + c.height + '"

ってことで、Silverlight.js でも innerHTML 作戦で書いてるようだ。

どうでもいいんですが、Silverlight.js に次のようなコードを発見。

    if (window.addEventListener) {
        window.addEventListener("onunload", Silverlight.__cleanup, false);
    }
    else {
        window.attachEvent("onunload", Silverlight.__cleanup);
    }

誰のせいでこの if 文を…と思うと少し悲しくなった。もちろん、Silverlight.js を書いた人には罪はないんでしょうけど、切ないものがある。

(追記)コメント欄で教えてもらいました。http://code.msdn.microsoft.com/silverlightjs に難読化前のソースが公開されているようです。っきさん、ありがとうございます。

jQuery 1.3 系でも試してみた

次のようなツッコミが。ありがたや。

これ、1.3系では $('<tagname/>') とか $('<tagname>') の場合は

createElementでDOM要素を生成するように変更されましたな。

jQueryでのDOM要素生成 - 文殊堂

ソースを見たら本当だった。

ということで、1.3 系で動かしてみたがやっぱりエラー。

原因はこれか。

どうもDocumentFragmentを作ってそれに入れてから実際のオブジェクトに追加されるらしく、object要素にDocumentFragmentを突っ込もうとして死ということみたい。

object 要素に param 要素がはいらない - ういはるかぜの化学 - subtech

DocumentFragment ってよく知らんなぁ。勉強せねば。

今日のまとめ

  • Silverlight2.js も innerHTML で作成している
  • ブログに分からないことを書いたら色んな人が教えてくれてありがたい
  • ブログに書いておくとあとで思い出しやすい