使用javascript通过div中的链接循环

时间:2014-04-04 11:00:55

标签: javascript loops

我有一个hta应用程序,它使用xslt解析一些xml,并在hta页面中用结果填充div。结果包含一个表,其中包含xml的摘要以及xml元素计数的超链接 - 示例如下

页面上有一个按钮,在“content”div之外,允许用户将页面保存到没有超链接的静态html文件。我在下面有以下javascript,但是当点击“保存”按钮时,超链接仅从第一个项目中移除,而不是第二个项目..(在正确的版本中将会有更多的实际超链接)。我做错了什么 - 我认为它与循环有关......并且必须在javascript中完成,没有jquery等 - 长篇故事为什么......

function SaveContent() {
    var myContent = document.getElementById("content")
    var myLinks = myContent.getElementsByTagName('a')

    for (var myItem = 0; myItem < myLinks.length; myItem++) {
        var myChild = myLinks[myItem]
        var myParent = myChild.parentNode
        var myValue = myChild.innerText
        myChild.parentNode.removeChild(myChild)
        myParent.innerText = myValue
        /*code to save to file will go here */
    }
}

<div id="content">
    <table>
        <tr>
            <td>Status</td>
            <td>Count</td>
        </tr>
        <tr>
            <td>New</td>
            <td>
                <a href="#">34</a>
            </td>
        </tr>
        <tr>
            <td>Closed</td>
            <td>
                <a href="#">78</a>
            </td>
        </tr>
    </table>
</div>

非常感谢

2 个答案:

答案 0 :(得分:2)

getElementsByTagName是一个实时列表。当您在某个项目上调用removeChild时,它会从列表中删除...但您的循环索引会继续显示!

典型的解决方案是:

for( var myItem = myLinks.length-1; myItem >= 0; myItem--)

即。从最后到开始工作。如果您的代码可能添加更多链接,这也很好,因为它们不会被迭代。

答案 1 :(得分:0)

试试这个:

    function SaveContent() {
        var myContent = document.getElementById("content")
        var myLinks = myContent.getElementsByTagName('a')

        while (myLinks.length) {
            var child = myLinks[0];
            var parent = child.parentNode;
            var value = child.innerText;
            parent.removeChild(child);
            parent.innerText = value;               
        }
    }