提问人:ttoshiro 提问时间:6/7/2020 最后编辑:ttoshiro 更新时间:6/9/2020 访问量:128
如何使部分不可编辑的表格单元格与内联JavaScript函数兼容?
How to make a partially un-editable table cell compatible with inline JavaScript functions?
问:
所以,几天前,我发布了这个问题(几乎相同),并收到了一个非常有帮助的回复。
但是,为了制作表格计算器,我已经对某一列的每个表格行设置了一个集合,以将表格变成计算器,当我尝试为自己应用它时,这会弄乱原始问题的答案(JavaScript 将单位“kg”与数字解析,并将总和显示为“NaN”)。id
同样,每个单元格内都有一个可见的文本框,上面显示答案,看起来有点丑陋。我当前的代码中的单元格不显示为文本框,但仍然是可编辑的,在我看来,这带来了更时尚的体验(我知道这在功能上没有区别,但外观让我很烦恼!
下面是我想要的代码外观的模型。我试图使数字/输入出现在文本框的右侧,但仍然显示在单位的左侧(“kg”)。
下面是我尝试创建的模型(除了数字在右边)。
这是我拥有的代码:
<head>
<style>
table {
border: 1px solid black;
border-collapse: collapse;
font-family: Arial, sans-serif;
margin: 5px;
width: 100%;
}
th, td {
border: 1px solid black;
border-collapse: collapse;
font-family: Arial, sans-serif;
margin: 5px;
padding: 5px;
}
</style>
</head>
<body>
<table>
<tr>
<th>header1</th>
<th>header2</th>
</tr>
<tr>
<td>entry1</td>
<td id="entry1" oninput="myFunction()">4000</td>
</tr>
<tr>
<td>entry2</td>
<td id="entry2" oninput="myFunction()">200</td>
</tr>
<tr>
<td>Total</td>
<td id="total"></td>
</tr>
</table>
<script type="text/javascript">
document.getElementById("entry1").contentEditable = true;
document.getElementById("entry2").contentEditable = true;
function myFunction() {
var entry1 = document.getElementById("entry1").innerText;
var entry2 = document.getElementById("entry2").innerText;
var total2 = parseInt(entry1) + parseInt(entry2);
document.getElementById("total").innerHTML = total2;
}
myFunction();
</script>
</body>
如您所见,它将右列中的数字相加,并在最后一行中显示总和。但是,我希望此处显示的单位(例如“kg”)是不可编辑的,更重要的是,不会在 JavaScript 函数中被解析为数字。如果丑陋的文本框轮廓也没有出现在单元格内,那就太好了。
这可能吗?任何答案都值得赞赏!
答:
当你调用一个空字符串时,你会得到。要解决此问题,请将以下语句从NaN
parseInt
var total = parseInt(jack2) + parseInt(john2) + parseInt (joe2);
自
var total = (parseInt(jack2) || 0) + (parseInt(john2) || 0) + (parseInt (joe2) || 0);
要在右列中的数字旁边显示单位,请在元素内添加 2 个元素并使用 flexbox 正确对齐它们。span
td
若要使数字可编辑,请在包含该数字的元素上添加属性。 默认情况下,包含该单元的元素将是不可编辑的。contentEditable
span
span
function myFunction() {
var jack2 = document.getElementById("jack").innerText;
var john2 = document.getElementById("john").innerText;
var joe2 = document.getElementById("joe").innerText;
var total = (parseInt(jack2) || 0) + (parseInt(john2) || 0) + (parseInt(joe2) || 0);
document.getElementById("total").innerHTML = total;
}
myFunction();
table {
width: 100%;
}
table,
tr,
th,
td {
border: 1px solid black;
border-collapse: collapse;
font-family: Arial, sans-serif;
margin: 5px;
}
th,
td {
padding: 5px;
}
td:last-child {
display: flex;
justify-content: space-between;
border: none;
}
td:last-child span:first-child {
flex-grow: 1;
margin-right: 10px;
outline: none;
text-align: right;
}
#total {
display: flex;
justify-content: flex-end;
}
<table>
<thead>
<tr>
<th>Person</th>
<th>Weight</th>
</tr>
</thead>
<tbody>
<tr>
<td>Jack</td>
<td id="jack" oninput="myFunction()">
<span contentEditable="true">4</span>
<span>Kg</span>
</td>
</tr>
<tr>
<td>John</td>
<td id="john" oninput="myFunction()">
<span contentEditable="true">2</span>
<span>Kg</span>
</td>
</tr>
<tr>
<td>Joe</td>
<td id="joe" oninput="myFunction()">
<span contentEditable="true">3</span>
<span>Kg</span>
</td>
</tr>
<tr>
<td>Total</td>
<td id="total"></td>
</tr>
</tbody>
</table>
评论
td:child
#total
td:last-child
#total
td:last-child
td
#target
target
为了避免结果是“NAN”,添加了一个 if,我们检查其中一个密封件是否为空,并将其替换为 0。 在编辑单元格中,添加了两个 div,一个用于编辑值,另一个用于添加文本“kg”。
<style>
table {
border: 1px solid black;
border-collapse: collapse;
font-family: Arial, sans-serif;
margin: 5px;
width: 100%;
}
th, td {
border: 1px solid black;
border-collapse: collapse;
font-family: Arial, sans-serif;
margin: 5px;
padding: 5px;
}
.input_{
width: 90%;
float: left;
}
.peso{
width: 10%;
float: right;
}
</style>
<table>
<tr>
<th>Person</th>
<th>Weight</th>
</tr>
<tr>
<td>Jack</td>
<td>
<div class="input_" id="jack" oninput="myFunction()">1</div>
<div class="peso">kg</div>
</td>
</tr>
<tr>
<td>John</td>
<td>
<div class="input_" id="john" oninput="myFunction()">2</div>
<div class="peso">kg</div>
</td>
</tr>
<tr>
<td>Joe</td>
<td>
<div class="input_" id="joe" oninput="myFunction()">3</div>
<div class="peso">kg</div>
</td>
</tr>
<tr>
<td>Total</td>
<td id="total"></td>
</tr>
</table>
<script type="text/javascript">
document.getElementById("jack").contentEditable = true;
document.getElementById("john").contentEditable = true;
document.getElementById("joe").contentEditable = true;
function myFunction() {
var jack2 = document.getElementById("jack").innerText;
var john2 = document.getElementById("john").innerText;
var joe2 = document.getElementById("joe").innerText;
if(jack2==""){
jack2=0;
}
if(john2==""){
john2=0;
}
if(joe2==""){
joe2=0;
}
var total2 = parseInt(jack2) + parseInt(john2) + parseInt (joe2);
document.getElementById("total").innerHTML = total2+" kg";
}
myFunction();
</script>
评论