Javascript 虽然对象存在,但未定义JS Ajax onreadystatechange

Javascript 虽然对象存在,但未定义JS Ajax onreadystatechange,javascript,ajax,object,defined,onreadystatechange,Javascript,Ajax,Object,Defined,Onreadystatechange,我已经为此挣扎了一天了,如果我能转圈帮忙,我将不胜感激:-) 摘要 异步ajax使用解析器和fqdn变量调用cgi,以便重新返回此对的dns解析。(返回dig@resolver$fqdn的输出) 问题 在firebug中,我可以看到get请求是异步触发的,对浏览器的响应与预期的一样。但是,我无法将响应放在文档中的正确div中,因为onreadystatechange无法识别对象 旁注 除了我在遍历对象数组这一事实之外,它们似乎都是即时触发的,即使在迭代之间设置了延迟。 下面是我的注释代码 因为

我已经为此挣扎了一天了,如果我能转圈帮忙,我将不胜感激:-)

摘要
异步ajax使用解析器和fqdn变量调用cgi,以便重新返回此对的dns解析。(返回dig@resolver$fqdn的输出)

问题
在firebug中,我可以看到get请求是异步触发的,对浏览器的响应与预期的一样。但是,我无法将响应放在文档中的正确div中,因为onreadystatechange无法识别对象

旁注
除了我在遍历对象数组这一事实之外,它们似乎都是即时触发的,即使在迭代之间设置了延迟。

下面是我的注释代码
因为解析器是一个数组,所以我创建了一个xmlhttprequest对象数组。

function resolve() { 
     var numofres = 6;
     var arr = new Array;
     arr[0] = "192.168.1.11";
     arr[1] = "8.8.8.8";
     arr[2] = "8.8.4.4";
     arr[3] = "159.134.0.1";
     arr[4] = "159.134.0.2";
     var len = arr.length;
     var ax  = new Array(); //creating ax as an array 
     for (var i=0; i<=len; i++) {  //iterating through the length of resolvers array
         ax[i] = new XMLHttpRequest(); //assigning to each item in array new object
         //alert(ax[i]); // shows that object exists 
         ax[i].onreadystatechange = function(){ 
              /*=== 
              problem is above - firebug will show:
              **Uncaught TypeError: Cannot read property 'readyState' of undefined**
              **ax.(anonymous function).onreadystatechangehello.cgi:30** 
              oddly it will still populate divs inner html  with 'loading +1 '
              albeit regardless of readystate code (can be 4 or anything else )
              It perplexes me why i is thought as a function? 
              =====*/
              // alert(i);  //if this is enabled I will see readyState==4 populated correctly
              if (ax[i].readyState != 4) {
                   document.getElementById('return_table_'+i).innerHTML="loading "+i;
              }
              if(ax[i].readyState == 4){
                  // get data from the server response
                  var response_ready=ax[i].responseText;
                  document.getElementById('return_table_'+i).innerHTML = response_ready;
              }
         } 
         ax[i].open("GET","av.pl?resolver=" + arr[i] +"&fqdn=google.com",true); //works 
         ax[i].send(null); //works 
      }

 }
函数解析(){
var numofres=6;
var-arr=新数组;
arr[0]=“192.168.1.11”;
arr[1]=“8.8.8.8”;
arr[2]=“8.8.4.4”;
arr[3]=“159.134.0.1”;
arr[4]=“159.134.0.2”;
var len=阵列长度;
var ax=new Array();//将ax创建为数组

对于(var i=0;i您的问题非常常见。在JavaScript中,变量的作用域是在函数级别,而不是在块语句级别。因此,当您使用变量“i”迭代该循环时,在循环中创建的每个函数共享相同的“i”。因此,当实际调用函数时“i”将是循环结束时的状态-这是数组结束后的一个点

为了避免此问题,您需要在另一个函数中创建这些函数。一种干净的方法是使用单独的本地函数:

 function makeReadyStateHandler(i) {
     return function() {
          if (ax[i].readyState != 4) {
               document.getElementById('return_table_'+i).innerHTML="loading "+i;
          }
          if(ax[i].readyState == 4){
              // get data from the server response
              var response_ready=ax[i].responseText;
              document.getElementById('return_table_'+i).innerHTML = response_ready;
          }
     };
 }
然后从循环中调用该函数:

      ax[i].onreadystatechange = makeReadyStateHandler(i);

通过使用这样一个单独的函数,您可以确保每个处理程序函数都有自己的“i”副本“这在循环中的正确点被冻结。函数将返回一个新创建的函数作为其结果,您将使用它作为事件处理程序。

我的好先生!非常感谢您对我的问题给出了详细完整的答案。怀疑的循环被打破了,函数现在按预期工作,使我成为一个更快乐、更聪明的人:-)