| JavaScript++かも日記 |暫定版Ajax用ライブラリ |

暫定版Ajax用ライブラリ jslb_ajax の使い方メモ

Ajaxを利用する時に手間のかかる、ブラウザ間の違いや、日本語を扱う際に苦労するエン
コード処理等の問題をあらかじめ吸収してくれるように作ってあります。このライブラリを
使うと、送信(sendRequest関数)/受信(コールバック関数)の2工程だけで、すっきりとソー
スをかけるようになります。

ここでは、jslb_ajaxxxx.js簡易ライブラリの使い方について簡単に解説します。実際に使う
場合には、そのままでも使えますが、著作権表示義務無し、商用利用、改造、自由、連絡不要
ですので、自由に改造したり、カスタマイズしたり、部品取りしてもかまいませんが、これ
により、万が一問題が発生したとしても作者は責任を負えませんのでご了承ください。

最新版は、下記でメンテナンスされています。
http://jsgt.org/mt/archives/01/000409.html

最新版

  jslb_ajax0516_c.js→http://jsgt.org/lib/ajax/051/jslb_ajax0516_c.js.txt(圧縮版 1.91KB)
  jslb_ajax0516.js→http://jsgt.org/lib/ajax/051/jslb_ajax0516.js.txt(コメントあり10.1KB)

更新
UPDATE 2008.03.02  v0.516 sload時のdataの前に&抜け修正(Thanx 上原さん)。
UPDATE 2007.10.24  v0.515 uriEncodeの&処理を修正(Thanx su-さん) 他コードを少し整理。
UPDATE 2007.10.24  v0.515 uriEncodeの&処理を修正(Thanx su-さん) 他コードを少し整理。
UPDATE 2007.10.04  v0.514 強制ロードを修正 わずかに軽量化。
UPDATE 2007.10.03 v0.513 oj.open後外部コールバック呼出し後、oj.abort()しました(Thanx teさん)。
  これにより、open後のプロセスハンドルの増加を回避できます。
  (abortでojが無くなるわけではないので、もし外部コールバックが遅延してもoj.responseTextなどは受け取れます)

UPDATE 2007.03.31 ライブラリjslb_ajaxをv0.512にバージョンアップ。Safari2.04のUA表記に再度対処。(Thanx okuさん)
v0.512未満のバージョンでは、Safari2.0.4がブラウザ分岐で弾かれますので差し替えを推奨します。

UPDATE 2006.12.12 ライブラリjslb_ajaxをv0.511にバージョンアップ。Safari2.04のUA表記に対処。(Thanx okuさん)
v0.511未満のバージョンでは、Safari2.04がブラウザ分岐で弾かれますので差し替えを推奨します。

UPDATE 2006.11.15 内部のクオートをシングルに統一(Thanx Harukaさん)。.READMEの位置を修正。
  これによって、jslb_ajax051_c.jsでは、たとえば
  
    var ajaxLib="/*jslb_ajax051 2.651k @see http://js....";
    eval(ajaxLib);

  といった使い方が可能になります。

UPDATE 2006.2.24 軽量なコメント削除版jslb_ajax050_c.jsを作りました。  9.9kあったv050が2.6kになってます。
UPDATE 2006.02.17 v050にアップデートしました。

構成

ライブラリの基本的な構成は、次の通り3つの関数です。

1つは、動作可能なブラウザ判定で、もうひとつは、ブラウザに依存しない、XMLHttpRequest
オブジェクトを生成。そして、あと1つの関数には、送受信用のopen()やsend()、
onreadystatechangeなどメソッドやプロパティ、イベントハンドラ等にエンコードやHTTP
ヘッダなどの最低限の処置を加えてひとまとめにしてあります。

この、3つの関数を使えば、クロスブラウザで日本語を使える、最小限の基本的なAjax通信
を行えます。もっとも重要な関数はsendRequest()です。

	送受信関数
	関数 sendRequest()

	このライブラリを利用可能なブラウザかどうかを判定する() *ブラウザ判定を使いたい場合は利用できます
	関数chkAjaBrowser()

	XMLHttpRequestオブジェクト生成 *sendRequestの内部で自動使用
	関数 createHttpRequest() 
	
インクルード

JavaScriptの外部ファイルとして用意し、次のように、スクリプトタグでjsファイルのURL
を指定して、読み込んでください。文字コードはUTF-8で作成してありますので、Shift_JIS
やEUCなど他の文字コードのページで利用する場合にはcharset属性の指定も必須です。
(もちろん、インクルードせずに直接スクリプトをページ内に貼りこんでも利用できます。)

<script src = "./jslb_ajax.js" charset= "utf-8"></script>
リファレンス
関数 sendRequest() 書式 sendRequest(callback,data,method,url,async,sload,user,password) 説明 Ajaxな送受信を行います 引数 callback : コールバック関数。下記、function、object、arrayいずれかで指定できます。 Functionの場合 受信時に起動する関数
sendRequest( onloaded,'','GET','hoge.txt'); function onloaded (oj){alert(oj.responseText)}
Objectの場合 受信時に起動する関数onloadとヘッダ指定関数 onbeforsetheaderをオブジェクトで指定(v0.50以降)
sendRequest({ onload : function (oj){alert(oj.responseText)}, onbeforsetheader : function(){ oj.setRequestHeader("X-mysend","toshiro"); } },'','GET','hoge.txt');
Arrayの場合 受信時に起動する関数["onload"]と ヘッダ指定関数["onbeforsetheader"]を指定(v0.50以降)
var ary =[]; ary['onload']=function (oj){alert(oj.responseText)}; ary['onbeforsetheader']=function(oj){ oj.setRequestHeader('X-mysend','toshiro'); } sendRequest(ary,'','GET','test.txt',true,true);
data : 送信するデータ。下記、object、array、stringいずれかで指定できます。 Objectの場合 {名前1:値1,名前2:値2,...}(v0.50以降)
sendRequest( onloaded,{ data1 : 123 , data2 : 456 , data3 : 789 },'GET','hoge.txt');
Arrayの場合 ary["名前1"]=値1;ary["名前2"]=値2 (v0.50以降) Stringの場合 &名前=値&名前2=値2...の形式で渡します (*注意:data文字列内に「&」か「=」を含む場合は、 必ず上記objectかarrayで渡してください。) method : string HTTPリクエストメソッド "POST" or "GET" url : string リクエストするURL async : boolean (省略可)非同期ならtrue 同期ならfalse sload : boolean (省略可)スーパーロード trueで強制、省略またはfalseでデフォルトキャッシュ設定に従う user : string (省略可)認証ページ用ユーザー名 password : string (省略可)認証ページ用パスワード 戻値 XMLHttpRequestオブジェクトのインスタンス 例  test.txtを読み込んで、ファイルの中の文字列をダイアログ表示します。 上記のサンプルと同じ動作ですが、関数 sendRequest()を利用 することで、オブジェクト生成から、クロスブラウザ微調整やURIエンコード などを自動処置します。 この結果、送信(sendRequest)/受信(コールバック関数)の2工程だけで、 すっきりとソースをかけるようになります。 非同期の連続リクエストでも上書きされないようになっています。
<script type="text/javascript" src = "./jslb_ajax.js" charset= "utf-8"></script> <script type="text/javascript"> //送信 sendRequest(function(oj){alert(oj.responseText)},'&test=123','POST','./test.txt'); </script>
<script type="text/javascript" src = "./jslb_ajax.js" charset= "utf-8"></script> <script type="text/javascript"> //送信 sendRequest(onloaded,'','GET','./test.txt'); //受信時に動作するコールバック関数 function onloaded(oj){ alert(oj.responseText); } </script>
<script type="text/javascript" src = "./jslb_ajax.js" charset= "utf-8"></script> <script type="text/javascript"> //送信 第六引数trueは強制ロード(キャッシュ無視) sendRequest(onloaded,'','GET','./test.txt',true,true); //受信時に動作するコールバック関数 function onloaded(oj){ alert(oj.responseText); } </script>
<script type="text/javascript" src = "./jslb_ajax.js" charset= "utf-8"></script> <script type="text/javascript"> //送信 sendRequest(onloaded,{data1:123 , data2:"aaa", data3:"test" },'GET','./test.txt'); //受信時に動作するコールバック関数 function onloaded(oj){ alert(oj.responseText); } </script>
<script type="text/javascript" src = "../../lib/jslb_ajax.js" charset = "utf-8"></script> <script type="text/javascript"> <!-- //コールバック関数 ( 受信時に実行されます ) function on_loaded1(oj) { //レスポンスを取得 var res = oj.responseText; //レスポンスされた文字列をDIVへ出力 document.getElementById("output1").innerHTML=res; } //--> </script> <form> <input type = "text" name = "data1"> <input type = "text" name = "data2"> <input type = "button" value = "Ajaxで送信します" onclick = "d=[]; d['data1']= this.form.data1.value; d['data2']= this.form.data2.value; sendRequest( on_loaded1, //コールバック関数 d, //データ配列 'GET', //HTTPメソッド './echo2.php', //URL true, //非同期 true //強制ロード )"> </form>
<script type="text/javascript" src = "./jslb_ajax.js" charset= "utf-8"></script> <script type="text/javascript"> //送信 function getRange(range) { //リクエスト sendRequest({ onload : on_loaded , //データ受信用コールバック onbeforsetheader : setHeaders //ヘッダセット用コールバック }, '','GET','./test.txt',true,true); //リクエストヘッダセット用コールバック関数(送信直前にセットされます) function setHeaders(oj){ //Rangeの値をセットしてリクエスト oj.setRequestHeader("Range","bytes="+range); } } //データ受信用コールバック関数 ( 受信時に実行されます ) function on_loaded(oj) { //ステータスコード status = "【ステータスコード】<br>"+oj.status; //レスポンスヘッダを取得 headers = "<br><br>【レスポンスヘッダ】<br>"+oj.getAllResponseHeaders().split('\n').join('<br>'); //レスポンスを取得 var res = "【サーバーから受信したtest.txtのデータ】<br>"+oj.responseText; //レスポンスされた文字列を表示 document.getElementById('outputdata').innerHTML=status+headers+res; } </script> *注意:Opera8,9では残念ながらsetRequestHeaderがうまく動作しません。 *サンプル Range
リクエストヘッダでキャッシュ無効にする方法 第6引数のsloadは、URLへ強制的に?t=タイムスタンプを付けますので、どんな時でもスーパーロードできますが キャッシュを増加させます。本来は、ヘッダのセットで行うのが推奨される方法ですので方法を書いておきます。 (ただし、あまり調査はしていませんが、おそらくこの方法はブラウザやサーバーに依存する可能性があります)
<input type ="button" value ="キャッシュ無効のヘッダを設定する" onclick=" sendRequest({ onload : function (oj){ document.getElementById('testDIV').innerHTML=oj.responseText; }, onbeforsetheader : function(oj){ oj.setRequestHeader('Cache-Control','no-cache'); oj.setRequestHeader('Pragma','no-cache'); oj.setRequestHeader ('Expires', 0); } },'','GET','http://jsgt.org/about/cu/CU20050830A/ajasql/junking4.php?y=2007&m=09');" >
関数 chkAjaBrowser ()(ブラウザ判定を使いたい場合は下記のように利用できます) 書式 bool = chkAjaBrowser () 説明 このライブラリを利用可能なブラウザかどうかを判定する 動作可能なブラウザの場合だけtrue(true―false) 例  以下は、動作しないブラウザを使用している場合に別ページにジャンプします。
<script type="text/javascript" src = "./jslb_ajax.js" charset = "utf-8"></script> <script type="text/javascript"> //動作しないブラウザを別のページへ飛ばします if(!chkAjaBrowser()){ //ここに分岐処理を書きます location.href='nonajax.htm'; } </script>
関数 createHttpRequest() (sendRequestの内部で自動使用) 書式 oj = createHttpRequest() 説明 クロスブラウザなXMLHttpRequestオブジェクトを生成します 戻値 XMLHttpRequestオブジェクトのインスタンス Ajaxを使えないブラウザはnullを返します 例  test.txtを読み込んで、ファイルの中の文字列をダイアログ表示します。 ただ、このようにグローバル変数へXMLHttpRequestのインスタンスを入れる方 法はあまりお勧めしません。複数リクエスト時に、前のレスポンスを上書きして しまうからです。sendRequest()から送信すればその心配はなくなります。
<script type="text/javascript" src = "./jslb_ajax.js" charset= "utf-8"></script> <script type="text/javascript"> //オブジェクト生成 req = createHttpRequest() //受信時の処理 req.onreadystatechange = function(){ if ( req.readyState == 4){ alert(req.responseText); } } //初期化 req.open("GET", "./test.txt"); //送信 req.send(""); </script>
jslb_ajaxをコンストラクタにしてオブジェクトな使い方
jslb_ajaxのコードを一皮包むとコンストラクタになります。 コンストラクタ名 =function(){ this.sendRequest=sendRequest; //ここにjslb_ajax_c.jsのコードをコピペ } たとえば、 HogeClass_jslb_ajax=function(){   this.sendRequest=sendRequest;   sendRequest.README={license:'Public DoDomain',url:...... } あとは、 var test = new HogeClass_jslb_ajax(); してから、 test.sendRequest(....); という感じで使えます。
使用例 06|Ajax基本サンプル 07|送信時イベント別サンプル 08|入出力エフェクト 09 10|XML/その他 Allabout Sync(同期)とAsync(非同期) http://allabout.co.jp/career/javascript/closeup/CU20050615A/index.htm 動的なテーブル書き換え http://allabout.co.jp/career/javascript/closeup/CU20050630A/index.htm 入門Ajax(新版)『入門Ajax 増補改訂版』/サポートページ http://jsgt.org/ajax2/ 入門Ajax(旧版)/サポートページ http://jsgt.org/ajax/ AjaSQL掲示板 http://jsgt.org/about/cu/CU20050830A/ajasql-bbs.htm

ajax2
■入門Ajax 増補改訂版
(←このjslb_ajaxライブラリ使うなら、疑う余地無くベストの書籍です(^^;;)

| JavaScript++かも日記 |