IEでXMLHttpRequestを使えるようにする

もうあんまり需要無いような気もするけど。
IEで「new XMLHttpRequest」と書けるようにするラッパを書いてみた。

XMLHttpRequest for IE
http://la.ma.la/misc/js/ie_xmlhttp.html

結構前にIE7(JavaScriptの方)の人が似たようなのを作ってたのですが、
http://dean.edwards.name/weblog/2004/11/ie7-xml-extras/

ふつうに使う分にはこれでも問題はないです。

if(typeof ActiveXObject == "function" && typeof XMLHttpRequest == "undefined"){
    XMLHttpRequest = function(){
        return new ActiveXObject("Microsoft.XMLHTTP")
    }
}


IEでXMLHttpRequestが未定義だったら、XMLHTTPオブジェクトを返すコンストラクタを定義してやる。
これだけでいい。ただ、これだとXMLHttpRequest.prototypeをいじったりすることができない。
IEのActiveXObjectっていうのはちょっと特殊で、メソッドなんかがJavaScriptのfunctionではない。

var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
alert(typeof xmlhttp.open); // unknown


こうなる。xmlhttp.openはfunctionではなくて謎オブジェクト。
FirefoxやOperaのXMLHttpRequest#openは、ちゃんとfunctionになっているのだが、
IEの場合は関数ではないので、関数型言語としてのJavaScriptの機能が使えない。

----

XMLHttpRequest for IEは何なのかというと、
IEでもXMLHttpRequestのメソッドをfunctionオブジェクトとして扱うことができるようになるラッパです。
あとついでにonloadイベントハンドラを定義してあるので記述が楽になります。

functionalでアスペクト指向なコードを書く際に、役に立ちますが、
functionalでアスペクト指向なコードを書かない場合は書き方が共通になって嬉しい程度で、
その辺はすでにprototype.jsとかあるので大してメリットはないと思われる。

ものすごくシンプルな例はこんな感じ。

var XP = XMLHttpRequest.prototype;
XP.open_old = XP.open;
XP.open = function(){
    alert("open called!");
    return this.open_old.apply(this,arguments)
}


XMLHttpRequest.prototypeを書き換えてやることで、通信をトレースできるようにしたり、機能を拡張したり制限を加えたりすることができるようになる。もちろんクロスブラウザで動く(safariは知らないけど)。

例えば、通信するときには必ず前回のリクエストから1秒のウェイトを入れるようにする、とか、
デバッグ用に通信状態をステータスバーに流すとか、
他ドメインのURLを開こうとした場合はプロキシCGI経由のリクエストにするとか、
UserAgentを強制的に書き換えるとか、キャッシュが利かないようにユニークなURLにするとか。

全般にわたる振る舞いを効率的に記述することができるようになる。
----

工夫したのはこのあたり。

var methods = "open,abort,send,setRequestHeader,getResponseHeader,getAllResponseHeaders".split(",");
var make_method = function(name){
    XMLHttpRequest.prototype[name] = function(){
        var params = new Array(arguments.length);
        for(var i=0;i<params.length;i++) params[i] = "_"+i;
        return Function(
            params.join(","),
            ["return this.__request__.",name,"(",params.join(","),")"].join("")
        ).apply(this,arguments);
    }
};
for(var i=0;i<methods.length;i++) make_method(methods[i]);

本来のXMLHTTPオブジェクトをthis.__request__に保存していて、
引数の数に応じて関数を動的に生成して、本来のXMLHTTPオブジェクトに処理を丸投げする。

this.open("GET",url)
→(function(_1,_2){this.__request__.open(_1,_2)}).apply(this,arguments)

this.open("GET",url,async)
→(function(_1,_2,_3){this.__request__.open(_1,_2,_3)}).apply(this,arguments)

this.open("GET",url,async,user,pass)
→(function(_1,_2,_3,_4,_5){this.__request__.open(_1,_2,_3,_4,_5)}).apply(this,arguments)

こんな具合に変換される。

ふつうにラッパーを書くときは、
function wrapper(){
    return original.apply(this,arguments)
}

こんな具合にやるんだけど、オリジナルのxmlhttp.openは上記のとおり、そもそも関数ではないのでxmlhttp.open.applyが存在しない。
eval使わないと無理かな、とも思ったんだけどFunctionコンストラクタ使うときれいに書けた。

Functionコンストラクタは文字列から関数を生成する。
add = new Function("a","b","return a+b");
そして、こう書いてもOK。
add = new Function("a,b","return a+b");

これはJavaScriptの方言ではなくてちゃんとECMA準拠。
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/15-3_Function_Objects.html#section-15.3.2.1

まあ、あんまり使わないと思うんだけど。


WriteBacks

配布ライセンスについて

いつも参考にさせていただいています。
今回の物もなるほどと言う感じです。
ところで、このie_xmlhttp.jsのライセンスなのですが、LGPLやBSDライセンスにしたりしませんか?
というのは、PHPなどで動的にie_xmlhttp.jsを使うJavaScriptコードを吐いている物があった場合、PHPコードにもGPLを適用しないといけない可能性があるかもしれないからです(GPLライセンスについてはまだ理解不足であるので、そうならないかもしれないのですが)。
商用のプログラムを作っている場合、セキュリティー確保などの関係でPHPコードを公開できないことがあり、その場合ie_xmlhttp.jsがつかえなくなり、せっかくの素晴らしい成果物が利用できないのはすごく残念なのですが。
よろしかったらですが、ライセンスの変更の方を検討していただけると助かります。

Posted by katz at 2005/09/27 (Tue) 01:38:10

XMLHttpRequest

【Ajax】prototype.jsのXMLHttpRequest Opera 9&#39;s XMLHttpRequest #2 d.aql - XMLHttpRequestとリクエストヘッダ 【仕様】W3C 草案UPDATE The XMLHttpRequest Object Opera 9&#39;s XMLHttpRequest ふぁっきん not well-formed, XMLHttpRequest とかで MTでAjax!!〜XML

Posted by XMLHttpRequest at 2006/08/18 (Fri) 15:56:54

Is very interesting craps roulette [url=http://xoomer.alice.it/casq/craps-roulette/]craps roulette[/url] http://xoomer.alice.it/casq/craps-roulette/

Posted by John at 2006/10/04 (Wed) 09:10:28

Hi, nice site! aladdin resort and casino [url=http://xoomer.alice.it/burka/aladdin-resort-and-casino/]aladdin resort and casino[/url] http://xoomer.alice.it/burka/aladdin-resort-and-casino/

Posted by John at 2006/10/04 (Wed) 16:49:25

Interesting site seneca casino [url=http://xoomer.alice.it/burka/seneca-casino/]seneca casino[/url] http://xoomer.alice.it/burka/seneca-casino/

Posted by Lori at 2006/10/05 (Thu) 08:22:07

Very nice site shreveport casino [url=http://xoomer.alice.it/burka/shreveport-casino/]shreveport casino[/url] http://xoomer.alice.it/burka/shreveport-casino/

Posted by Ada at 2006/10/05 (Thu) 14:30:48

Exciting website. casino party [url=http://xoomer.alice.it/burka/casino-party/]casino party[/url] http://xoomer.alice.it/burka/casino-party/

Posted by Joshua at 2006/10/05 (Thu) 20:02:54

Exciting website. foreclosure
http://accountingmontreal.com

Posted by Alt6on at 2006/10/31 (Tue) 23:15:16

Exciting website. foreclosure
http://accountingmontreal.com

Posted by Alt6on at 2006/11/01 (Wed) 01:52:01

Good Luck! http://megamozg.com/online-trading/map.html

Posted by John at 2006/11/11 (Sat) 08:57:17

Great work on website. http://megamozg.com/travel-insurance/map.html

Posted by Jasmine at 2006/11/11 (Sat) 10:49:15

Hi, nice site! http://megamozg.com/homeowners-insurance/map.html

Posted by Anthony at 2006/11/11 (Sat) 12:40:51

VERY GOOD I THINK http://megamozg.com/need-money/map.html

Posted by Maureen at 2006/11/11 (Sat) 14:39:24

Thanks for taking http://megamozg.com/bachelor-degree/map.html

Posted by Daniel at 2006/11/11 (Sat) 16:31:01

Is very interesting http://wwwwtahoo.com/canon-inkjet-printer-cartridge/

Posted by Carol at 2006/11/15 (Wed) 20:54:55

Very useful http://wwwwtahoo.com/caribbean-stud-poker-game/

Posted by Ada at 2006/11/15 (Wed) 22:42:12

Your hard work paid off http://wwwwtahoo.com/horse-racing-wager/

Posted by Lori at 2006/11/16 (Thu) 00:35:38

annuncio lavoro

Blog Records:tireur isol辿 de 50 caloriesComments...

Posted by annuncio lavoro at 2006/11/27 (Mon) 19:42:01

annuncio lavoro

Blog Records:tireur isol辿 de 50 caloriesComments...

Posted by annuncio lavoro at 2006/11/27 (Mon) 19:42:09

Good site

wallmart
lemon detox diet
kohls department store
coach handbag outlet
royal caribean cruises
atkins diet negative
dj cammy
al4a
diana death crash photo
skimpy bikini
艢鞐瘤鴈蒂獺驟鱶 蓁鱚齏纈

Posted by boss at 2006/12/30 (Sat) 12:19:43

Good site

wallmart
lemon detox diet
kohls department store
coach handbag outlet
royal caribean cruises
atkins diet negative
dj cammy
al4a
diana death crash photo
skimpy bikini
艢鞐瘤鴈蒂獺驟鱶 蓁鱚齏纈

Posted by boss at 2006/12/30 (Sat) 20:54:06

Good site

wallmart
lemon detox diet
kohls department store
coach handbag outlet
royal caribean cruises
atkins diet negative
dj cammy
al4a
diana death crash photo
skimpy bikini
艢鞐瘤鴈蒂獺驟鱶 蓁鱚齏纈

Posted by boss at 2006/12/31 (Sun) 10:54:07

Posted by at 2006/12/31 (Sun) 17:11:20

Posted by at 2007/04/17 (Tue) 17:11:38

louboutin pas cher

Argor Heraeus lingots d'or Argor, qui vient louboutin soldes de Argen (Argent) et louboutin pas cher Oro (Gold) a ouvert sa raffinerie en 1951 à Chiasso, Suisse. En 1973, la Union Bank of Switzerland a repris la raffinerie. En 1986, Heraeus a commencé un nouveau partenariat, avec l'Un chaussures christian louboutin i

Posted by louboutin soldes Switzerland by zv at 2015/01/21 (Wed) 19:26:32

chaussures christian louboutin

Automatique ou manuelle 1) Est-il vrai si tout le monde util louboutin soldes ise Manuel et que vous utilisez automatique, alo chaussures christian louboutin rs vous avez un avantage, à moins que la personne est vraiment bon à l'aide Manuel? (Mais probablement vous ne voulez pas avoir besoin d'être louboutin pas cher

Posted by louboutin soldes then you have an advantage by sx at 2015/01/21 (Wed) 19:27:46

louboutin pas cher

Secrets Marketing Attraction Quand les gens se chaussures christian louboutin joignent à une société de marketing de réseau, ils se concentr louboutin soldes ent sur l'aspect de la mise en réseau de l'entreprise, mais ignorent la partie marketing. La plupart des gens ne savent pas comment le march louboutin pas cher é

Posted by chaussures christian louboutin by ys at 2015/01/21 (Wed) 19:28:55

hogan outlet

Clean Sla scarpe hogan te,scarpe hogan,louboutin pas cher

Don抰 be d louboutin pas cher eceive by what is written in some lame ass Chinese magazines or even the review. It抯 a slow, low-budget, more towards 揹ocumentary?kind of show. There抯 a lot Louboutin Pas Cher of long focuses on people at vending

Posted by Louboutin Pas Cher louboutin pas cher Clean Slate by tr by zj at 2015/05/21 (Thu) 19:52:46
TrackBack ping me at
http://la.ma.la/blog/diary_200509031529.trackback
Post a comment

writeback message: Ready to post a comment.







spam yoke. nanimo ireruna.