我想制作一些html表格可编辑的单元格,只需双击一个单元格,输入一些文本,然后可以将更改发送到服务器。我不想使用像dojo数据网格这样的工具包。因为它提供了一些其他功能。你会提供一些关于如何实现它的代码片段或建议吗?如何使HTML表格单元格可编辑?
回答
您可以在有问题的单元格,行或表上使用contenteditable属性。
更新了IE8的兼容性
<table>
<tr><td><div contenteditable>I'm editable</div></td><td><div contenteditable>I'm also editable</div></td></tr>
<tr><td>I'm not editable</td></tr>
</table>
只是注意,如果你做的表格编辑,在Mozilla至少,你可以删除行等
你想也需要检查无论您的目标受众的浏览器是否支持此属性。
至于监听的变化(这样你就可以发送到服务器),看contenteditable change events
如果你使用jQuery,这个插件可以帮助您 很简单,但好
这看起来像一个有趣的插件。有关如何使用它的文档可以在index.html文件中找到。请看http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers#answer-8259,看看为什么包括更多的信息,而不仅仅是一个链接为更好的答案。 – 2014-02-20 17:40:20
HTML5支持contenteditable,
<table border="3">
<thead>
<tr>Heading 1</tr>
<tr>Heading 2</tr>
</thead>
<tbody>
<tr>
<td contenteditable='true'></td>
<td contenteditable='true'></td>
</tr>
<tr>
<td contenteditable='true'></td>
<td contenteditable='true'></td>
</tr>
</tbody>
</table>
** contenteditable **的可能状态: ** contenteditable ** =“”或** contenteditable ** =“true” 指示元素是可编辑的。 ** contenteditable ** =“false” 指示元素不可编辑。 ** contenteditable ** =“继承” 指示如果元素的直接父元素可编辑,则该元素可编辑。这是默认值。 将** contenteditable **添加到元素时,浏览器将使该元素可编辑。此外,该元素的任何子元素也将变得可编辑,除非子元素明确** contenteditable ** =“false”。 – vardhan 2014-11-20 11:49:38
我知道,我只是觉得这很奇怪,因为大多数其他属性都没有这个语法。 – trysis 2014-11-20 21:44:30
试试看看这个代码。
$(function() {
$("td").dblclick(function() {
var OriginalContent = $(this).text();
$(this).addClass("cellEditing");
$(this).html("<input type="text" value="" + OriginalContent + "" />");
$(this).children().first().focus();
$(this).children().first().keypress(function (e) {
if (e.which == 13) {
var newContent = $(this).val();
$(this).parent().text(newContent);
$(this).parent().removeClass("cellEditing");
}
});
$(this).children().first().blur(function(){
$(this).parent().text(OriginalContent);
$(this).parent().removeClass("cellEditing");
});
});
});
您也可以访问此链接了解详情:
为了避免IE中出现问题 $(this).children()。first()。focus(); - http://stackoverflow.com/a/3562193/5234417 – 2016-02-04 08:24:56
我有三个方法, 在这里,您可以同时使用<input>
或<textarea>
按您的要求。
1.使用输入<td>
。
使用在所有<td>
小号<input>
元素,
<tr><td><input type="text"></td>....</tr>
你也可能要输入调整到尺寸的它的TD。当然,
input { width:100%; height:100%; }
2.使用contenteditable='true'
属性。 (HTML5)
但是,如果您想使用contenteditable='true'
,您可能还想将适当的值保存到数据库。你可以用ajax实现这一点。
您可以将密码处理程序keyup
,, keypress
等附加到<td>
。当用户连续输入时,使用一些delay()也是很好的事情,ajax事件不会在每个关键用户按下时触发。例如,
$('table td').keyup(function() {
clearTimeout($.data(this, 'timer'));
var wait = setTimeout(saveData, 500); // delay after user types
$(this).data('timer', wait);
});
function saveData() {
// ... ajax ...
}
3.追加<input>
到<td>
当它被点击。
当单击<td>
时,在td中添加输入元素,根据td的值替换它的值。当输入模糊时,用输入值更改td的值。所有这一切与JavaScript。
不幸的是,你错过了“如何使HTML表格单元格可编辑?”的问题部分。尤其是在示例2中。用户询问如何通过双击来实现这一点。你能否善意执行缺失的部分? – Robert 2017-09-19 06:36:28
这实际上很直接, 这是我的HTML,jQuery示例..它的工作原理就像一个魅力,我使用在线json数据样本构建所有代码。 欢呼声
< < HTML >>
<table id="myTable"></table>
< <的jQuery >>
<script>
var url = 'http://jsonplaceholder.typicode.com/posts';
var currentEditedIndex = -1;
$(document).ready(function() {
$.getJSON(url,
function (json) {
var tr;
tr = $('<tr/>');
tr.append("<td>ID</td>");
tr.append("<td>userId</td>");
tr.append("<td>title</td>");
tr.append("<td>body</td>");
tr.append("<td>edit</td>");
$('#myTable').append(tr);
for (var i = 0; i < json.length; i++) {
tr = $('<tr/>');
tr.append("<td>" + json[i].id + "</td>");
tr.append("<td>" + json[i].userId + "</td>");
tr.append("<td>" + json[i].title + "</td>");
tr.append("<td>" + json[i].body + "</td>");
tr.append("<td><input type='button' value='edit' id='edit' onclick='myfunc(" + i + ")' /></td>");
$('#myTable').append(tr);
}
});
});
function myfunc(rowindex) {
rowindex++;
console.log(currentEditedIndex)
if (currentEditedIndex != -1) { //not first time to click
cancelClick(rowindex)
}
else {
cancelClick(currentEditedIndex)
}
currentEditedIndex = rowindex; //update the global variable to current edit location
//get cells values
var cell1 = ($("#myTable tr:eq(" + (rowindex) + ") td:eq(0)").text());
var cell2 = ($("#myTable tr:eq(" + (rowindex) + ") td:eq(1)").text());
var cell3 = ($("#myTable tr:eq(" + (rowindex) + ") td:eq(2)").text());
var cell4 = ($("#myTable tr:eq(" + (rowindex) + ") td:eq(3)").text());
//remove text from previous click
//add a cancel button
$("#myTable tr:eq(" + (rowindex) + ") td:eq(4)").append(" <input type='button' onclick='cancelClick("+rowindex+")' id='cancelBtn' value='Cancel' />");
$("#myTable tr:eq(" + (rowindex) + ") td:eq(4)").css("width", "200");
//make it a text box
$("#myTable tr:eq(" + (rowindex) + ") td:eq(0)").html(" <input type='text' id='mycustomid' value='" + cell1 + "' style='width:30px' />");
$("#myTable tr:eq(" + (rowindex) + ") td:eq(1)").html(" <input type='text' id='mycustomuserId' value='" + cell2 + "' style='width:30px' />");
$("#myTable tr:eq(" + (rowindex) + ") td:eq(2)").html(" <input type='text' id='mycustomtitle' value='" + cell3 + "' style='width:130px' />");
$("#myTable tr:eq(" + (rowindex) + ") td:eq(3)").html(" <input type='text' id='mycustomedit' value='" + cell4 + "' style='width:400px' />");
}
//on cancel, remove the controls and remove the cancel btn
function cancelClick(indx)
{
//console.log('edit is at row>> rowindex:' + currentEditedIndex);
indx = currentEditedIndex;
var cell1 = ($("#myTable #mycustomid").val());
var cell2 = ($("#myTable #mycustomuserId").val());
var cell3 = ($("#myTable #mycustomtitle").val());
var cell4 = ($("#myTable #mycustomedit").val());
$("#myTable tr:eq(" + (indx) + ") td:eq(0)").html(cell1);
$("#myTable tr:eq(" + (indx) + ") td:eq(1)").html(cell2);
$("#myTable tr:eq(" + (indx) + ") td:eq(2)").html(cell3);
$("#myTable tr:eq(" + (indx) + ") td:eq(3)").html(cell4);
$("#myTable tr:eq(" + (indx) + ") td:eq(4)").find('#cancelBtn').remove();
}
</script>
这是一个单一的和可运行的例子。
<html>
<head>
<script src="http://cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script> <!-- jQuery source -->
</head>
<body>
<table align="center">
<tr> <td>id</td> <td>name</td> </tr>
<tr> <td>001</td> <td>dog</td> </tr>
<tr> <td>002</td> <td>cat</td> </tr>
<tr> <td>003</td> <td>pig</td> </tr>
</table>
<script>
$(function(){
$("td").click(function(event){
if($(this).children("input").length > 0)
return false;
var tdObj = $(this);
var preText = tdObj.html();
var inputObj = $("<input type='text' />");
tdObj.html("");
inputObj.width(tdObj.width())
.height(tdObj.height())
.css({border:"0px",fontSize:"17px"})
.val(preText)
.appendTo(tdObj)
.trigger("focus")
.trigger("select");
inputObj.keyup(function(event){
if(13 == event.which) { // press ENTER-key
var text = $(this).val();
tdObj.html(text);
}
else if(27 == event.which) { // press ESC-key
tdObj.html(preText);
}
});
inputObj.click(function(){
return false;
});
});
});
</script>
</body>
</html>
您可以用x-编辑https://vitalets.github.io/x-editable/ 其真棒库从引导
只需插入在<td>
动态<input>
元素,对细胞点击。只有简单的HTML和Javascript。无需contentEditable
,jquery
,HTML5
- 1. 可编辑的HTML表格单元格编辑
- 2. 编辑表格单元格
- 3. 使用Java编辑表格单元格
- 4. jqgrid:根据表单编辑中的单元格值将可编辑单元格更改为不可编辑
- 5. 如何使表格单元格编辑的更改永久化?
- 6. jQuery:使表格单元格内容可编辑
- 7. 编辑表格行单元格swift 3
- 8. 编辑HTML表格
- 9. 使JTable单元格编辑器值可选,但不可编辑?
- 10. 当表格进入'编辑'模式时,如何让我的表格单元格UITextField可编辑?
- 11. GWT Celltable如何使可编辑列中的非可编辑单元格
- 12. 如何在离开单元格时提交单元格编辑
- 13. 将可编辑数字单元格添加到单元格
- 14. 使用jQuery编辑单个表格单元格
- 15. 如何编辑表格视图单元格
- 16. 如何在Swift 3中编辑表格单元格的内容
- 17. 动态表格中的可编辑单元格
- 18. J2ME - 具有可编辑单元格的动态表/网格。
- 19. jQuery:jqGrid - 创建一个可以编辑单元格的表格
- 20. AngularJS中的可编辑表格单元格
- 21. Html表格单元格值
- 22. 如何使jtable单元格不可编辑
- 23. 如何使TAdvStringGrid的单元格可编辑?
- 24. 如何使tableview单元格“detailLabel”可编辑?
- 25. 如何编辑datgridview中的单元格?
- 26. 如何在jqGrid中编辑单元格?
- 27. 如何关闭单元格编辑器?
- 28. 如何在DataGridView中编辑单元格?
- 29. HTML表格,编辑记录单独
- 30. 可扩展的单元格编辑QTreeView
谢谢。 HTML5支持似乎contenteditable。我正在寻找一个解决方案,它也适用于html4。 – wqfeng 2011-05-16 04:54:24
尽管最终以HTML5标准化了标准,但它在大多数较旧的浏览器中已得到很好的支持(FF3中只有部分支持除外):http://caniuse.com/contenteditable(虽然不在移动设备中) – 2011-05-16 05:00:50
在IE8中测试它。它不起作用。 – wqfeng 2011-05-16 05:52:18