2011-03-20 115 views
2

我正在嘗試使用Java腳本作爲基於java的寧靜web服務的客戶端。該服務是一個調查製造商。我無法正常工作。服務的服務器端位於Google App Engine中。在下面的代碼中,函數使用http get來獲取表示調查名稱列表的XML,然後從XML獲取數據並將其放入HTML表格中。代碼不起作用,所以如果有人能夠檢查它是否正確執行,或者我做錯了什麼,那將是非常好的。我從來沒有在JavaScript中編程過,所以我也想知道是否需要導入一個庫來使用AJAX,或者它是否支持瀏覽器?幫助解析與JavaScript的XML?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 

<head> 
<meta content="en-us" http-equiv="Content-Language" /> 
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> 
<title>View Surveys</title> 
</head> 
<SCRIPT> 
function getSurveyNames(){ 

    var url = "http://survey-creator.appspot.com/rest/surveymakerpro/allsurveys"; 
    var xmlhttp; 
    // AJAX code for Mozilla, Safari, Opera etc. 
    if (window.XMLHttpRequest) { 
     xmlhttp = new XMLHttpRequest(); 
     xmlhttp.onreadystatechange = xmlhttpChange; 
     xmlhttp.open("GET", url, true); 
     xmlhttp.send(null); 
    } 
    // AJAX code for IE 
    else 
     if (window.ActiveXObject) { 
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
      if (xmlhttp) { 
       xmlhttp.onreadystatechange = xmlhttpChange; 
       xmlhttp.open("GET", url, true); 
       xmlhttp.send(null); 
      } 
     } 
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 

     HTMLSurveyNames = "<table border='1'><tr>Survey Names<th></th></tr>"; 

     var surveyNames = xmlhttp.responseXML.documentElement.getElementsByTagName("surveys")[0]; 


     for(var i = 0; i < surveyNames.length ;i++){ 

      var surveyNameChildNode = surveyName[i].childNodes[0]; 
      var name = surveyNameChildNode.nodeValue; 

      HTMLSurveyNames += "<tr><td>"+name+"</td></tr>"; 
     } 
     //div tags 
     document.getElementById('displayNames').innerHTML = HTMLSurveyNames; 

    } 
} 
</SCRIPT> 
<body> 

<p>View Survey</p> 
<form method="post"> 
    <input name="GetSurveys" style="width: 103px" type="button" value="View all surveys" onClick=getSurveyNames(); /></form> 
<p>Here Goes a Table of Surveys</p> 
<div id="displayNames"> 

    <p>Enter the survey you wish to take:</p> 
    <form method="post"> 
     <input id="surveyName" name="SurveyName" style="width: 140px" type="text" value="Enter Survey Name...." /></form> 
    <form method="post"> 
     <input name="Submit2" type="submit" value="Get Survey" /></form> 
    <div id="displaySurvey"></div> 

</div> 
<p> 
     <input id="sendtoserver" name="Submit3" type="submit" value="Submit TakenSurvey" /></p> 

</body> 

</html> 

這是我想分析

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><surveyNames><SurveyList><surveys>DragonBallZ</surveys><surveys>FootballSurvey</surveys><surveys>NewsSurvey</surveys><surveys>PennstateSurvey</surveys></SurveyList></surveyNames> 
+0

您需要閱讀[同源策略](http://en.wikipedia.org/wiki/Same_origin_policy)。 – Haochi 2011-03-20 00:53:17

回答

0
  1. 你送行異步請求,但隨後試圖立即處理結果之前,該請求將完成的XML。

  2. 您應該爲xmlhttp.onreadystatechange指定一個處理程序,該程序會在您的請求進行時執行。您目前將xmlhttpChange分配給此屬性,但您不顯示xmlhttpChange是。你應該做這樣的事情:

    xmlhttp.onreadystatechange = function() { 
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
         // XML parsing code goes here 
        } 
    } 
    
  3. 您不需要導入任何圖書館使用Ajax

  4. 小心像HTMLSurveyNames = "<table border='1'><tr>Survey Names<th></th></tr>";行聲明變量時,你應該始終使用var關鍵字,以避免隱式創建/修改全局變量。

+0

順便說一句,// XML解析代碼放在這裏可以簡化爲//使用xmlhttp.reponseXML,因爲這是一個預先分析的屬性(如果它是成功的,並且響應是我相信是正確的mime型)。 http://www.w3.org/TR/XMLHttpRequest/#the-responsexml-attribute – 2011-03-20 03:32:16

+0

@丹 - 對。我真的想說「XML *處理*在這裏」。 – 2011-03-20 03:43:53

+0

好吧我修改了一下代碼,但仍然沒有收到任何東西,我是否正確使用DOM? – Delanoy 2011-03-20 13:01:02