2009-08-12 78 views
0

我是新来的阿贾克斯,这让我难住。这是相对简单的,但在第一个xhr.open()的onclick处理程序上运行。 Firebug说这不是一个函数,我的猜测是XMLHttpRequest对象没有被创建,但我不确定。有人有主意吗?XMLHttpRequest对象没有被实例化?

在此先感谢。

function init(){ 

function getXMLHTTP(){ 
    var xhr = false; 
    if (window.XMLHttpRequest) { 
     xhr = new XMLHttpRequest(); 
    } 
    else if (window.ActiveXObject) { 
      xhr = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    return xhr; 
} 

function updatePage(theData){ 
    $('results').innerHTML = theData; //TODO: pretty this up with mootools 
} 

var xhr = getXMLHTTP(); 

if (xhr) { 
    xhr.onreadystatechange = function(){ 
     if (xhr.readyState == 4) { 
      if (xhr.status == 200) { 
       var theData = xhr.responseText; 
       updatePage(theData);    
      } 
      else{ 
       alert("Error communicating to web service!"); 
      } 
     } 
    } 

    $('submit_btn').onclick = function(xhr){ 
     if ($('state').value != "") { 
      var theValue = $('state').value; 
      xhr.open("GET", "/inc/calc.php?state="+theValue, true); //Ajax 101: 3rd argument marks object as asynchronous 
      xhr.send(NULL); 
     } 
     else if ($('city').value != "") { 
      xhr.open("GET", "/inc/calc.php?city="+$('city').value, true); 
      xhr.send(NULL);   
     } 
     else if ($('county').value != "") { 
      xhr.open("GET", "/inc/calc.php?county="+$('county').value, true); 
      xhr.send(NULL);   
     } 
     else { 
      //the form is empty, or just down payment is filled. returns whole freakin' table. 
      xhr.open("GET", "/inc/calc.php", true); 
      xhr.send(NULL);    
     } 
    } 
} 

}

+0

你确定你不是叫false.open() 检查类XHR的Firebug控制台。 – klochner 2009-08-12 01:47:46

回答

1

与您的代码的问题是的onclick功能。你已经把xhr放在函数的参数列表中。请记住,当一个函数被调用时,这个变量的值由调用者设置。在这种情况下,它将是事件调度程序,它可能会将xhr变量设置为事件对象,该对象没有打开的函数。

如果您从的onclick函数的参数列表中的XHR变量,那么它会寻找父范围,在全球范围内XHR变量,它会找到它,它应该工作。我还没有测试过它。

我假设你正在使用某种框架,以及(由频繁使用$的判断,并引用MooTools的)。这个框架可能有一个内置的ajax函数,以及一个跨浏览器事件模型。尝试使用它,你会遇到更少的问题。

0

分配时创建新的函数,它接受一个名为xhr参数onclick处理程序:

$('submit_btn').onclick = function(xhr){ 
    ... 
    xhr.open("GET", "/inc/calc.php?state="+theValue, true); 
    ... 
} 

按钮上的点击将无法通过一个XMLHttpRequest对象的处理程序,所以xhr不会有open()方法。 xhr的全局定义并不重要,因为它受到本地参数定义的影响。

通常,您应该在需要时生成新的本地XMLHttpRequest对象,而不是尝试使用全局的XMLHttpRequest对象。例如使用onclick功能,创建一个新的本地的XMLHttpRequest:

$('submit_btn').onclick = function(){ 
    var xhr = getXMLHTTP(); 
    xhr.open("GET", "/inc/calc.php?state="+theValue, true); 
    ... 
}