Hi,
ich habe da ein kleines Problem bei einer Webpage, die ein tabellarisches Formular dynamisch aufbaut. ImGrunde genommen wird per HTTP-Request eine Liste an Komponenten angefordert, die in einer 2-spaltigen Tabelle (id="Components", besteht im HTML-Teil nur aus dem header) angezeigt wird. Die erste Spalte ist der Name, die 2. Spalte ist eine Checkbox, die einen Status (erledigt/noch nicht erledigt) anzeigen soll.
[highlight=JavaScript]
function BuildTable(tableContent)
{
var data = tableContent;
var pos1,pos2;
var table = document.getElementById("Components");
while (table.rows.length>1) table.deleteRow(1);
var actrowindex=1;
while (data != "")
{
var actrow;
pos1=data.indexOf("|");
if (pos1==-1) break;
pos2=data.indexOf("|",pos1+1);
if (pos2 == -1) pos2 = data.length;
var actname = data.substr(0, pos1);
var actentry ;
if (pos2==-1)
actentry = data.substr(pos1+1);
else
{
actentry=data.substring(pos1+1, pos2);
data = data.substr(pos2+1);
}
actrow = table.insertRow(actrowindex);
actrowindex += 1;
var TD1=document.createElement("td");
TD1.appendChild(document.createTextNode(actname));
var TD2=document.createElement("td");
TD2.align="center";
var cb = document.createElement("input");
cb.type="checkbox";
cb.checked=true;
cb.disabled=true;
TD2.appendChild(cb);
actrow.appendChild(TD1);
actrow.appendChild(TD2);
}
noComponents=actrowindex-1;
}
function DeleteOldResults()
{
//TODO: invalidate results in database
var i;
var table=document.getElementById("Components");
for (i=0; i < table.rows.length; i++)
{
table.rows[i].cells[1].childNodes[0].checked=false;
}
document.getElementsByName("selectComponent")[0].disabled=false;
document.getElementsByName("deleteResults")[0].disabled=true;
}
[/highlight]
Unter Firefox klappt das ganz gut, jetzt habe ich es aber mal im IE versucht, und der sagt in der Funktion DeleteOldResults beim Unchecken "Das Objekt unterstützt diese Eigenschaft oder Methode nicht".
Ich nehme nun an, dass der IE es nicht hinbekommt, dass cells[1].childNodes[0] eine Checkbox ist, und da der normale Node kein checked hat, kommt dieser Fehler. Muss ich da irgendwas hinzufügen, was Firefox "kulanterweise" selbst macht (z.b. childNodes[0].nodeValue.checked oder so)? Oder muss ich den Node explizit auf eine Checkbox casten (und wenn ja, wie) um die Eigenschaft setzen zu dürfen?
Bitte nicht wundern über die (Nicht-)Bearbeitung von actentry. der soll später steuern, ob die Checkbox auch vom user angehakt werden darf (also disabled=false gesetzt werden soll). Der String der BuildTable übergeben wird sieht so aus:"Name1|0|Name2|1|Name3|0|Name4|0|..."
Hoffe jemand kann helfen
Gruß
Martin
ich habe da ein kleines Problem bei einer Webpage, die ein tabellarisches Formular dynamisch aufbaut. ImGrunde genommen wird per HTTP-Request eine Liste an Komponenten angefordert, die in einer 2-spaltigen Tabelle (id="Components", besteht im HTML-Teil nur aus dem header) angezeigt wird. Die erste Spalte ist der Name, die 2. Spalte ist eine Checkbox, die einen Status (erledigt/noch nicht erledigt) anzeigen soll.
[highlight=JavaScript]
function BuildTable(tableContent)
{
var data = tableContent;
var pos1,pos2;
var table = document.getElementById("Components");
while (table.rows.length>1) table.deleteRow(1);
var actrowindex=1;
while (data != "")
{
var actrow;
pos1=data.indexOf("|");
if (pos1==-1) break;
pos2=data.indexOf("|",pos1+1);
if (pos2 == -1) pos2 = data.length;
var actname = data.substr(0, pos1);
var actentry ;
if (pos2==-1)
actentry = data.substr(pos1+1);
else
{
actentry=data.substring(pos1+1, pos2);
data = data.substr(pos2+1);
}
actrow = table.insertRow(actrowindex);
actrowindex += 1;
var TD1=document.createElement("td");
TD1.appendChild(document.createTextNode(actname));
var TD2=document.createElement("td");
TD2.align="center";
var cb = document.createElement("input");
cb.type="checkbox";
cb.checked=true;
cb.disabled=true;
TD2.appendChild(cb);
actrow.appendChild(TD1);
actrow.appendChild(TD2);
}
noComponents=actrowindex-1;
}
function DeleteOldResults()
{
//TODO: invalidate results in database
var i;
var table=document.getElementById("Components");
for (i=0; i < table.rows.length; i++)
{
table.rows[i].cells[1].childNodes[0].checked=false;
}
document.getElementsByName("selectComponent")[0].disabled=false;
document.getElementsByName("deleteResults")[0].disabled=true;
}
[/highlight]
Unter Firefox klappt das ganz gut, jetzt habe ich es aber mal im IE versucht, und der sagt in der Funktion DeleteOldResults beim Unchecken "Das Objekt unterstützt diese Eigenschaft oder Methode nicht".
Ich nehme nun an, dass der IE es nicht hinbekommt, dass cells[1].childNodes[0] eine Checkbox ist, und da der normale Node kein checked hat, kommt dieser Fehler. Muss ich da irgendwas hinzufügen, was Firefox "kulanterweise" selbst macht (z.b. childNodes[0].nodeValue.checked oder so)? Oder muss ich den Node explizit auf eine Checkbox casten (und wenn ja, wie) um die Eigenschaft setzen zu dürfen?
Bitte nicht wundern über die (Nicht-)Bearbeitung von actentry. der soll später steuern, ob die Checkbox auch vom user angehakt werden darf (also disabled=false gesetzt werden soll). Der String der BuildTable übergeben wird sieht so aus:"Name1|0|Name2|1|Name3|0|Name4|0|..."
Hoffe jemand kann helfen
Gruß
Martin
Comment