著作一覧 |
とは言うもののちょっとやってみたくなってやってみてしくじった。
最初考えたのは非同期にGIFを取り込み続ければ割りとさくさくうごくんじゃないかってことで、でimgのonlickかonmouseoverででかくする(というか、divを2つ用意して1つはサムネイル用の固定サイズでblock、1つは実際の大きさでinvisibleでblockのほうのonmouseoverでblockにしてクリックで再度invisibleっていうinamodeみたいなやつ)というのを考えた。(追記:しかし考えてみるまでもなくimgタグってHTMLのレンダリングとは非同期に4コネクションくらい利用して処理してるからやろうとしてることはとっくのむかしに実装されているということだったり)
が、いつもここで失敗する(ってことは何度目かだ)。
(手元にコードが無いのでうろ覚えだからそのままでは動かない) var imgs = new Array(); function open(http, index) { var name = "img" + index; http.open("GET", "....img" + index + ".gif", true); http.get(); http.attachstatechange = function() { if (http.asyncState == 4) { imgs(index) = http.responseBody; document.all(name).src = "javascript:imgs(" + index + ");"; index = next_index(index); if (index < 0) return; open(http, index); } } } function start_fetch(index) { var http = new ActiveXObject("MSXML.XMLHTTP"); open(http, index); } function start() { for (i = 0; i < 219; i++) { // 実際はもっと複雑 html += "<img name=\"img" + i + ";\"/>"; } document.all("imgs").innerHTML = html; for (i = 0; i < 4; i++) { start_fetch(i); } }
何をしくったかといえば、img src="javascript:xx"としておいて、xx = http.responseBody;としてイメージを突っ込もうとしたところ。
src="javascript:変数"ではXBMしかサポートしてないらしい。
そして、既にご存知のようにdata:には制限がある(まったく動かないか、または約2K以内。まだ確認してないんだが)のでそれも利用できない。
つまり、せっかく非同期にイメージデータを取り込んでもなんの役にも立たない。(追記:っていうか、そもそもバイナリを正しく取り込んでるんだろうか? 妙なUTF-8変換とかされてたりして……)
運が良ければXMLHttpRequestの結果がIEのキャッシュに入ってそれが利用できるかも知れない(img src=のURLをステートが4になった時点で設定すれば)が、スニファしながら観察したところリクエストをやり直しているように見えた(要確認。うんざりしてたのでまじめに見てないから、100%の確信は持てない)。
それにつけてもdata:でもjavascript:でもどっちでも良いけどどうにかしてimg.srcにデータを送り込めないものか。……mimetypeのプロパティを設定してから変数に値を突っ込むってのは試してなかったから、そっちをやってみるかな?
追記:いろいろめんどうそうだ。JavaScriptとIMGのブックマーク
そりゃ、クロージャをstateChangeイベントハンドラとして設定するところだ。あそこでのhttpという変数は実際には4インスタンスがそれぞれで利用できる。複数のインスタンスを利用したい場合に配列を使ったりしてインスタンスを区別する必要がないってのは良いことだ。
MSDNのサンプルだと静的に定義したfunctionを設定する例(Cでの関数ポインタの利用のようなものだ)しか出ていないから複数のXMLHTTPを利用する場合、どうやってXMLHTTPのインスタンスを区別するか方法が見えない(クロージャ以外のやり方、多分プロパティを利用すれば良いと思うが)。あと、VBScriptだとAddressOfを使うしか方法がないからやはり相当に工夫が必要なんじゃないかな。
世界中でこれが求められていたのかも(台湾発らしいというかなんだあのリンクは?)。でも、IEのurlmonとレンダラを使うわけだから(しかもインストールしてあるわけだし)、なぜ、IEを素で使わんのかと? つまるところFirefoxを使っているといいたいだけでは。という実利的な視点とは別に、これ相当なハックだと見た。
This extension is derived from the famous extension IE View, but they are quite different.
While IE View always open IE-only pages in newly launched windows of Internet Explorer, IE Tab can open them in tabs of Mozilla/Firefox.
via ― Kickstart my heart.
(追記:良く考えたら上のblockquoteは変だな。MSHTMLをOCXとして利用する手段は提供されている。IE Viewってなんだかは知らないけど。MozillaのタブをActiveXコントロールホストとして実装したということなんだろう)
ジェズイットを見習え |
IE Viewも拡張機能なのですが,こちらはおとなしく「このページをIEで見る」というメニューがFirefoxの右クリックメニューに追加されるものです。選ぶとIEが起動します。けっこう便利。
あ、famous extensionってそういう意味だったんですか。なるほど、確かに便利かも。