2015-12-16 80 views
0

我發送一個xhttprequest來從XML文件中檢索一些元素。但是,它似乎返回大約8次:前6次不完整,其他2次返回XML中的所有項。很明顯,我只想要一次就完成了。xhttprequest返回多次

的XML文件在http://www.boardgamegeek.com/xmlapi/collection/Zuiderspel?own=1&version=1

發現該網站在http://i298619.iris.fhict.nl/zuiderspel/spellen/ 發現正如你可以看到,遊戲顯示多次(遊戲「煉金術士」應顯示兩次,因爲它是,但例如遊戲'99機會'在列表中被返回幾次)。

檢查控制檯以查看我的意思。

我怎麼能阻止多次返回的請求,所以每個遊戲都只顯示一次?

我的代碼:

<script type="text/javascript"> 
    function loadDoc() { 
    var xhttp = new XMLHttpRequest(); 

    xhttp.onreadystatechange = function() { 
     if (true) { 
     myFunction(xhttp); 
     } 
    }; 

    xhttp.open("GET", "../wp-content/uploads/2015/12/Zuiderspel.xml", true); 
    xhttp.send(); 

    } 


    function myFunction(xml) { 
    console.log(xml); 
    var x, i, xmlDoc, table, spellen, newDiv, newDivImg, stand, jaar, minspelers, maxspelers, speeltijd; 
    var parser = new DOMParser(); 
    var xmlDoc = parser.parseFromString(xml.responseText, "application/xml"); 
    x = xmlDoc.getElementsByTagName("item"); 

    for (i = 0; i < x.length; i++) { 
     spellen = x[i].getElementsByTagName("name")[0].childNodes[0].nodeValue; 
     thumbs = x[i].getElementsByTagName("thumbnail")[0].childNodes[0].nodeValue; 
     stand = x[i].getElementsByTagName("comment")[0].childNodes[0].nodeValue; 
     jaar = x[i].getElementsByTagName("yearpublished")[0].childNodes[0].nodeValue; 

     newDiv = document.createElement("div"); 
     newDiv.id = "div" + i; 
     newDiv.className = "spelClass"; 
     newDiv.style.backgroundImage = "url(" + thumbs + ")"; 
     newDiv.innerHTML = "<b>" + spellen + "</b><br />" + stand + "<br />" + jaar; 
     document.getElementById("spellen").appendChild(newDiv); 

    } 
    } 

    loadDoc(); 

</script> 
<div id="spellen"> 

</div> 
+0

我認爲這可能與第一個if語句有關,只是'if(true)'。 這應該是'如果(xhttp.readyState == 4 && xhttp.status == 200)'但這給了我意想不到的標記非法 – user3287470

+0

'這給了我意外的標記非法'....你想寫出了整個錯誤,因爲這看起來只是我錯誤信息的一部分...是的,你需要檢查'readyState'和'status' ...或使用'.onload'來代替 –

+0

這就是確切的錯誤,僅此而已。但是,單獨添加就緒狀態和狀態(所以在兩個不同的if語句之後)會修復它。看起來像WordPress不喜歡和符。 雖然這會導致一個新問題:XML包含約145個文件,但僅返回約20個文件。似乎onreadystatechange不能正常工作 – user3287470

回答

0

readystatechange事件不保證該請求被完成。這意味着它改變了readyState

你需要做的是檢查readyState是否4(完成),然後調用你的函數。當請求完成時還會觸發其他事件,例如loadloadend

+0

我做現在檢查'4'。我也不再在頁面編輯器中直接使用我的JS,但是我將它稱爲外部,以防止Wordpress向我提供我在錯誤中描述的非法令牌錯誤 但是,如果您查看http://i298619.iris.fhict。 nl/zuiderspel/pages-1 /,你可以看到它給了16場比賽兩次,而不是一次145場比賽。 在我看來,即使我檢查4上的readystatechange和200上的狀態,它仍然在完成前執行。或者類似的東西.. – user3287470

+0

你可以調用函數('loadDoc')兩次,這就是爲什麼它是重複的東西。你的腳本中還有一些其他錯誤... – MinusFour

+0

該死的,我完全忽略了這一點,謝謝!導致錯誤的另一件大事是,我沒有檢查一些XML元素是否爲空,導致JavaScript停止運行。現在一切正常,非常感謝。 – user3287470