68

私はまだjQueryとajaxシーンの初心者ですが、GETを実行していくつかのXMLファイル(〜6KB以下)を取得する$.ajaxリクエストがありますが、ユーザーがそのページに費やす間、XMLコンテンツはnot / will not change (このデザインは変更できません。別の場所から読み取っているため、XML ファイルを変更するアクセス権もありません)。したがって、応答データを格納するグローバル変数があり、その後のデータの検索はこの変数で行われるため、複数の要求を行う必要はありません。

XML ファイルが増加する可能性があるという事実を考えると、これがベスト プラクティスであるかどうかはわかりません。また、Java のバックグラウンドから来て、グローバル パブリック変数に関する私の考えは、一般的にノーノーです。

だから私が持っている質問は、これを行うためのより良い方法があるかどうか、そしてファイルがばかげたファイルサイズに拡張された場合にメモリの問題が発生するかどうかについての質問ですか?

データを xml オブジェクト内のいくつかのゲッター/セッター型関数に渡すことができると考えています。これにより、グローバル パブリック変数の問題が解決されますが、応答をオブジェクト自体に保存する必要があるかどうかという疑問が残ります。

たとえば、私が現在行っていることは次のとおりです。

// top of code
var xml;
// get the file
$.ajax({
  type: "GET",
  url: "test.xml",
  dataType: "xml",
  success : function(data) {
    xml = data;
  }
});
// at a later stage do something with the 'xml' object
var foo = $(xml).find('something').attr('somethingElse');
4

16 に答える 16

71

これは、非常にうまく機能する関数です。上記のベストアンサーが機能しませんでした。

jQuery.extend({
    getValues: function(url) {
        var result = null;
        $.ajax({
            url: url,
            type: 'get',
            dataType: 'xml',
            async: false,
            success: function(data) {
                result = data;
            }
        });
       return result;
    }
});

次に、それにアクセスするには、次のように変数を作成します。

var results = $.getValues("url string");
于 2010-08-17T15:17:08.820 に答える
35

これは私のために働いた:

var jqxhr = $.ajax({
    type: 'POST',       
    url: "processMe.php",
    data: queryParams,
    dataType: 'html',
    context: document.body,
    global: false,
    async:false,
    success: function(data) {
        return data;
    }
}).responseText;

alert(jqxhr);
// or...
return jqxhr;

注意すべき重要な点:global: falseasync:falseそして最後にリクエストにresponseTextチェーンされ$.ajaxます。

于 2011-12-30T13:40:07.500 に答える
35

保管する以外に方法はありません。メモリ ページングにより、潜在的な問題が軽減されるはずです。

「xml」というグローバル変数を使用する代わりに、次のようにすることをお勧めします。

var dataStore = (function(){
    var xml;

    $.ajax({
      type: "GET",
      url: "test.xml",
      dataType: "xml",
      success : function(data) {
                    xml = data;
                }
    });

    return {getXml : function()
    {
        if (xml) return xml;
        // else show some error that it isn't loaded yet;
    }};
})();

次に、次の方法でアクセスします。

$(dataStore.getXml()).find('something').attr('somethingElse');
于 2009-05-25T04:35:00.060 に答える
18

これを行う必要はありません。私は自分のプロジェクトで同じ問題に遭遇しました。あなたがすることは、成功時のコールバック内で関数呼び出しを行い、グローバル変数をリセットすることです。非同期 JavaScript を false に設定している限り、正しく動作します。これが私のコードです。それが役に立てば幸い。

var exists;

//function to call inside ajax callback 
function set_exists(x){
    exists = x;
}

$.ajax({
    url: "check_entity_name.php",
    type: "POST",
    async: false, // set to false so order of operations is correct
    data: {entity_name : entity},
    success: function(data){
        if(data == true){
            set_exists(true);
        }
        else{
            set_exists(false);
        }
    }
});
if(exists == true){
    return true;
}
else{
    return false;
}

これがお役に立てば幸いです。

于 2011-01-19T17:33:21.213 に答える
8

あなたの問題は、「成功」関数の実行と変数からデータを取り出そうとしている時間の間のサーバー遅延だけで、ローカルまたはグローバルスコープに関連していない可能性があります。

ajaxの「成功」関数が起動する前に、変数の内容を出力しようとしている可能性があります。

于 2011-05-17T12:46:55.660 に答える
3
     function get(a){
            bodyContent = $.ajax({
                  url: "/rpc.php",
                  global: false,
                  type: "POST",
                  data: a,
                  dataType: "html",
                  async:false
               } 
            ).responseText;
            return bodyContent;

  }
于 2011-07-13T14:18:00.873 に答える
2

これにも出くわした。たくさんの答えがありますが、私が提供しようとしている単純で正しいものは1つだけです。重要なのは、$。ajax call..syncを作成することです!

$.ajax({  
    async: false, ...
于 2012-08-23T14:35:11.943 に答える
2

イベントの「document.ready」段階で、jQuery ajax の結果を変数に入れるのに本当に苦労しました。

ページが既にロードされた後にユーザーが選択ボックスの「onchange」イベントをトリガーすると、jQuery の ajax が変数にロードされますが、ページが最初にロードされたときにデータが変数にフィードされませんでした。

私はたくさんの方法を試しましたが、最終的にはCharles Guilbertの方法が私にとって最も効果的でした.

チャールズ・ギルバートに脱帽!彼の答えを使用すると、ページが最初に読み込まれたときでも、変数にデータを取得できます。

作業スクリプトの例を次に示します。

    jQuery.extend
    (
        {
            getValues: function(url) 
            {
                var result = null;
                $.ajax(
                    {
                        url: url,
                        type: 'get',
                        dataType: 'html',
                        async: false,
                        cache: false,
                        success: function(data) 
                        {
                            result = data;
                        }
                    }
                );
               return result;
            }
        }
    );

    // Option List 1, when "Cats" is selected elsewhere
    optList1_Cats += $.getValues("/MyData.aspx?iListNum=1&sVal=cats");

    // Option List 1, when "Dogs" is selected elsewhere
    optList1_Dogs += $.getValues("/MyData.aspx?iListNum=1&sVal=dogs");

    // Option List 2, when "Cats" is selected elsewhere
    optList2_Cats += $.getValues("/MyData.aspx?iListNum=2&sVal=cats");

    // Option List 2, when "Dogs" is selected elsewhere
    optList2_Dogs += $.getValues("/MyData.aspx?iListNum=2&sVal=dogs");
于 2012-09-19T17:22:14.297 に答える
1

スレッドが古いことは知っていますが、他の誰かがこれを役立つと思うかもしれません。jquey.comによると

var bodyContent = $.ajax({
  url: "script.php",
  global: false,
  type: "POST",
  data: "name=value",
  dataType: "html",
  async:false,
  success: function(msg){
     alert(msg);
  }
}).responseText;

結果を文字列に直接取得するのに役立ちます。.responseTextに注意してください。部。

于 2011-08-26T10:31:35.557 に答える
0

IMO では、このデータをグローバル変数に保存できます。ただし、より一意の名前を使用するか、名前空間を使用する方が適切です。

MyCompany = {};

...
MyCompany.cachedData = データ;

また、これらの目的には json を使用することをお勧めします。通常、json 形式のデータは、xml 形式の同じデータよりもはるかに小さくなります。

于 2009-05-25T04:35:03.803 に答える
0

これを使うだけです。シンプルで効果的:

var y;

function something(x){
return x;
}

$.get(bunch of codes, function (data){

y=something(data);
)}

//anywhere else
console.log(y);
于 2020-04-23T16:39:31.847 に答える
0

サーバーから大きな XML ファイルをフェッチすることは避けることをお勧めします。変数 "xml" は、データ ストア自体としてではなく、キャッシュのように使用する必要があります。

ほとんどのシナリオでは、キャッシュを調べて、必要なデータを取得するためにサーバーに要求を行う必要があるかどうかを確認できます。これにより、アプリが軽量かつ高速になります。

乾杯、ジュニア。

于 2009-05-25T05:06:16.977 に答える
0

.get 応答はデフォルトでキャッシュされます。したがって、目的の結果を得るために何もする必要はありません。

于 2009-05-25T05:06:52.873 に答える