coldfusion 8から、coldfusion.ajax.submitFormという新しい関数が追加されて、同じような機能をもった関数を7でも実装できないかなーって思い、なんとなく作ってみました。
<CFFUNCTION name="XMLHTTPRequest"> <CFOUTPUT> <SCRIPT type="text/javascript"> function js_XMLHttpRequest(url,func,ahttpMethod,aasynch) { var httpObj = ""; var ret = ""; var httpMethod = "GET"; var asynch = true; /* quoted Prototype JavaScript framework, version 1.5.1.1 */ var Prototype = { Browser: { IE: !!(window.attachEvent && !window.opera), Opera: !!window.opera, WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1, Gecko: navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1 } }; if(ahttpMethod != null){ if(ahttpMethod.toUpperCase() == "POST"){ httpMethod = "POST"; } } if(aasynch != null){ if(aasynch == false){ asynch = false; } } if(Prototype.Browser.IE){ httpObj = new ActiveXObject("Msxml2.XMLHTTP"); httpObj.open(httpMethod,url,true); httpObj.onreadystatechange = function (){ if(httpObj.readyState == 4 && httpObj.status == 200){ ret = httpObj.responseText; func(ret); } }; }else{ httpObj = new XMLHttpRequest(); httpObj.open("GET",url,asynch); httpObj.onload = function(){ ret = httpObj.responseText; func(ret); }; } httpObj.send(null); } </SCRIPT> </CFOUTPUT> <CFSETTING SHOWDEBUGOUTPUT="no"> </CFFUNCTION> |
とまぁー、このような形で作成しました。
この関数をcfsetで関数を作り出し、後は、javascriptで関数を呼び出せば、オッケー♪
ちなみに、javascriptで呼び出すときは、こんな感じ。
<SCRIPT type="text/javascript"> var hoge = function(text){ ... } </SCRIPT> <A href="javascript:js_XMLHttpRequest('test.cfm',hoge)">Ajax呼び出し</A> |
js_XMLHttpRequestに関して、後二つ引数を追加することができて、一つ目は、送信方法。POSTかGETを選択することができて、デフォルトでは、GETになっています。
二つ目は、非同期か同期かを選択する変数で、デフォルトでは、非同期になっています。
うーん、8と比べて忠実に再現できなかったのは、最後、コールバック関数を呼び出すときに、ローカルでは無名関数を定義しないといけないところ。
8では、名前の入った関数を定義すれば、そこに値を返してくれたのですが。
まぁー、そこまででかい差ではないのですが。。。
この関数を使うことで、わざわざ、xmlHttpリクエストを投げるオブジェクトを作成しなくても、urlと関数名さえ指定すれば自動的に非同期でデータを取得できるところ。
せっかく作ったので、coldfusion-addonにもXMLHttpRequest_1.0.cfmとして、アップロードしました。
次は、設計書を作っていきたいと思います。
0 コメント:
コメントを投稿