javascript将元素从一个函数传递到另一个函数

时间:2011-02-28 16:17:58

标签: 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>

3 个答案:

答案 0 :(得分:1)

嗯,首先,是的 - 将getElementsByTagName().getAttribute('data-g').split('|')的结果缓存到变量中:

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

然后代替处理来自HTML源代码的XPath,因为无论如何都要将guid传递给服务器端脚本,让服务器脚本处理服务器端的项目(使用XPath) - 所以它会从Guid :)加载的项目中获取xpath表达式

使服务器端脚本返回您要查找的值gameFeed.aspx?guid=),而不是您将在客户端进一步处理以查找值的XML。< / p>

答案 1 :(得分:0)

根据Denis的建议重构后,代码是否有效?

执行getElementsByTagName的方式的一个大问题,即使除了巨大的性能损失之外,如果集合因任何原因而发生更改,则长度可能不再正确,并且您可能只请求元素9 8存在。

此外,更改元素的innerHTML可能会导致浏览器失效。

Side nit:我已将i函数的readXmlUsingXPath参数重命名为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);
    }
}

答案 2 :(得分: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]);
}