4

首先对这个初学者问题感到抱歉,但我最近才学习 JavaScript,现在正在学习开发 Windows 8 应用程序。这是有问题的代码:

        var numbers = [1, 2, 3, 4, 5];
        id('numberList').innerHTML = '<ul>';
        for (var x in numbers) {
            id('numberList').innerHTML += '<li>' + x + '</li>';
        }
        id('numberList').innerHTML = '</ul>';

我在我的 JS 文件中的“就绪”函数(适用于任何 Windows 8 开发人员)中有这个,并且“numbersList”指的是(HTML 文件的)正文中的部分标记。当我运行应用程序时,该列表根本不显示。但是,当我只是尝试添加文本而不是像这样的列表时

       id('numberList').innerHTML = 'hello';

文字确实出现了。我尝试插入 html 元素的方式可能有问题吗?

4

2 回答 2

5

你不能像那样添加非法的 HTML。带有 no的<ul>标签</ul>是非法的。在字符串变量中构建整个 HTML 字符串,然后添加一段合法的 HTML 或构建单独的 DOM 元素,将内容放入其中并将它们添加到 DOM。

此外,您不会迭代数组,for (var x in numbers)因为它会迭代对象的属性,而不仅仅是数组元素,虽然它在某些情况下会起作用,但通常是不应该使用的不好的做法。

您可以修复这些错误并构建一个 HTML 字符串,然后在末尾添加一次,如下所示:

    var numbers = [1, 2, 3, 4, 5];
    var str = '<ul>';
    for (var x = 0; x < numbers.length; x++) {
        str += '<li>' + numbers[x] + '</li>';
    }
    str += '</ul>';
    id('numberList').innerHTML = str;

为了完整起见,您还可以构建单独的 DOM 元素:

    var numbers = [1, 2, 3, 4, 5];
    var ul = document.createElement("ul"), li, tx;
    for (var x = 0; x < numbers.length; x++) {
        li = document.createElement("li");
        tx = document.createTextNode(numbers[x]);
        li.appendChild(tx);
        ul.appendChild(li);
    }
    var parent = id('numberList');
    parent.innerHTML = "";
    parent.appendChild(ul);

您可能还需要注意,您最初编写的代码不是检索数组元素numbers[x],而是使用数组索引x(恰好与内容相同,因此您不会注意到示例代码中的差异)。由于这可能不是您想要的,您可能也想解决这个问题。

于 2013-04-18T01:38:11.887 回答
5

你永远不应该使用+=with innerHTML。相反,构建字符串,然后一次将其全部放入,否则引擎将尝试更正您不完整的 HTML。

var numbers = [1,2,3,4,5], str;
str = "<ul>";
for( var x in numbers) str += "<li>"+x+"</li>";
str += "</ul>";
id("numberList").innerHTML = str;

话虽如此,“更好”的方法如下:

var numbers = [1,2,3,4,5], ul = document.createElement('ul');
for( var x in numbers) ul.appendChild(document.createElement('li')).appendChild(document.createTextNode(x));
var nl = id("numberList");
while(nl.firstChild) nl.removeChild(nl.firstChild);
nl.appendChild(ul);
于 2013-04-18T01:39:15.273 回答