0

私は AJAX のことにはかなり慣れていませんが、コールバック関数 xmlHttpReq.onreadystatechange で変更されたステータスに基づいて、ドキュメントのグローバル変数に値を設定したいと考えています。次のようなものを使用しました。

function checkFile(fileUrl) {
    var xmlHttpReq = false;
    var self = this;
        // Mozilla/Safari
    if (window.XMLHttpRequest) {
        self.xmlHttpReq = new XMLHttpRequest();
    }
    // IE
    else if (window.ActiveXObject) {
        self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
    }

    if(self.xmlHttpReq == null){
    alert("Your browser does not support XMLHTTPReq")
    }

    self.xmlHttpReq.open('HEAD', fileUrl, true);
    self.xmlHttpReq.onreadystatechange = function() {
        if (self.xmlHttpReq.readyState == 4) {
            if (self.xmlHttpReq.status == 200) { 
         window.rett = 1;
        //alert(window.rett);
           } else if (self.xmlHttpReq.status == 404) { 
         window.rett = 0;
        //alert(window.rett);
            }
        }
    }
    self.xmlHttpReq.send(); 
}

そして、私は次のcheckFileようにjqueryテンプレートで使用します:

<script id="resultTemplate" type="text/x-jquery-tmpl"> 
        <li> ${checkFile(link)} <b> {{if window.rett ==  1 }} ${link}   {{/if}}</b> </li> 
    </script>

しかしwindow.rett、Jquery テンプレートで にアクセスすると、未定義と表示されます...

グローバル値を取得したい理由は、グローバル値に基づいて異なる GUI を生成したいからです。

たぶん、これはグローバル変数を使用する良い習慣ではありませんか? どんな提案でも大歓迎です。

4

1 に答える 1

1

おそらく、アクセスしようとした時点で、AJAX リクエストがまだ完了していない (状態 4 に達していない) ため、グローバルが宣言されていない (または、宣言されている場合は、前の結果の値がまだ含まれている) ためです。

コールバック内からテンプレートを使用することをお勧めします。そうすれば、テンプレートが値をチェックするまでに、値はすでにそこにあります。

function yourAjaxFunction(arg1, arg2,...,callback){

  //all AJAX setup codes here

  if (self.xmlHttpReq.readyState === 4) {
    if (self.xmlHttpReq.status === 200) { 
      //sending the callback a 1
      callback(1);
    } else if (self.xmlHttpReq.status === 404) { 
      //sending the callback a 1
      callback(0);
    }
  }

  //AJAX send codes

}

//how you should use it
yourAjaxFunction(arg1,arg2,...,function(rett){
  //use rett here
  //parse template here
});
于 2013-04-06T06:13:29.243 に答える