0

私はjavascriptでXMLから配列をロードする簡単な関数を書こうとしています。success:を呼び出すときにフィールドを使用して、AJAXの結果を関数に正常に送信できました$.ajax(...)

$.ajax(...)また、関数の戻り値が、ObjectフィールドresponseTextresponseXML(喜んで使用したい)を持つになっていることに気づきました。ただし、コンソールのツリーでそれらを確認できたとしても、を介してそれらにアクセスしようとしても機能し.responseTextません(したがってundefined、ジャンク文字列を検索しようとした場合と同じように印刷されます.this_does_not_exist)。

これは、いくつかの異なるXMLファイルでほぼ同じように実行します。コードで実行したいと思います。パラメータに結果を別の関数にキックさせるだけでは満足できない理由はsuccess:、データを複数回使用する可能性があるが、データを1回だけロードしたいからです。XMLの読み込みと使用を分離して、何度も読み込まれないようにしています。

responseText出力したときに表示されるのにxml_ret、からアクセスできない理由を教えてくださいxml_ret.responseText

あなたの助けと忍耐に感謝します。


注:同じディレクトリから読み込むtest.xmlには、次の方法でChromeまたはChromiumを起動する必要があります。

chromium-browser --allow-file-access-from-files 

test.html:

<html>
<head>
<script type="text/javascript" 
        src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>

    <script type="text/javascript">
      function print_XML(xml)
      {
      console.log( "in printXML" );
      console.log(xml);

      $(xml).find("point").each(function()
      {
      var loaded_row = [ parseInt($(this).attr("number_protein_groups")), parseInt( $(this).attr("log_likelihood") ) ];
      console.log( loaded_row );
      });
      }

      function load_and_print_XML(fname)
      {
    console.log( "in load_and_print_XML" );

      xml_ret = $.ajax({
      type: "GET",
      url: fname,
      dataType: "xml",
      success: print_XML
       });

    console.log( "xml_ret" );
    console.log( xml_ret );
    console.log( xml_ret.responseText );
      }

    </script>

</head>
  <body>
    <script type="text/javascript">
      xml_data = load_and_print_XML("test.xml");
      /* do something with xml_data here */
    </script>
  </body>
</html>

test.xml

<?xml version="1.0" encoding="utf-8" ?>
<results>
  <replicate_result graph_filename="yeast_1.pivdo">
    <point number_protein_groups="10" log_likelihood="20"/>
    <point number_protein_groups="20" log_likelihood="40"/>
    <point number_protein_groups="40" log_likelihood="60"/>
    <point number_protein_groups="50" log_likelihood="50"/>
    <point number_protein_groups="60" log_likelihood="55"/>
  </replicate_result>
</results>

私のコンソール:

in load_and_print_XML
test.html:30xml_ret
test.html:31
Object
abort: function (a){a=a||"abort",p&&p.abort(a),w(0,a);return this}
always: function (){i.done.apply(i,arguments).fail.apply(i,arguments);return this}
complete: function (){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this}
done: function (){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this}
error: function (){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this}
fail: function (){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this}
getAllResponseHeaders: function (){return s===2?n:null}
getResponseHeader: function (a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c}
isRejected: function (){return!!i}
isResolved: function (){return!!i}
overrideMimeType: function (a){s||(d.mimeType=a);return this}
pipe: function (a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()}
progress: function (){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this}
promise: function (a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}
readyState: 4
responseText: "<?xml version="1.0" encoding="utf-8" ?>↵&lt;results>↵  <replicate_result graph_filename="yeast_1.pivdo">↵    <point number_protein_groups="10" log_likelihood="20"/>↵    <point number_protein_groups="20" log_likelihood="40"/>↵    <point number_protein_groups="40" log_likelihood="60"/>↵    <point number_protein_groups="50" log_likelihood="50"/>↵    <point number_protein_groups="60" log_likelihood="55"/>↵  </replicate_result>↵&lt;/results>"
responseXML: Document
setRequestHeader: function (a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this}
state: function (){return e}
status: 200
statusCode: function (a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this}
statusText: "success"
success: function (){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this}
then: function (a,b,c){i.done(a).fail(b).progress(c);return this}
__proto__: Object
test.html:32undefined
test.html:9in printXML
test.html:10
Document
<results>​
<replicate_result graph_filename=​"yeast_1.pivdo">​…​&lt;/replicate_result>​
</results>​
test.html:15[10, 20]
test.html:15[20, 40]
test.html:15[40, 60]
test.html:15[50, 50]
test.html:15[60, 55]
4

3 に答える 3

2

質問に:

xml_ret を出力すると responseText が表示されるのに、xml_ret.responseText からアクセスできない理由を教えてください。

これは、たとえばクロムでオブジェクトの console.log を実行すると、コンソール内のオブジェクトへの参照が保持されるために発生します。オブジェクトが変更されると、それらの変更は chrome のコンソールに反映されます。

だから何が起こっているのですか?

console.log( "xml_ret" );
console.log( xml_ret );
console.log( xml_ret.responseText );

ajax リクエストが完了しておらず、responseText がまだ割り当てられていないため、未定義として表示されます。ただし、出力された xml_ret オブジェクトはオブジェクトへの参照であるため、ajax リクエストが終了すると、コンソールで値を確認すると、すでに設定されているため、「responseText」プロパティがあります。

コードをデバッグし、次の行にブレークポイントを追加すると、次のことがわかります。

console.log( xml_ret.responseText );

ファイルxml_retを見ると、「responseText」プロパティがありません。

PS: このコメントを確認する必要があります。遅すぎると思う :P

于 2012-04-13T23:10:50.600 に答える
1

問題は、オブジェクトが更新されても文字列が更新されない場合、コンソールがオブジェクトを更新することです。

したがって、ajax 呼び出しを呼び出すと、関数はオブジェクトを直接返しますがresponseText、呼び出しがまだ完了していないため未定義になります。

したがって、を使用したい場合はresponseText、成功時に実行する必要があります。

function print_XML(xml, s, jqXHR) { // there are 3 arguments past the third one is the same as the return of $.ajax
    console.log( "in printXML" );
    console.log(xml);

    $(xml).find("point").each(function()
    {
    var loaded_row = [ parseInt($(this).attr("number_protein_groups")), parseInt( $(this).attr("log_likelihood") ) ];
    console.log( loaded_row );
    });

    console.log(jqXHR);
    console.log(jqXHR.responseText); // now it works!
}​
于 2012-04-13T22:53:44.390 に答える
0

xml_retを出力すると、responseTextが表示されます。これは、ajax関数がjQueryで機能するためです。これがコールバックで返されるものです

success(data、textStatus、jqXHR)

したがって、xml_retのプロパティを取得しようとすると、それは単なるXMLデータであり、オブジェクトではないため、失敗します。3番目の引数は期待どおりですが、jqueryの引数であるため、わずかに変更されています。

于 2012-04-13T23:04:52.633 に答える