2012-12-14 69 views
1
function load(){ 
    var row="<tr><td><select id=\"chooseclass\"><option value=\"math\">Math</option><option value=\"phys\">Physics</option><option value=\"lit\">Literature</option><option value=\"chem\">Chemistry</option><option value=\"bio\">Biology</option><option value=\"lang\">Language</option><option value=\"proj\">Project</option><option value=\"elec\">Elective</option></select></td><td><input id=\"choosemods\" type=\"text\" /></td><td><input id=\"choosegrade\" type=\"text\" /></td></tr>"; 
    var tablebody = document.getElementById("classestable"); 
    tablebody.innerHTML += "<tbody></tbody>"; 
    tablebody.getElementsByTagName("tbody").innerHTML = ""; 
    for(var i=0;i<15;i++){ 
     tablebody.getElementsByTagName("tbody").innerHTML += row; 
    } 
} 

上述代码运行良好,但row的内容未添加到tbody无法在表格中添加新行

console.log显示row的内容是有效的html,并且控制台中没有错误。为什么没有被添加?

+0

而不是'tablebody.getElementsByTagName(“tbody”)'',使用'tablebody.tBodies [0]' – Ian

+0

对元素使用'.innerHTML'很难年龄...查看'insertRow','insertCell','createElement'和'appendChild' – Ian

+0

而且你不应该在15次放置同一行 - 那里有相同的'id'属性的元素,这是HTML不允许的。那么,至少你会难以用Javascript操纵每一个... – Ian

回答

3

的getElementsByTagName返回一个节点列表,你使用节点的索引

我就这样,你只扫描DOM的代码更改为以下

var innerRow = ""; 

for(var i=0;i<15;i++){ 
    innerRow += row; 
} 

tablebody.getElementsByTagName("tbody")[0].innerHTML = innerRow 

访问它的第一个节点一次不是15次

2

无法在Internet Explorer的表格上使用innerHTMLgetElementsByTagName返回NodeList而不是单个节点,并且表格还具有tBodies属性。

你修改后的代码应该是:

function load(){ 
    var tr = document.createElement('tr'), td; 
    td = tr.appendChild(document.createElement('td')); 
    td.innerHTML = "<select id=\"chooseclass\"><option value=\"math\">Math</option><option value=\"phys\">Physics</option><option value=\"lit\">Literature</option><option value=\"chem\">Chemistry</option><option value=\"bio\">Biology</option><option value=\"lang\">Language</option><option value=\"proj\">Project</option><option value=\"elec\">Elective</option></select>"; 
    td = tr.appendChild(document.createElement('td')); 
    td.innerHTML = "<input id=\"choosemods\" type=\"text\" />"; 
    td = tr.appendChild(document.createElement('td')); 
    td.innerHTML = "<input id=\"choosegrade\" type=\"text\" />"; 
    var tablebody = document.getElementById("classestable").tBodies[0]; 
    for(var i=0;i<15;i++){ 
     tablebody.appendChild(tr.cloneNode(true)); 
    } 
} 
+0

为什么你要创建和附加一个已经隐式存在的'tbody'? – Ian

+0

因为我不直想XD –

+0

哈哈没问题,只是想知道。另一个问题 - 什么是'tr.cloneNode(true)'?为什么不只是追加'tr'?这一个我不知道 – Ian

0

没有一点增加每次DOM的循环运行。将它添加到html变量并执行一个dom事务。

function load(){ 
    var html= ''; 
    var row="<tr><td><select id=\"chooseclass\"><option value=\"math\">Math</option><option value=\"phys\">Physics</option><option value=\"lit\">Literature</option><option value=\"chem\">Chemistry</option><option value=\"bio\">Biology</option><option value=\"lang\">Language</option><option value=\"proj\">Project</option><option value=\"elec\">Elective</option></select></td><td><input id=\"choosemods\" type=\"text\" /></td><td><input id=\"choosegrade\" type=\"text\" /></td></tr>"; 
    var tablebody = document.getElementById("classestable"); 
    tablebody.innerHTML += "<tbody></tbody>"; 
    tablebody.getElementsByTagName("tbody").innerHTML = ""; 
    for(var i=0;i<15;i++){ 
     html += row; 
    } 
    tablebody.getElementsByTagName("tbody")[0].innerHTML = html;// Select first element from array of nodes 
} 
+1

请不要在没有解释的情况下发布代码...... –

+0

这仍然没有解决IE不允许'

'元素中的'innerHTML'这一事实。 –

+1

@Kolink没有人使用IE,对吧?哦,这些日子...... – Ian

1

你可以尝试使用的查询选择,而不是getElementsByTagName

document.querySelector('#classettable tbody').innerHTML += row;