我有一个jsp页面,其中使用java脚本动态地为表创建行。它在IE以外的所有浏览器中都运行良好。在IE中它显示错误未知运行时错误..
我已经附加了java脚本函数
function addrow(tableID) {
try{
var table = document.getElementById(tableID);
var rowCount = table.rows.length;
var row = table.insertRow(rowCount-1);
var mystring1='<td class="formlabel"><h4>Type </h4></td><td class="formfield"><input type="text" name="type7" id="type8" size="30"/></td><td class="formgap"></td><td class="formlabel"><h4>Description </h4></td><td class="formfield"><textarea name="textarea2" id="textarea2" cols="28" rows="2"></textarea></td>';
row.innerHTML =mystring1;
}catch(e) {
alert(e);
}
}
HTML部分
<table id="table1" width="792" border="0">
<tr class="rowdiv">
<td class="formlabel"><h4>Type </h4></td>
<td class="formfield"><input type="text" name="type7" id="type8" size="30"/></td>
<td class="formgap"></td>
<td class="formlabel"><h4>Description </h4></td>
<td class="formfield"><textarea name="textarea2" id="textarea2" cols="28" rows="2"></textarea></td>
</tr>
<tr class="rowdiv">
<td width="170" class="formlabel"> </td>
<td class="formfield"> </td>
<td class="formgap"></td>
<td class="formlabel"> </td>
<td class="formfield"><h6 onclick="addrow('table1')">Add policy</h6></td>
</tr>
</table>
实际上我已经尝试使用第二个函数将一个表添加到一行..
var mystring2='<td><table width="200" border="1" class="tableborder" align="center"><tr class="rowdiv"><td width="799" class="formheader" ><h4>Comany Details</h4></td></tr><tr><td width="799"><table id="table'+rowCount+'" width="792" border="0"><tr class="rowdiv"><td width="170" class="formlabel"><h4>Company ID </h4></td><td width="205" class="formfield"> </td><td width="20" class="formgap"></td><td width="170" class="formlabel"><h4>Company Name </h4></td><td width="205" class="formfield"><input type="text" name="type" id="type" size="30"/></td></tr><tr class="rowdiv"><td width="170" class="formlabel"><h4>Address </h4></td><td width="205" class="formfield"><textarea name="textarea" id="textarea" cols="28" rows="2"></textarea></td><td width="20" class="formgap"></td><td width="170" class="formlabel"><h4>Phone Number </h4></td><td width="205" class="formfield"><h6><input type="text" name="type2" id="type2" size="30"/></h6></td></tr><tr class="rowdiv"><td width="170" class="formlabel"><h4>Fax Number </h4></td><td class="formfield"><input type="text" name="type3" id="type3" size="30"/></td><td class="formgap"></td><td width="170" class="formlabel"><h4>E Mail </h4></td><td class="formfield"><input type="text" name="type5" id="type5" size="30"/></td></tr><tr class="rowdiv"><td class="formlabel"><h4>Web Site </h4></td><td class="formfield"><input type="text" name="type7" id="type7" size="30"/></td><td class="formgap"></td><td class="formlabel"> </td><td class="formfield"> </td></tr><tr class="rowdiv"><td class="formlabel"><h4>Type </h4></td><td class="formfield"><input type="text" name="type7" id="type8" size="30"/></td><td class="formgap"></td><td class="formlabel"><h4>Description </h4></td><td class="formfield"><textarea name="textarea2" id="textarea2" cols="28" rows="2"></textarea></td></tr><tr class="rowdiv"><td width="170" class="formlabel"> </td><td class="formfield"> </td><td class="formgap"></td><td class="formlabel"> </td><td class="formfield"><h6 onclick="addrow('+"'table"+rowCount+"'"+')"><a href="#">Add row</a></h6></td></tr></table></td></tr> </table></td>';
所有这些代码都在chrome和firefox中运行..
答案 0 :(得分:4)
此错误显示,因为多个元素'innerHTML
属性(包括<tr>
)是只读的 [source] (在IE 6-8中测试过) )。要解决此问题,最好的方法是使用insertCell
方法:
// Variables mystring2, rowCount and table as defined in the question.
var tmp = document.createElement('div'); // <-- Placeholder
tmp.innerHTML = '<table><tr>' + mystring2 + '</tr></table>';
var row = tmp.firstChild.rows[0]; // <-- Created "real" row
var newrow = table.insertRow(table.rows.length); // <-- New dummy row
newrow.parentNode.replaceChild(row, newrow); // <-- Replace dummy with real row
<小时/> 另一种方法:
// Array of innerHTML properties for each cell
var cells = ['<h4>Type </h4>',
'<input type="text" name="type7" id="type8" size="30"/>',
'',
'<h4>Description </h4></td>',
'<textarea name="textarea2" id="textarea2" cols="28" rows="2"></textarea>'];
// Array of `class=` attributes for each cell
var cellClasses = ['formlabel', 'formfield', 'formgap', 'formlabel', 'formfield'];
var table = document.getElementById('t1'); // <-- table
var tr = table.insertRow(table.rows.length-1); // <-- Last row
for (var i=0; i<cells.length; i++) {
var td = tr.insertCell(i); // <-- Insert cell
td.className = cellClasses[i]; // <-- Set class attribute
td.innerHTML = cells[i]; // <-- Set innerHTML
}
答案 1 :(得分:1)
正如我对您的另一个相关问题所评论的那样:元素上的ID必须是唯一的。 Internet Explorer可能拒绝设置innerHTML,因为你最终会得到ID不是唯一的DOM元素,而Firefox和Chrome的限制并不是那么严重。
答案 2 :(得分:1)
您可以尝试在行中创建div并尝试将此HTML设置为div的HTML。因此,如果可以创建具有唯一ID的div,则可以通过更改其innerHTML轻松更新其内容。
答案 3 :(得分:1)
innerHTML
非常不正确。更好的方法是使用本机JavaScript DOM api进行dom操作。
Here工作小提琴的例子。
修改
我在IE9中测试了它,但它也适用于其他IE版本。你不能这样做的原因是XHTML规范禁止修改某些标签的innerHTML属性。其中一个是select
标签。您无法使用innerHTML
修改内部选项。我认为这也适用于表。
从这里开始,这是一个非常好的观点,可以引用一些已经建立自己作为可靠的dom操纵器的库。例如jQuery。
如果你想要做得好,可以使用jQuery。
答案 4 :(得分:1)
对于动态创建表时的IE,您必须始终创建表格行
使用document.createElement( 'TR');
曾经有同样的问题。一旦我添加了这个
就解决了答案 5 :(得分:1)
试试这个。它应该有效。我在IE和Firefox中测试过:
function addrow(tableID) {
var table = document.getElementById(tableID);
var rowCount = table.rows.length;
var row = table.insertRow(rowCount - 1);
var td1 = document.createElement("TD");
td1.innerHTML = "<h4>Type </h4>";
var td2 = document.createElement("TD");
td2.innerHTML='<input type="text" name="type7" id="type8" size="30"/>';
var td3 = document.createElement("TD");
td3.innerHTML = '<h4>Description </h4>';
var td4 = document.createElement("TD");
td4.innerHTML = '<textarea name="textarea2" id="textarea2" cols="28" rows="2"></textarea>';
row.appendChild(td1);
row.appendChild(td2);
row.appendChild(td3);
row.appendChild(td4);
}
答案 6 :(得分:1)
我创建了一个脚本,您可以通过该脚本将内部表添加到表的列中。
我使用了@DragonPrince和@Bui Cuong的概念来开发我的答案。
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<script language="javascript">
function addtabletesting(tableID) {
var table1 = document.getElementById(tableID);
var rowCount1 = table1.rows.length;
var row1 = table1.insertRow(rowCount1-1);
var td1 = document.createElement("TD");
/*
creating a new row row1 andadded a column td1
*/
var table2= document.createElement("TABLE");
var rowCount2 = table2.rows.length;
var row2 = table2.insertRow(rowCount2);
var td2 = document.createElement("TD");
/*
Created a new table table2 added row2 and td2.
*/
td2.innerHTML = "<h4>my new column in new inner table </h4>";
row1.appendChild(td1);
td1.appendChild(table2);
row2.appendChild(td2);
/*
Added td1 into row1, table2 into td1, and td2 into row2.
*/
}
</script>
</head>
<body>
<table id="testtable1" border="1">
<tr><td width="150">old table row 1 column 1</td></tr>
<tr><td>old table row 2 column 1</td></tr>
<tr><td> <a onclick="addtabletesting('testtable1')" >Add table</a> </td></tr>
</table>
</body>
</html>
检查一下。目前它只是简单地添加内部表。您可以对其进行修改,以便您可以根据需要进行修改。
检查以下详细答案。
身体部位
<body>
<br/>
<a onclick="show_prompt()" >Add Multiple Companies</a>
<br/>
<table border="0" align="left" class="totalbodycontainer"> <%-- table in which entire body content is written --%>
<tr>
<td class="totalbodycontainer">
<div class="boxdiv" align="center" >
<div class="formmainheader" > <h2 >Add Company</h2> </div>
<form action="registration" >
<table id="sarinaddrow" border="0" align="center"><tr><td>
<table width="200" border="1" class="tableborder" align="center">
<tr class="rowdiv"> <td width="799" class="formheader" ><h4> Comany Details</h4></td></tr>
<tr>
<td width="799">
<table id="table1" width="792" border="0">
<tr class="rowdiv">
<td width="170" class="formlabel"><h4> Company ID </h4></td>
<td width="205" class="formfield"> </td>
<td width="20" class="formgap"></td>
<td width="170" class="formlabel"><h4> Company Name </h4></td>
<td width="205" class="formfield"><input type="text" name="type" id="type" size="30" />
</td>
</tr>
<tr class="rowdiv">
<td width="170" class="formlabel"><h4>Address </h4></td>
<td width="205" class="formfield"><textarea name="textarea" id="textarea" cols="28" rows="2"></textarea></td>
<td width="20" class="formgap"></td>
<td width="170" class="formlabel"><h4>Phone Number </h4></td>
<td width="205" class="formfield"><h6>
<input type="text" name="type2" id="type2" size="30"/>
</h6></td>
</tr>
<tr class="rowdiv">
<td width="170" class="formlabel"><h4>Fax Number </h4></td>
<td class="formfield"><input type="text" name="type3" id="type3" size="30"/></td>
<td class="formgap"></td>
<td width="170" class="formlabel"><h4>E Mail </h4></td>
<td class="formfield"><input type="text" name="type5" id="type5" size="30"/></td>
</tr>
<tr class="rowdiv">
<td class="formlabel"><h4>Web Site </h4></td>
<td class="formfield"><input type="text" name="type7" id="type7" size="30"/></td>
<td class="formgap"></td>
<td class="formlabel"> </td>
<td class="formfield"> </td>
</tr>
<tr class="rowdiv">
<td class="formlabel"><h4>Product Type </h4></td>
<td class="formfield"><input type="text" name="type7" id="type8" size="30"/></td>
<td class="formgap"></td>
<td class="formlabel"><h4>Description </h4></td>
<td class="formfield"><textarea name="textarea2" id="textarea2" cols="28" rows="2"></textarea></td>
</tr>
<tr class="rowdiv">
<td width="170" class="formlabel"> </td>
<td class="formfield"> </td>
<td class="formgap"></td>
<td class="formlabel"> </td>
<td class="formfield"><h6><a onclick="addproduct('table1')">Add product</a></h6></td>
</tr>
</table>
</td></tr> </table>
</td></tr>
<tr> <td class="formlabel"><h6 ><a onclick="addcompany('sarinaddrow',1)">Add Company</a></h6></td></tr> </table>
</form>
<p></p>
</div></td></tr></table>
</body>
脚本
<script language="javascript">
var sarintableno=1;
function addpolicy(tableID) {
try{
var mystring=null;
var table = document.getElementById(tableID);
var rowCount = table.rows.length;
var row1 = table.insertRow(rowCount-1);
var td1 = document.createElement("TD"); //td1
td1.className="formlabel";
td1.innerHTML='<h4>Product Type </h4>';
row1.appendChild(td1);
var td2 = document.createElement("TD"); //td2
td2.className="formfield";
mystring='<input type="text" name="type7" id="type8" size="30"/>';
td2.innerHTML=mystring;
row1.appendChild(td2);
var td3 = document.createElement("TD"); //td3
td3.className="formgap";
row1.appendChild(td3);
var td4 = document.createElement("TD"); //td4
td4.className="formlabel";
td4.innerHTML='<h4>Description </h4>';
row1.appendChild(td4);
var td5 = document.createElement("TD"); //td5
td5.className="formfield";
mystring='<textarea name="textarea2" id="textarea2" cols="28" rows="2"></textarea>';
td5.innerHTML=mystring;
row1.appendChild(td5);
}catch(e) {
alert(e);
}
}
function addcompany(tableID,companyno) {
try{
var xxx=0; var mytext1=null;
for( xxx=0;xxx<companyno;xxx++ ){
sarintableno++;
var table1 = document.getElementById(tableID); // t1
var rowCount1 = table1.rows.length;
var row1 = table1.insertRow(rowCount1-1); //add tr1
var td1 = document.createElement("TD"); //add td1
row1.appendChild(td1);
var table2= document.createElement("TABLE");//t2
td1.appendChild(table2);
var rowCount2 = table2.rows.length;
var row2 = table2.insertRow(rowCount2); //tr2
var td2 = document.createElement("TD"); //td2
row2.appendChild(td2);
rowCount2 = table2.rows.length;
var row3 = table2.insertRow(rowCount2); //tr3
var td3 = document.createElement("TD"); //td3
row3.appendChild(td3);
var table3= document.createElement("TABLE");//t3
td3.appendChild(table3);
var rowCount3 = table3.rows.length;
var row4 = table3.insertRow(rowCount3); //tr4
var td4 = document.createElement("TD"); //td4
row4.appendChild(td4);
var td5 = document.createElement("TD"); //td5
row4.appendChild(td5);
var td6 = document.createElement("TD"); //td6
row4.appendChild(td6);
var td7 = document.createElement("TD"); //td7
row4.appendChild(td7);
var td8 = document.createElement("TD"); //td8
row4.appendChild(td8);
var rowCount3 = table3.rows.length;
var row5 = table3.insertRow(rowCount3); //tr5
var td9 = document.createElement("TD"); //td9
row5.appendChild(td9);
var td10 = document.createElement("TD"); //td10
row5.appendChild(td10);
var td11 = document.createElement("TD"); //td11
row5.appendChild(td11);
var td12 = document.createElement("TD"); //td12
row5.appendChild(td12);
var td13 = document.createElement("TD"); //td13
row5.appendChild(td13);
var rowCount3 = table3.rows.length;
var row6 = table3.insertRow(rowCount3); //tr6
var td14 = document.createElement("TD"); //td14
row6.appendChild(td14);
var td15 = document.createElement("TD"); //td15
row6.appendChild(td15);
var td16 = document.createElement("TD"); //td16
row6.appendChild(td16);
var td17 = document.createElement("TD"); //td17
row6.appendChild(td17);
var td18 = document.createElement("TD"); //td18
row6.appendChild(td18);
var rowCount3 = table3.rows.length;
var row7 = table3.insertRow(rowCount3); //tr7
var td19 = document.createElement("TD"); //td19
row7.appendChild(td19);
var td20 = document.createElement("TD"); //td20
row7.appendChild(td20);
var td21 = document.createElement("TD"); //td21
row7.appendChild(td21);
var td22 = document.createElement("TD"); //td22
row7.appendChild(td22);
var td23 = document.createElement("TD"); //td23
row7.appendChild(td23);
var rowCount3 = table3.rows.length;
var row8 = table3.insertRow(rowCount3); //tr7
var td24 = document.createElement("TD"); //td24
row8.appendChild(td24);
var td25 = document.createElement("TD"); //td25
row8.appendChild(td25);
var td26 = document.createElement("TD"); //td26
row8.appendChild(td26);
var td27 = document.createElement("TD"); //td27
row8.appendChild(td27);
var td28 = document.createElement("TD"); //td28
row8.appendChild(td28);
var rowCount3 = table3.rows.length;
var row9 = table3.insertRow(rowCount3); //tr7
var td29 = document.createElement("TD"); //td24
row9.appendChild(td29);
var td30 = document.createElement("TD"); //td25
row9.appendChild(td30);
var td31 = document.createElement("TD"); //td26
row8.appendChild(td31);
var td32 = document.createElement("TD"); //td27
row9.appendChild(td32);
var td33 = document.createElement("TD"); //td28
row9.appendChild(td33);
/* styles and inner htmls */
table2.className="tableborder";
table2.setAttribute("width","200");
table2.setAttribute("border","1");
table2.setAttribute("allign","center");
row2.className="rowdiv";
td2.className="formheader";
td2.setAttribute("width","799");
td2.innerHTML="<h4>Comany Details</h4>";
td3.setAttribute("width","799");
table3.setAttribute("width","792");
table3.setAttribute("border","0");
table3.setAttribute("id","table"+sarintableno);
row4.className="rowdiv";
td4.className="formlabel";
td4.setAttribute("width","170");
td4.innerHTML="<h4>Company ID </h4>";
td5.className="formfield";
td5.setAttribute("width","205");
td5.innerHTML=" ";
td6.className="formgap";
td6.setAttribute("width","20");
td7.className="formlabel";
td7.setAttribute("width","170");
td7.innerHTML="<h4>Company Name </h4>";
td8.className="formfield";
td8.setAttribute("width","205");
td8.innerHTML='<input type="text" name="type" id="type" size="30" />';
row5.className="rowdiv";
td9.className="formlabel";
td9.setAttribute("width","170");
td9.innerHTML="<h4>Address </h4>";
td10.className="formfield";
td10.setAttribute("width","205");
td10.innerHTML='<textarea name="textarea" id="textarea" cols="28" rows="2"></textarea>';
td11.className="formgap";
td11.setAttribute("width","20");
td12.className="formlabel";
td12.setAttribute("width","170");
td12.innerHTML="<h4>Phone Number </h4>";
td13.className="formfield";
td13.setAttribute("width","205");
td13.innerHTML='<h6><input type="text" name="type2" id="type2" size="30"/></h6>';
row6.className="rowdiv";
td14.className="formlabel";
td14.setAttribute("width","170");
td14.innerHTML="<h4>Fax Number </h4>";
td15.className="formfield";
td15.setAttribute("width","205");
td15.innerHTML='<input type="text" name="type3" id="type3" size="30"/>';
td16.className="formgap";
td16.setAttribute("width","20");
td17.className="formlabel";
td17.setAttribute("width","170");
td17.innerHTML="<h4>E Mail </h4>";
td18.className="formfield";
td18.setAttribute("width","205");
td18.innerHTML='<input type="text" name="type5" id="type5" size="30"/>';
row7.className="rowdiv";
td19.className="formlabel";
td19.setAttribute("width","170");
td19.innerHTML="<h4>Web Site </h4>";
td20.className="formfield";
td20.setAttribute("width","205");
td20.innerHTML='<input type="text" name="type7" id="type7" size="30"/>';
td21.className="formgap";
td21.setAttribute("width","20");
td22.className="formlabel";
td22.setAttribute("width","170");
td22.innerHTML="<h4> </h4>";
td23.className="formfield";
td23.setAttribute("width","205");
td23.innerHTML=' ';
row8.className="rowdiv";
td24.className="formlabel";
td24.setAttribute("width","170");
td24.innerHTML="<h4>Product Type </h4>";
td25.className="formfield";
td25.setAttribute("width","205");
td25.innerHTML='<input type="text" name="type7" id="type8" size="30"/>';
td26.className="formgap";
td26.setAttribute("width","20");
td27.className="formlabel";
td27.setAttribute("width","170");
td27.innerHTML="<h4>Description </h4>";
td28.className="formfield";
td28.setAttribute("width","205");
td28.innerHTML='<textarea name="textarea2" id="textarea2" cols="28" rows="2"></textarea>';
row9.className="rowdiv";
td29.className="formlabel";
td29.setAttribute("width","170");
td29.innerHTML=" ";
td30.className="formfield";
td30.setAttribute("width","205");
td30.innerHTML=' ';
td31.className="formgap";
td31.setAttribute("width","20");
td31.innerHTML=" ";
td32.className="formlabel";
td32.setAttribute("width","170");
td32.innerHTML=" ";
td33.className="formfield";
td33.setAttribute("width","205");
mytext1='<h6><a onclick="addproduct('+"'table"+sarintableno+"'"+');">Add product</a></h6>';
td33.innerHTML=mytext1;
}
}catch(e) {
alert(e);
}
}
function show_prompt()
{
var name=prompt("Please enter the number of companies ","2");
if (name!=null && name!="")
{
addcompany('sarinaddrow',name);
}
}
</script>
答案 7 :(得分:0)
你可以像这样使用innerText
try{
row.innerHTML =mystring1;
}catch(e){
row.innerText =mystring1;
row.style.display='table-row';
}
答案 8 :(得分:0)
我的问题是它在firefox中有效,并且在IE中无法工作,知道我在彼此内部使用多表和表单...
一般解决方案
使用JQuery它可以解决浏览器之间的问题,在我的情况下,我遇到了这个错误,并替换为$('#'+loc).html(ddl)
行而不是innerHTML,它工作
function buildDDL(){
if (http_request.readyState == 4)
{
var ddl = http_request.responseText;
ddl = ddl.replace(/[\n]/g, '');
if(ddl != 'SESSION_EXPIRED'){
$('#'+loc).html(ddl);
//document.getElementById(loc).innerHTML = ddl;
}else{
location.href = 'errorPage.jsp?status='+ddl;
}
http_request = false;
}
}
如果你想知道功能,那么jQuery的html()执行与innerHTML相同的预期功能,但它也会执行跨浏览器兼容性的检查。
出于这个原因,在可能的情况下,始终使用jQuery的html()而不是innerHTML。