HTML和Javascript动态表的问题
我在以下方面面临问题:HTML和Javascript动态表的问题,javascript,html,html-table,dom-events,Javascript,Html,Html Table,Dom Events,我在以下方面面临问题: 函数saveRow不保存该行。我得到这个错误: 未捕获的TypeError:无法在HTMLInputElement.onclick的存储行设置未定义的属性名。 2) deleteRow不起作用。我得到了一个类似的错误: 未捕获的TypeError:无法将属性“innerHTML”设置为null。 3) 在editRow中,I字段变为可编辑,但默认值与以前保存的值相同。例如,列表总是A、B、C,这不是我想要的。我希望列表的初始值是以前选择的值 我应该是做错了什么。代码如下:
saveRow
不保存该行。我得到这个错误:deleteRow
不起作用。我得到了一个类似的错误:
未捕获的TypeError:无法将属性“innerHTML”设置为null。
3) 在editRow
中,I字段变为可编辑,但默认值与以前保存的值相同。例如,列表总是A、B、C,这不是我想要的。我希望列表的初始值是以前选择的值
我应该是做错了什么。代码如下:
HTML:
名称
水平仪
行动
A.
B
C
剧本:
var myArray = [{
"name": "aaa",
"level": "A"
}, {
"name": "bbb",
"level": "B"
}, {
"name": "ccc",
"level": "C"
}];
display();
function display() {
var length = myArray.length;
var htmlText = "";
for (var i = 0; i < length; i++) {
htmlText +=
"<tr id='row" + i + "'>\
<td>" + myArray[i].name + "</td>\
<td>" + myArray[i].level + "</td>\
<td>\
<input type='button' id='edit_button" + i + "' value='Edit' class='edit' onclick='editRow("+i+")'> \
<input type='button' id='save_button" + i + "' value='Save' class='save' onclick='save_row(" + i + ")'> \
<input type='button' value='Delete' class='delete' onclick='delete_row(" + i + ")'>\
</td>\
</tr>";
}//end loop
htmlText+=
"<tr>\
<td><input type='text' id='name-text'></td>\
<td>\
<select name='levels-list' id='levels-list'>\
<option value='A' id='option-1'>A</option>\
<option value='B' id='option-2'>B</option>\
<option value='C' id='option-3'>C</option>\
</select>\
</td>\
<td><input type='button' class='add' value='Add Row' id='add-button' ></td>\
</tr>";
document.getElementById("table-rows").innerHTML = htmlText;
}//end display
var addButton=document.getElementById("add-button");
addButton.addEventListener('click', addRow, false);
function addRow(){
event.preventDefault();
var newData= document.getElementById("name-text").value;
var newLevel = document.getElementById("levels-list").value;
var table = document.getElementById("data_table");
var tableLength = (table.rows.length)-1;
// console.log(tableLength);
var row = table.insertRow(tableLength).innerHTML=
"<tr id= 'row"+tableLength+"'>\
<td id='name-text"+tableLength+"'>"+newData+"</td>\
<td id='levels-list"+tableLength+"'>"+newLevel+"</td>\
<td><input type='button' id='edit-button"+tableLength+"' value='Edit' class='edit' onclick='editRow("+tableLength+")'> \
<input type='button' id='save-button"+tableLength+"' value='Save' class='save' onclick='saveRow("+tableLength+")'> \
<input type='button' id= 'delete-button"+tableLength+"' value='Delete' class='delete' onclick='deleteRow("+tableLength+")'>\
</td>\
</tr>";
document.getElementById("name-text").value="";
}//end addRow
function editRow(no)
{
document.getElementById("edit-button"+no).disabled=true;
//document.getElementById("save-button"+no).style.display="block";
var name=document.getElementById("name-text"+no);
var level=document.getElementById("levels-list"+no);
var nameData=name.innerHTML;
var levelData=level.innerHTML;
name.innerHTML="<input type='text' id='name_text"+no+"' value='"+nameData+"'>";
level.innerHTML='<select id="levels-list'+no+'">\
<option value="A" id="option-1">A</option>\
<option value="B" id="option-2">B</option>\
<option value="C" id="option-3">C</option>\
</select>' ;
document.getElementById("levels-list"+no).value = levelData;
}
function deleteRow(no) {
myArray.splice(no, 1);
document.getElementById("row"+no).innerHTML="";
//display();
} //end deleteRow
function saveRow(no)
{
myArray[no].name = document.getElementById("name-text"+no).value;
myArray[no].level = document.getElementById("levels-list"+no).value;
document.getElementById("row"+no).innerHTML =
"<tr id= 'row"+no+"'>\
<td id='name-text"+no+"'>"+myArray[no].name+"</td>\
<td id='levels-list"+no+"'>"+myArray[no].level+"</td>\
<td><input type='button' id='edit-button"+no+"' value='Edit' class='edit' onclick='editRow("+no+")'> \
<input type='button' value='Delete' class='delete' onclick='deleteRow("+no+")'>\
</td>\
</tr>";
}//end saveRow
var myArray=[{
“名称”:“aaa”,
“级别”:“A”
}, {
“名称”:“bbb”,
“级别”:“B”
}, {
“名称”:“ccc”,
“级别”:“C”
}];
显示();
函数显示(){
var length=myArray.length;
var htmlText=“”;
对于(变量i=0;i
我对您的代码进行了一些重构,并创建了一个新的JSFIDLE。您可以对其进行越来越多的重构,如果可能的话,可以在项目中插入jQuery,只需对其进行更多的重构即可
很少注意到:
1) 使您的模型与您的UI更改保持同步。在前面的示例中,您正在处理HTML,但没有更新数组模型
2) 尽量将常用代码保存在函数中,以避免重复。
例如,我移动了用于在函数中创建行的逻辑,并且每次需要创建新行时只调用该函数(用于在开始和单击“添加行”时显示)
3) 当您在行中调用函数时,还要传递当前HTML元素。您可以传递它,以便知道单击了哪个当前HTML元素,以便可以轻松地操作该行
4) 使用两个tbodies。一个用于数据,另一个用于操作。这样可以更容易地将数据与操作区分开来,避免每次都重复该行的操作
还有一些你可以单独用代码检查的东西
您必须只管理在正确操作中禁用按钮的逻辑,以避免在编辑时再次单击“编辑”,但这是一个很好的练习:)
以下是示例:
var myArray=[{
“名称”:“aaa”,
“级别”:“A”
}, {
“名称”:“bbb”,
“级别”:“B”
}, {
“名称”:“ccc”,
“级别”:“C”
}];
函数createDataRow(el,ind){
var行=document.createElement('tr');
row.id='row-'+ind;
变量Cell1内容=`
${el.name}
`;
变量cell2Content=`
${el.level}
A\
B\
C\
`;
变量cell3Content=`
`;
var cell1=行插入单元格(0);
var cell2=行插入单元格(1);
var cell3=行插入单元格(2);
cell1.innerHTML=cell1内容;
cell2.innerHTML=cell2Content;
cell3.innerHTML=cell3Content;
document.getElementById('table-data').appendChild(行);
}
函数displayData(){
forEach(函数(el,ind){
创建数据行(el,ind);
});
}
函数deleteRow(el,ind){
el.parentElement.parentElement.parentElement.removeChild(el.parentElement.parentElement);
myArray.splice(ind,1);
}
函数addRow(){
event.preventDefault();
var newEl={
“名称”:document.getElementById(“名称文本”).value,
“级别”:document.getElementById(“级别列表”).value
};
myArray.push(newEl);
createDataRow(newEl,myArray.length-1);
document.getElementById(“名称文本”)。值=“”;
document.getElementById(“级别列表”).value='A';
}//结束添加行
函数编辑行(el,ind)
{
var currentRow=el.parentElement.parentElement;
currentRow.cells[0]。getElementsByClassName(
var myArray = [{
"name": "aaa",
"level": "A"
}, {
"name": "bbb",
"level": "B"
}, {
"name": "ccc",
"level": "C"
}];
display();
function display() {
var length = myArray.length;
var htmlText = "";
for (var i = 0; i < length; i++) {
htmlText +=
"<tr id='row" + i + "'>\
<td>" + myArray[i].name + "</td>\
<td>" + myArray[i].level + "</td>\
<td>\
<input type='button' id='edit_button" + i + "' value='Edit' class='edit' onclick='editRow("+i+")'> \
<input type='button' id='save_button" + i + "' value='Save' class='save' onclick='save_row(" + i + ")'> \
<input type='button' value='Delete' class='delete' onclick='delete_row(" + i + ")'>\
</td>\
</tr>";
}//end loop
htmlText+=
"<tr>\
<td><input type='text' id='name-text'></td>\
<td>\
<select name='levels-list' id='levels-list'>\
<option value='A' id='option-1'>A</option>\
<option value='B' id='option-2'>B</option>\
<option value='C' id='option-3'>C</option>\
</select>\
</td>\
<td><input type='button' class='add' value='Add Row' id='add-button' ></td>\
</tr>";
document.getElementById("table-rows").innerHTML = htmlText;
}//end display
var addButton=document.getElementById("add-button");
addButton.addEventListener('click', addRow, false);
function addRow(){
event.preventDefault();
var newData= document.getElementById("name-text").value;
var newLevel = document.getElementById("levels-list").value;
var table = document.getElementById("data_table");
var tableLength = (table.rows.length)-1;
// console.log(tableLength);
var row = table.insertRow(tableLength).innerHTML=
"<tr id= 'row"+tableLength+"'>\
<td id='name-text"+tableLength+"'>"+newData+"</td>\
<td id='levels-list"+tableLength+"'>"+newLevel+"</td>\
<td><input type='button' id='edit-button"+tableLength+"' value='Edit' class='edit' onclick='editRow("+tableLength+")'> \
<input type='button' id='save-button"+tableLength+"' value='Save' class='save' onclick='saveRow("+tableLength+")'> \
<input type='button' id= 'delete-button"+tableLength+"' value='Delete' class='delete' onclick='deleteRow("+tableLength+")'>\
</td>\
</tr>";
document.getElementById("name-text").value="";
}//end addRow
function editRow(no)
{
document.getElementById("edit-button"+no).disabled=true;
//document.getElementById("save-button"+no).style.display="block";
var name=document.getElementById("name-text"+no);
var level=document.getElementById("levels-list"+no);
var nameData=name.innerHTML;
var levelData=level.innerHTML;
name.innerHTML="<input type='text' id='name_text"+no+"' value='"+nameData+"'>";
level.innerHTML='<select id="levels-list'+no+'">\
<option value="A" id="option-1">A</option>\
<option value="B" id="option-2">B</option>\
<option value="C" id="option-3">C</option>\
</select>' ;
document.getElementById("levels-list"+no).value = levelData;
}
function deleteRow(no) {
myArray.splice(no, 1);
document.getElementById("row"+no).innerHTML="";
//display();
} //end deleteRow
function saveRow(no)
{
myArray[no].name = document.getElementById("name-text"+no).value;
myArray[no].level = document.getElementById("levels-list"+no).value;
document.getElementById("row"+no).innerHTML =
"<tr id= 'row"+no+"'>\
<td id='name-text"+no+"'>"+myArray[no].name+"</td>\
<td id='levels-list"+no+"'>"+myArray[no].level+"</td>\
<td><input type='button' id='edit-button"+no+"' value='Edit' class='edit' onclick='editRow("+no+")'> \
<input type='button' value='Delete' class='delete' onclick='deleteRow("+no+")'>\
</td>\
</tr>";
}//end saveRow