CGIを呼び出した場合の戻り値をDOMオブジェクトにする方法とは?

このQ&Aのポイント
  • CGIを利用して外部ファイルから戻り値を受け取る方法について詳しく調査しました。
  • XMLHttpRequestオブジェクトを使用して、CGIからの戻り値をDOMオブジェクトとして受け取ることができます。
  • ただし、直接CGIからDOMオブジェクトを受け取ることはできず、中間のXMLファイルを経由する必要があります。
回答を見る
  • ベストアンサー

CGIを呼び出した場合の戻り値をDOMオブジェクトにする

var rtn; var obj = new XMLHttpRequest(); obj.open("GET","/test.xml"); obj.setRequestHeader(~略~); obj.send(""); obj.onreadystatechange = function( ){   if(obj.readyState == 4){     rtn = obj.responseXML);   } } この場合のrtnの値はtext.xmlのDOMオブジェクトとなりますが、 これを、 var obj = new XMLHttpRequest(); obj.open("GET","/test.cgi"); obj.send(""); とし、cgiからの戻り値としてDOMオブジェクトを受けることは可能ですか? やはりcgiからプログラムを通じてxmlファイルを作成し、 それをもう一度、 obj.open("GET","/test.xml"); obj.send(""); として読み込むしかないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.2

#1です。 >obj.open("GET","/test.cgi");の戻り値からxmlファイルを取得するときも >obj.open("GET","/test.xml");からxmlファイルを取得するときと >同じことということでしょうか? 同じです。 >obj.responseXMLとした時に、ブラウザがxmlファイルを >DOMオブジェクトとしてメモリ上に展開しているという理解であっているのでしょうか? その通りです。 ブラウザからリクエストされたデータ(CGIの出力/XMLファイル)を返すまでがサーバ、 それを受取って処理(DOMオブジェクトとしての展開等々)をするのはブラウザです。

OKbokuzyo
質問者

お礼

回答ありがとうございます。 疑問なってた箇所が払拭されました。 ありがとうございました。

その他の回答 (1)

  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.1

可能です。 test.cgiがhttpヘッダ(content-type)、内容共にxmlを吐き出す仕様であれば問題ないはずです。

OKbokuzyo
質問者

お礼

回答ありがとうございます。 可能なんですね。 少し考えたのですが、 obj.open("GET","/test.cgi");の戻り値からxmlファイルを取得するときも obj.open("GET","/test.xml");からxmlファイルを取得するときと 同じことということでしょうか? とすれば、cgiからの戻り値がxmlファイルであれば、特に意識しなくとも同じように、 obj.responseXMLで戻り値のXMLファイルを DOMオブジェクトとして利用できるということですか? obj.responseXMLとした時に、ブラウザがxmlファイルを DOMオブジェクトとしてメモリ上に展開しているという理解であっているのでしょうか? 以上、よろしくお願いします。

関連するQ&A

  • XMLHttpRequestオブジェクトによるレスポンスを複数回受けるには?

    以下のようなコードでXMLHttpRequestを試しているのですが、 「レスポンスです。」と表示した後、 いったん違うページに遷移し、再度以下のコードを書いたページに遷移しても 「レスポンスです。」と表示されません。 var obj = new XMLHttpRequest(); obj.open("GET","/test.txt"); obj.setRequestHeader(~略~); obj.send(""); obj.onreadystatechange = function( ){   if(obj.readyState == 4){     alert(obj.responseText);   } } -------以下、test.txt-------- レスポンスです。 ----------------------------- ブラウザを閉じ、再びこのコードの書かれたページを表示すると「レスポンスです。」と表示されます。 ブラウザを閉じなくても、ページを表示する度に「レスポンスです。」と表示するにはどうすればよいのでしょうか?

  • ActiveXObjectで取得したXMLの解析処理ができない

    Ajaxの勉強をしているのですが困っています。 ActiveXObjectで取得したXMLの解析処理ができないのです。 1.JavaScriptで新たにActiveXObjectのオブジェクトを作成 (例)var obj = ActiveXObject(Msxml2.XMLHTTP); 2.上記オブジェクトに対しopen(),send()を行う。 (例)obj.open(callback,url,false); 3.サーバーにてリクエスト受信後、JSP上に記述したXMLを送信。 4.上記オブジェクトに対しresponseXMLを行う。 (例)var doc = obj.responseXML; 5.XMLの要素を取得 (例)doc.getElementsByTagName("name"); 4の結果何らかのオブジェクトは取れているようなのです(alertで表示してみると"[Object]"と表示される。)が、実際に5でXML中の要素を取ろうとすると何も取得できません。一方4をobj.responseText;とすると、(alertで表示してみると文字化けしていますがXMLの)内容が取得できます。 なぜレスポンスをXMLにして取得した場合、情報を取得できないのでしょうか?ご教授いただけませんでしょうか? よろしくお願いいたします。

    • 締切済み
    • PHP
  • Yahoo!ウィジェットのgetElementsByTagName

    Yahoo!ウィジェットについて質問です。 getElementsByTagNameで取得したタグのlenghtはかえってくるのですが, tagNameのデータを読み込もうすると、(TypeError: unit[0] has no properties)になります。 Yahoo!ウィジェットのgetElementsByTagNameは、通常のJavaScriptとは違うのでしょうか? コードは以下の通りです。 ■JavaScript //XMLHTTPRequest var request = new XMLHttpRequest(); request.autoRedirect = false; request.open( "GET", "hoge.xml", true ); request.send(); request.onreadystatechange = myStatusProc; //XMLデータの表示 function myStatusProc(){ if ( this.readyState == 4 ){ var XMLObj = request.responseXML; var unit = XMLObj.getElementsByTagName("unit"); var a = unit[0].getElementsByTagName("a")[0].firstChild.nodeValue; print(a); } } ■XML <root> <unit> <a>test</a> </unit> <unit> <a>test</a> </unit> <unit> <a>test</a> </unit> </root> すみません。よろしくお願いします。

  • AjaxでDOM Exception11が出る

    次のようなスクリプトを実行して、隣のディレクトリに配置したxmlをAjaxで取得しようとしています。 var ajaxReq = new XMLHTTPRequest; function loadContents(){ //Ajaxリクエスト ajaxReq.send("GET","xml/contents.xml",handleRequest); //## } が、ブラウザのコンソールで##の行で"INVALID_STATE_ERR: DOM EXCEPTION 11" と出て止まってしまいます。 調べると、利用出来ないオブジェクトにアクセスしようとしている時に出るようなのですが、 これはxmlファイルにアクセス出来ない(見つからない等)ことを意味しているのでしょうか? それともコードそのものに何か欠陥があるのでしょうか? これはGoogle App Engine for Pythonのローカルサーバー上で動かしているのですが、 試しに純粋なローカル環境で試すとfirefoxのコンソールには uncaught exception: [Exception... "Component returned failure code: 0xc1f30001 (NS_ERROR_NOT_INITIALIZED) [nsIXMLHttpRequest.send]" nsresult: "0xc1f30001 (NS_ERROR_NOT_INITIALIZED)" location: "JS frame :: file:///Users/user/gek/s100/HTTP.js :: loadContents :: line 23" data: no] と出ます。これについてはそもそもローカルだからAjaxのリクエストが出来ないのだろうかという点も疑問です。

  • flash javascript php の引数受け渡しで

    http://61.197.170.205/~tobacco/htdocs/test.php があり。戻り値があります。 javascriptに var req_argument = null; function File_Request(data, fileName){ //XMLHttpRequestオブジェクト(ブラウザー対策できてるものとして) var http_obj = new XMLHttpRequest(); http_obj.open("POST", fileName); http_obj.onreadystatechange = function(){ if(http_obj.readyState == 4){ req_argument = http_obj.responseText; } } http_obj.setRequestHeader('Content-Type','text/plain;charset=UTF-8'); http_obj.send(data); } function flash_kick(argument) { File_Request(argument, "http://61.197.170.205/~tobacco/htdocs/test.php"); return req_argument; } を設置したページを用意し、さらにactionscript上に以下と「bt_test」ボタン・「kakunin_text_box」のあるflashを配置しました。 import flash.external.*; bt_test.addEventListener(MouseEvent.MOUSE_UP, test_action); function test_action(e){ var argument:String = "渡したい引数"; var s:String = String(ExternalInterface.call("flash_kick", argument)); kakunin_text_box.text = s; }; うまくいかず、http_obj.readyState == 4を待ってくれないのでnullが戻ってきます。 どのような処理をするとスムーズにphpの返り値をflashへ受け渡せるのか、ご教授いただけると嬉しいです。 質問用書き換え時に文法エラーあったらごめんなさい。

    • ベストアンサー
    • AJAX
  • php インスタンスとオブジェクトの呼び方

    new obj = new Test(); という一文は、 「Testクラスのオブジェクト、objを作成している」という考えを持っています。 オブジェクトは物という概念で、 「Testクラス を new して、objインスタンスを作成している」 というのが正しいのでしょうか? 【objを Testオブジェクトと呼ぶのは間違っているのでしょうか? objは Testインスタンスと呼ぶのがやはり正しいのでしょうか?】 知り合いにも、インスタンスではなくオブジェクトと呼んでる人が多いのでわからなくなってきました。 ご教授お願いします。

    • ベストアンサー
    • PHP
  • XMLHttpRequestオブジェクトが思うように動作しない

    XMLHttpRequestオブジェクトが思うように動作しない 質問させてください。 JAVASCRIPTでRSSリーダーを作成しているのですが、うまく作れません。 処理は以下のように行っています。 1. RSSのURLを配列に格納する。 2. XMLHttpRequestオブジェクトを作成する。 3. 配列の要素数だけforループを行い、ループ内でopen処理とコールバック関数の設定を行う。 僕の行っている処理では、なぜか最後に登録したURLのRSSだけが表示されます。(push,popしているので最後に登録=最初にopenする) 参考までにコードを以下に記載します。 どうかお知恵をお貸しください。 //ファイルにアクセスし受信内容を確認します methodは'GET' function requestFile( data , method ) { URLList = new Array(); URLList.push(URL1); URLList.push(URL2); //XMLHttpRequestオブジェクト生成 httpoj = createHttpRequest() //[1] for (i = 0; i < URLList.length; i++) { //open メソッド // HTTP上のXMLでないと駄目・・・? URL = URLList.pop(); document.getElementById('test1').innerHTML += URL; httpoj.open( method , URL , 'false'); //[2] //受信時に起動するイベント httpoj.onreadystatechange = function() //[4] { //readyState値は4で受信完了 if (httpoj.readyState==4) //[5] { //コールバック on_loaded(httpoj); } } } //send メソッド httpoj.send( data ); //[3] }

  • javascriptでXML IEとfireFox

    作成中のホームページで、条件を入力させてその条件に合ったデータ(XMLで管理)を表示する という内容のモノを作ろうとしています。 実際に一通り動く所までは出来たのですが、IEでしか動作せず Firefox等の他ブラウザだと動作しません。 調べてみると、ActiveXObjectが使えないようなのですが どういう方法で実装すると動作するようになるのでしょうか。 よろしくお願いします。 ----------以下ソース一部---------- // ワーク用の XML ドキュメントオブジェクト var objDocWk = new ActiveXObject("Msxml2.DOMDocument.3.0") // 出力用の新しいルートノードを作成 dstNd = objDocWk.createNode(1, "list", "") // XML ドキュメントオブジェクト生成 var objDoc = new ActiveXObject("Msxml2.DOMDocument.3.0") objDoc.async = false objDoc.load("msch.xml") var objRootNode = objDoc.documentElement.childNodes =======================補足======================= 下記のようにやってみたのですが、jsのエラーが起り原因がわからないです。※fireFoxのみIEでは動作確認済 if (window.ActiveXObject) { //for IE // XML ドキュメントオブジェクト生成 var objDoc = new ActiveXObject("Msxml2.DOMDocument.3.0") objDoc.async = false // 曲情報の読込み objDoc.load("msch/msch.xml") // ワーク用の XML ドキュメントオブジェクト var objDocWk = new ActiveXObject("Msxml2.DOMDocument.3.0") } else { //for Firefox // XML ドキュメントオブジェクト生成 var xhttp = new XMLHttpRequest(); xhttp.open("GET", "msch/msch.xml", false); xhttp.send(null); var objDoc = xhttp.responseText; window.alert(objDoc); // ワーク用の XML ドキュメントオブジェクト var xhttp2 = new XMLHttpRequest(); xhttp2.open("GET", "msch/msch.xml", false); xhttp2.send(null); var objDocWk = xhttp2.responseText; window.alert(objDocWk); } // 出力用の新しいルートノードを作成 dstNd = objDocWk.createNode(1, "musiclist", "") // 曲情報のルートノードを取得 var objRootNode = objDoc.documentElement.childNodes エラー内容が objDocWk.createNode is not a function  と objDoc.documentElement is undefined   です。

  • Ajax(XMLHttpRequest)で取得したHTMLをDOMにし

    Ajax(XMLHttpRequest)で取得したHTMLをDOMにしたい ☆環境 ・Firefox 3.x ・greasemonkeyで動作させるJavascript ※上記環境からIEは考慮しないが、Google Chromeは考慮する可能性大 ☆行いたいこと xmlに成形されていない生のhtmlを、XMLHttpRequestで取得しDOMとして利用したい ☆調べたこと https://developer.mozilla.org/ja/XMLHttpRequest overrideMimeType()メソッドを使用すれば、responseXMLでエラーにならない(だけ) ☆現状 一応[window.]document.createElement()でテンポラリ用のdivを用意し、 responseTextで一度書き込み、改めて[window.]documentから動作させています。 この方法だと非同期にしづらいため、なにか良い方法はないでしょうか? よろしくお願いします。

    • ベストアンサー
    • AJAX
  • javascriptを只今勉強中なのですが、オブジェクトについてこんが

    javascriptを只今勉強中なのですが、オブジェクトについてこんがらがってしまいました。 var obj = new Object(); var obj2 = {}; Object.prototype.prop1 = "hoge"; obj,obj2共にprop1にhogeがセットされるのですが、オブジェクトリテラルのobj2は Objectコンストラクタのインスタンスと解釈できるのでしょうか?? new演算子について色々とfirebugで調べていたところこの疑問が出てきました。 newなしでもインスタンスができるのでしょうか? オブジェクトを理解していないので意味不明な質問かもしれませんが どなたかアドバイスいただけると嬉しいです。

専門家に質問してみよう