2013-10-07 92 views
4

我一直拉着我的头发试图使这个简单的代码工作。它应该在给定的DOM中呈现输入字段,但它不会。为什么不?通过生成器函数未添加到DOM的元素

var elems = 10; 

function generateElems() { 

    for (var i = 0; i < elems; i++) { 
     document.getElementsByTagName("div")[0].appendChild(document.createElement('input')); 
    } 

    //Clean up 
    var obj = null; 
    var elems = null; 
} 

generateElems(); 
+1

'var elems = null;'is * not * cleanup,它是破坏脚本的冗余代码。你不需要这样“清理”变量。 – meagar

+0

我们还需要查看您的HTML结构。你的文件是否有DIV标签? –

+0

什么是'obj'?请向我们展示您的完整脚本和演示如何使用它(包括HTML标记)。用这个“清理”,你不能调用这个函数两次,但是你现在发布的内容应该可以工作。 – Bergi

回答

9

Working DEMO

您在这里处理JavaScript变量吊装。删除这行var elems = null;,你的代码应该可以工作。

在JavaScript中声明所有变量在函数体的顶部被认为是最佳实践。

阅读此文章以获取关于JavaScript的更多信息hoisting

正如我们正在讨论最佳实践一样,值得注意的是,在循环中追加元素对于性能来说是一个坏主意。您应该使用createDocumentFragment来代替元素,然后将其转储到DOM。它可以节省昂贵的文档重排,并在性能上产生重大影响。

var elems = 10; 

function generateElems() { 

    var d=document.createDocumentFragment(); 

    for (var i = 0; i < elems; i++) { 
     d.appendChild(document.createElement('input')); 
    } 

    document.getElementsByTagName('div')[0].appendChild(d); 

    //Clean up 
    //var obj = null; 
    //var elems = null; ----> Commented out this line, it was causing the problem. 
} 

generateElems(); 
0

不要将榆树设置为空。

var elems = 10; 

function generateElems() { 

    for (var i = 0; i < elems; i++) { 
     document.getElementsByTagName("div")[i].appendChild(document.createElement('input')); 
    } 
} 


generateElems();