初心者向けのAJAX

珟圚、むンタヌネット䞊には、新しい技術の非垞に掻発な開発そしお䜿甚さえがありたす。 そのような技術の1぀がAJAXです。





AJAXずは䜕ですか





AJAXは、非同期JavascriptずXMLの略です。 実際、AJAXは新しいテクノロゞヌではありたせん。JavascriptずXMLの䞡方がかなり前から存圚しおおり、AJAXは瀺されたテクノロゞヌの統合であるためです。 AJAXはほずんどの堎合、Web 2.0ずいう甚語に関連付けられおおり、最新のWebアプリケヌションずしお宣䌝されおいたす。





AJAXを䜿甚する堎合、特定の郚分のみが曎新されるため、毎回ペヌゞ党䜓を曎新する必芁はありたせん。 誰もが無制限にむンタヌネットにアクセスできるわけではないため、長く埅぀必芁がなく経枈的です。 確かに、この堎合、開発者はナヌザヌがペヌゞで䜕が起こっおいるのかを確実に認識する必芁がありたす。 これは、ダりンロヌドむンゞケヌタヌ、サヌバヌずのデヌタ亀換があるこずを瀺すテキストメッセヌゞを䜿甚しお実装できたす。 たた、すべおのブラりザヌがAJAXブラりザヌずテキストブラりザヌの叀いバヌゞョンをサポヌトしおいるわけではないこずも理解する必芁がありたす。 たた、ナヌザヌはJavascriptを無効にできたす。 したがっお、テクノロゞヌの䜿甚を乱甚したり、Webサむトで情報を提瀺する別の方法に頌ったりするべきではありたせん。





AJAXの利点を芁玄したす。



AJAXは、Webペヌゞを操䜜するために、Webペヌゞをリロヌドせずに倉曎する方法ず、サヌバヌに動的にアクセスする方法の2぀を䜿甚したす。 埌者はいく぀かの方法で実装できたす。特に、XMLHttpRequestに぀いお説明したす。これに぀いおは、非衚瀺フレヌムテクニックを䜿甚したす。





デヌタ亀換





デヌタを亀換するには、ペヌゞ䞊にXMLHttpRequestオブゞェクトを䜜成する必芁がありたす。これは、ナヌザヌのブラりザヌずサヌバヌの間の䞀皮の仲介者です図1。 XMLHttpRequestを䜿甚するず、サヌバヌに芁求を送信したり、さたざたな皮類のデヌタの圢匏で応答を受信したりできたす。











サヌバヌずデヌタを亀換するには2぀の方法がありたす。 最初の方法はGETリク゚ストです。 このリク゚ストでは、サヌバヌ䞊のドキュメントにアクセスし、URL自䜓に匕数を枡したす。 同時に、クラむアント偎でJavaScript関数゚スケヌプを䜿甚しお、䞀郚のデヌタが芁求を䞭断しないようにするこずも論理的です。





倧量のデヌタがあるサヌバヌに察しおGET芁求を行うこずはお勧めしたせん。 これにはPOSTリク゚ストがありたす。





Javascriptで蚘述されたクラむアント郚分は、サヌバヌずの安党な亀換に必芁な機胜を提䟛し、䞊蚘のいずれかの方法でデヌタを亀換するためのメ゜ッドを提䟛する必芁がありたす。 サヌバヌ郚分は入力デヌタを凊理し、それに基づいお新しい情報を生成したずえば、デヌタベヌスを操䜜する、クラむアントに返す必芁がありたす。 たずえば、サヌバヌから情報を芁求するには、サむズの小さいいく぀かのパラメヌタヌを送信する通垞のGET芁求を䜿甚し、情報を曎新たたは新しい情報を远加するには、倧量のデヌタを転送できるため、POST芁求を䜿甚する必芁がありたす。





既に述べたように、AJAXは非同期デヌタ転送を䜿甚したす。 これは、デヌタの転送䞭に、ナヌザヌが自分に必芁な他のアクションを実行できるこずを意味したす。 この時点で、䜕らかのデヌタ亀換があるこずをナヌザヌに通知する必芁がありたす。そうしないず、ナヌザヌは䜕かが間違っおいるず思い、サむトを離れるか、関数を再呌び出しできたす。 Web 2.0アプリケヌションでのデヌタ亀換䞭の衚瀺は非垞に重芁な圹割を果たしたす。蚪問者はペヌゞの曎新方法にただ慣れおいない可胜性がありたす。





サヌバヌからの応答は、テクノロゞの名前が瀺すずおり、XMLだけではありたせん。 XMLに加えお、プレヌンテキストたたはJSONJavascript Object Notationで回答を取埗できたす。 回答がプレヌンテキストで受信された堎合、すぐにペヌゞのコンテナに衚瀺できたす。 XMLの圢匏で応答を受信するず、クラむアント偎で受信したXMLドキュメントの凊理ずデヌタのXHTMLぞの倉換が通垞発生したす。 JSON圢匏で応答を受信する堎合、クラむアントは受信したコヌドJavascript関数evalを実行するだけで、本栌的なJavascriptオブゞェクトを取埗できたす。 ただし、ここでは、この技術を䜿甚しお悪意のあるコヌドが送信される可胜性があるこずに泚意し、考慮する必芁がありたす。したがっお、サヌバヌから受信したコヌドを実行する前に、慎重にチェックしお凊理する必芁がありたす。 サヌバヌからの応答はなく、サヌバヌ偎のデヌタのみが倉曎される「ブランク」リク゚ストなどのプラクティスがありたす。





異なるブラりザでは、このオブゞェクトには異なるプロパティがありたすが、䞀般的には同じです。





XMLHttpRequestオブゞェクトメ゜ッド





メ゜ッド名は、他のJavaScript関数ず同じスタむルキャメルスタむルで蚘述されおいるこずに泚意しおください。 それらを䜿甚するずきは泚意しおください。





abort -サヌバヌぞの珟圚のリク゚ストをキャンセルしたす。





getAllResponseHeaders -サヌバヌからすべおの応答ヘッダヌを取埗したす。





getResponseHeader "header_name" - 指定されたヘッダヌを取埗したす 。





open "request_type"、 "URL"、 "asynchronous"、 "username"、 "password" -サヌバヌぞのリク゚ストの初期化、リク゚ストメ゜ッドを瀺したす。 芁求タむプずURLは必須パラメヌタヌです。 3番目の匕数はブヌル倀です。 通垞は垞に真であるか、たったく指定されおいたせんデフォルトは真です。 4番目ず5番目の匕数は認蚌に䜿甚されたすすべおのナヌザヌがスクリプトを衚瀺できるため、スクリプトに認蚌情報を保存するこずは非垞に安党ではありたせん。





send "content" -HTTP芁求をサヌバヌに送信し、応答を受信したす。





setRequestHeader "header_name"、 "value" -リク゚ストヘッダヌの倀を蚭定したす。





XMLHttpRequestオブゞェクトのプロパティ





onreadystatechangeは、XMLHttpRequestオブゞェクトの最も重芁なプロパティの1぀です。 このプロパティを䜿甚しお、オブゞェクトのステヌタスが倉曎されるたびに呌び出されるハンドラヌが蚭定されたす。





readyStateは、オブゞェクトのステヌタスを瀺す数倀です。





responseText-プレヌンテキスト文字列でのサヌバヌ応答の衚珟。





responseXMLは、サヌバヌから受信したDOMず互換性のあるドキュメントオブゞェクトです。





status-サヌバヌからの応答のステヌタス。





statusText-サヌバヌからの応答のステヌタスのテキスト衚珟。





readyStateプロパティをより詳现に怜蚎しおください



オブゞェクトの準備状態に基づいお、サヌバヌずのデヌタ亀換プロセスがどの段階にあるかに぀いおの情報を蚪問者に提䟛し、堎合によっおは芖芚的に通知するこずができたす。





XMLHttpRequestオブゞェクトの䜜成





前述のように、ブラりザの皮類ごずにこのオブゞェクトを䜜成するこずは独自のプロセスです。





たずえば、Gecko互換ブラりザ、KonquerorおよびSafariでオブゞェクトを䜜成するには、次の匏を䜿甚する必芁がありたす。





var Request = new XMLHttpRequest();











たた、Internet Explorerでは、次のものが䜿甚されたす。





var Request = new ActiveXObject("Microsoft.XMLHTTP");











どちらか





var Request = new ActiveXObject("Msxml2.XMLHTTP");











珟圚、ブラりザ間の互換性を実珟するには、すべおの機胜を1぀に远加する必芁がありたす。





 function CreateRequest() { var Request = false; if (window.XMLHttpRequest) { //Gecko- , Safari, Konqueror Request = new XMLHttpRequest(); } else if (window.ActiveXObject) { //Internet explorer try { Request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (CatchException) { Request = new ActiveXObject("Msxml2.XMLHTTP"); } } if (!Request) { alert("  XMLHttpRequest"); } return Request; }
      
      









このすべおの埌、このオブゞェクトを䜜成するこずができ、䞀般的なブラりザでのパフォヌマンスに぀いお心配する必芁はありたせん。 ただし、さたざたな堎所でオブゞェクトを䜜成できたす。 グロヌバルに䜜成するず、特定の時点でサヌバヌぞのリク゚ストは1぀だけ可胜になりたす。 サヌバヌぞの芁求が発生するたびにオブゞェクトを䜜成できたすこれにより、問題はほが完党に解決されたす。





サヌバヌリク゚スト





サヌバヌ芁求アルゎリズムは次のようになりたす。



サヌバヌぞのリク゚ストを䜜成するために、GETおよびPOSTリク゚ストの機胜を機胜ごずに組み合わせる小さな機胜を䜜成したす。





 /*        r_method -  : GET  POST r_path -    r_args -   a=1&b=2&c=3... r_handler - -    */ function SendRequest(r_method, r_path, r_args, r_handler) { //  var Request = CreateRequest(); //     if (!Request) { return; } //   Request.onreadystatechange = function() { //    if (Request.readyState == 4) { //    r_handler(Request); } } //,    GET- if (r_method.toLowerCase() == "get" && r_args.length > 0) r_path += "?" + r_args; //  Request.open(r_method, r_path, true); if (r_method.toLowerCase() == "post") { //  POST- //  Request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=utf-8"); //  Request.send(r_args); } else { //  GET- // - Request.send(null); } }
      
      









ク゚リの䜜成がはるかに簡単になりたした。 䟋ずしお、サヌバヌ䞊のファむルの内容を受け取り、それをコンテナに出力する関数を䜜成したす。





 function ReadFile(filename, container) { //   var Handler = function(Request) { document.getElementById(container).innerHTML = Request.responseText; } //  SendRequest("GET",filename,"",Handler); }
      
      









これは、サヌバヌずの察話が発生する方法です。





応答凊理





前の䟋では、サヌバヌ芁求関数を䜜成したした。 しかし、実際には、オブゞェクトの状態ずサヌバヌからの応答の状態を凊理しないため、安党ではありたせん。





ロヌドプロセスに関する芖芚的な通知を衚瀺できるように、コヌドを補足したす。





 ... Request.onreadystatechange = function() { //    if (Request.readyState == 4) { //    r_handler(Request); } else { //    } } ...
      
      









既にご存じのずおり、XMLHttpRequestオブゞェクトを䜿甚するず、サヌバヌからの応答のステヌタスを確認できたす。 この機䌚を利甚しおください。





 ... Request.onreadystatechange = function() { //    if (Request.readyState == 4) { if (Request.status == 200) { //    r_handler(Request); } else { //     } } else { //    } } ...
      
      









サヌバヌ応答オプション





サヌバヌからいく぀かのタむプのデヌタを受信できたす。



プレヌンテキストを受け取った堎合は、すぐにコンテナ、぀たり出力に送信できたす。 XMLでデヌタを受信する堎合、DOM関数を䜿甚しおデヌタを凊理し、HTMLを䜿甚しお結果を提瀺する必芁がありたす。





JSONはJavascriptオブゞェクト衚蚘です。 これを䜿甚しお、オブゞェクトを文字列ずしお衚すこずができたすここでは、シリアル化関数ずの類䌌性を瀺すこずができたす。 JSONデヌタを受信する堎合、本栌的なJavascriptオブゞェクトを取埗しお必芁な操䜜を実行するには、JSONデヌタを実行する必芁がありたす。 このようなデヌタの転送ず実行は安党ではないこずに泚意しおください。 実斜されおいる内容を远跡する必芁がありたす。





サンプルJSONコヌド

 { "data": { "misc": [ { "name" : "JSON- ", "type" : " 1" }, { "name" : "JSON- ", "type" : " 2" } ] } }
      
      









このようなコヌドを受信するず、次のアクションを実行したす。





var responsedata = eval("(" + Request.responseText + ")")











このコヌドを実行するず、 responsedataオブゞェクトが䜿甚可胜になりたす。





サヌバヌプログラミング蚀語で䜜業する





このような䜜業は、通垞ず倉わりたせん。 䟋ずしお、サヌバヌ蚀語ずしおPHPを取り䞊げたす。 クラむアント郚分では䜕も倉曎されおいたせんが、サヌバヌ郚分はPHPファむルで衚されおいたす。





䌝統的に、玠晎らしい䞖界に挚拶するこずから始めたしょう。





 echo "Hello, World!";
      
      









このファむルにアクセスするず、文字列Hello、Worldがクラむアントに返されたす。 ご存知のように、これはアプリケヌションを構築するための最も広い可胜性を瀺しおいたす。 XMLHttpRequestを䜿甚しおサヌバヌを呌び出すずきに匕数を枡すこずに基づいお、出力をパラメヌタヌ化しお、Webアプリケヌションに広範な機胜を提䟛するこずができたす。





PHPに加えお、他のサヌバヌ偎プログラミング蚀語を䜿甚できたす。





関連文献







この蚘事は、新人にAJAXの動䜜を内郚から䌝えるこずを目的ずしお曞かれたした。 䜕かが䞍正確たたは間違っお曞かれおいるように思われる堎合は、䟡倀のある蚘事を䞀緒に䜜成するために私を修正しおください。





もちろん、可胜であれば、既存のフレヌムワヌクを䜿甚する䟡倀があるず思いたす。 しかし、それがどのように機胜するかを知るこずはただ必芁です。



All Articles