2011-02-28 79 views
1

這是部分代碼:JavaScript的導通元件從一個功能到另一個

function readXmlUsingXPath(i,guid, xpath) { 
    var xmlDoc = loadXML("gameFeed.aspx?guid=" + guid); 
    if (xmlDoc == null) { document.getElementById(guid).innerHTML = "UPDATING"; return } 
    else { }; 
    i.innerHTML = xmlDoc.selectNodes(xpath)[0].text; 
} 

window.onload = function() { 
    for (var i = 0; i < document.getElementsByTagName('jackpot').length; i++) { 
     var guid = document.getElementsByTagName('jackpot')[i].getAttribute('data-g').split('|')[0]; 
     var xpath = document.getElementsByTagName('jackpot')[i].getAttribute('data-g').split('|')[1]; 
     readXmlUsingXPath(document.getElementsByTagName('jackpot')[i],guid, xpath); 
    } 
} 

基本上,我想要做的是從的onload函數傳遞元素,給readXmlUsingXpath功能,所以我可以改變它。 ,但我得到一個未知的運行時錯誤...

的要求,一些樣品的html:

<li> 
<a href="/gamepath/"><span>gameTitle</span> 
<span><jackpot data-g="<%=game.Guid %>|<%=game.GamingProperties.JackpotFeedXpath %>">UPDATING . . .</jackpot></span> 
</a> 
</li> 
+1

請不要關於jQuery的建議。 – Dementic

+0

您能否展示您選擇的HTML樣本?另外,你應該在'for'循環之外緩存'getElementsByTagName()'調用的結果。像這樣重複的DOM選擇非常昂貴。 – user113716

+0

什麼/你的錯誤在哪裏?你的代碼在快速檢查時看起來很好。 – hvgotcodes

回答

0

好的,所以我修改了一下代碼, 並且使它更簡單。

現在它的工作原理如下。

function loadXMLDoc(guid,xpath,i) { 

    var xmlhttp; 
    if (window.XMLHttpRequest) {xmlhttp = new XMLHttpRequest();} 
    else {xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");} 
    xmlhttp.async = true; 
    xmlhttp.onreadystatechange = function() { 
     if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
      i.innerHTML = xmlhttp.responseXML.selectNodes(xpath)[0].text; 
     } 
    } 
    xmlhttp.open("GET", "gameFeed.aspx?guid=" + guid, true); 
    xmlhttp.send(); 
} 

var tags = document.getElementsByTagName("pre"); 
for (var i = 0; i < tags.length; i++) { 
    var data = tags[i].getAttribute('data-g').split('|'), guid = data[0], xpath = data[1]; 
    loadXMLDoc(guid,xpath,tags[i]); 
} 
1

嗯,首先,是的 - 緩存getElementsByTagName().getAttribute('data-g').split('|')結果到一個變量:

var myDataG = MyJackpotElement.getAttribute('data-g').split('|'); 

然後,不要處理來自HTML源代碼的XPath,因爲無論如何您都要將​​傳遞給服務器端腳本,請讓服務器腳本處理服務器端的項目(使用XPath) - 所以它會得到你使用GUID :)

加載使服務器端腳本的項目XPath表達式返回你你正在尋找gameFeed.aspx?guid=)的值,而不是XML,你將進一步在客戶端進行查找價值。

+0

我不能讓服務器腳本做到這一點, 因爲每個請求都去了其他服務器, 要求所有這些值將需要時間, ,而我更願意顯示用戶一些「行動」,而他等待。 一個接一個做,我可以更新狀態。 – Dementic

+0

和約緩存等,我仍然工作在這個代碼, 其只是一個樣本分解,幸運的是你guyz不建議改變變量名等.... 我只是問了一個簡單的問題... :( – Dementic

0

根據Denis的建議重構代碼後代碼是否工作?

即使除了巨大的性能打擊之外,您繼續執行getElementsByTagName的方式的一個主要問題是如果集合因任何原因而更改,則長度可能不再正確,並且您可能正在請求元素9只有8個存在。

此外,更改元素的innerHTML可能會導致瀏覽器關閉。

Side nit:我已將readXmlUsingXPath函數的i參數重命名爲jackpot,這似乎比i稍合適一些。

function readXmlUsingXPath(jackpot, guid, xpath) { 
    var xmlDoc = loadXML("gameFeed.aspx?guid=" + guid); 
    if (xmlDoc == null) { 
     document.getElementById(guid).innerHTML = "UPDATING"; 
     return; 
    } 
    var firstNode = xmlDoc.selectNodes(xpath).item(0); 
    jackpot.innerHTML = firstNode.text; 
} 

window.onload = function() { 
    var jackpots = document.getElementsByTagName('jackpot'); 
    for (var i = 0; i < jackpots.length; i++) { 
     var data = jackpots[i].getAttribute('data-g').split('|'), 
     guid = data[0], 
     xpath = data[1]; 
     readXmlUsingXPath(jackpots[i], guid, xpath); 
    } 
} 
+0

該對象由'getElementsByTagName'返回的文件是實時的,所以即使文檔在迭代過程中發生了變化,它們也會自動反映到''jackpots''對象中。例子見[snippet](http://jsfiddle.net/anurag/uqahJ/) 。 – Anurag

+0

@Auurag對於直播列表是正確的,雖然在問題的代碼中甚至都沒有問題,因爲OP正在提出一個單獨的請求*來獲得'length',所以如果所有的' Jackpot'元素消失了,'i'不會再小於''長度',並且你不會爲'for'循環輸入塊,它會中斷的方式是如果你在循環,那麼'j的數量ackpot'元素改變了。 – user113716

+0

謝謝guyz,但由於我沒有找到解決辦法,我會嘗試一個不同的方法。 我會盡快更新這個線程,當我找到一個。 @martijn - 只是一個問題,爲什麼你將兩個變量(guid,xpath)更改爲一個數組? – Dementic

相關問題