【问题标题】:Change Javascript function to edit cells instead of append them更改 Javascript 函数以编辑单元格而不是附加它们
【发布时间】:2011-07-12 04:30:54
【问题描述】:

抱歉,我的问题含糊不清。让我从头开始。

我目前有这个:http://jsfiddle.net/kmg4x/1/

我发布的另一个问题是相关的:Alternative to Jeditable for editable table cells

虽然我最终想取消顶部的表单并使单元格可编辑,但这个问题主要是关于更改表格内容而不是添加新单元格。

如您所见,如果您在左上角的输入框中输入一个字母并单击退出,它会将数组的剩余部分附加到表格中(在slice 之后)。我希望它更改现有单元格的内容。

我尝试将cell.appendChild(document.createTextNode 更改为innerHTML,但它最终做了完全相同的事情。我的猜测是它与将var tbody = document.getElementById(id).getElementsByTagName("tbody")[0]; 更改为var tbody = document.getElementById(id).getElementsByTagName("td")[0]; 有关,但是当我这样做时它就会中断。

是否有 editCell() 等效于 tbody.insertRow(r) 可能是 td.innerHTML(r)?

最后我会添加一个可以添加和删除行的按钮。

希望这会更好。

【问题讨论】:

  • 您要附加一个 4x4 表格吗?
  • 非常广泛的问题。通过缩小问题的范围,您将获得更好的答案。我读了你的问题,真的不明白你在做什么。您应该始终提及您尝试过的内容、预期行为和实际行为。听起来像是请为我做这件事的问题可能会被忽略。回答您的问题的最佳方式是创建一个 jsfiddle.net 来显示您正在尝试做的事情。
  • @JuanMendes 感谢您的建议,我更新了问题,希望现在更清楚了。如果不是,请告诉我。
  • 我很高兴您对问题的重新处理得到了答案。有时当我告诉别人改进问题时,我可能听起来很粗鲁。

标签: javascript html-table append


【解决方案1】:

更新:感谢您编辑问题,我看到了问题,尝试更改您的函数代码appendTable(但是这个名称不再好;):

function appendTable(id)
 {
     var tbody = document.getElementById(id).getElementsByTagName("tbody")[0];
     var i = 0;
     var rows = tbody.rows;
     for (var r = 0; r < 4; r++) {
         var row = rows[r];
         for (var c = 0; c < 4; c++) {
             var cell = row.cells[c];
             cell.innerHTML = subset[i++];
         }
     }
 }

你的错误是你一直插入行,并在其中插入单元格。相反,您使用数组rows 的tbody 元素(很明显它为您提供了表格的所有行),而rows 又具有cells 的数组 - 行的所有单元格。所以现在您可以“重用”它们来更新表格内容。

注意,此函数使用表格,但不创建它(您的整个函数创建了表格行和单元格)。

【讨论】:

  • 我试过了,它开始起作用了!但是它通过执行 r1c1、r2c2 等以一种奇怪的方式编辑表格,请参阅:jsfiddle.net/kmg4x/2
  • @tehaaron:我注意到并修复了它,抱歉;只是忘了循环遍历行;)
  • 啊,你打败了我!我正在取得进展,但有一些事情不正常。谢谢!..如果我可以的话..如果我要在所有单元格内创建输入框以使它们可编辑,这是否需要大量编辑?因此,与其编辑 &lt;td&gt;&lt;/td&gt; 中的内容,不如编辑 &lt;td&gt;&lt;input type="text" size="1" /&gt;&lt;/td&gt; 中的内容?...这与总体目标和我链接的其他问题有关。
  • @tehaaron:看看我的回复there,我的“问题”是否正确,您需要什么?
【解决方案2】:

您可以通过为表格中的每个单元格分配 id 来让您的生活更轻松,例如

<table>
    <tr id=tr_1>
        <td id=td_a1>a</td>
        <td id=td_a2>a</td>
    </tr>
    <tr id=tr_2>
        <td id=td_b1>a</td>
        <td id=td_b2>a</td>
    </tr>
 <table>

etc.这种方式的ids很容易以编程方式生成,然后使用:

function changeCell(id, txt) {
    var td = document.getElementbyId (id);
    td.innerHTML=txt;
}

【讨论】:

  • 但是当我稍后添加一个实际上会创建更多行和单元格然后使用数组中的下一个字母自动填充它们的按钮时,它会保持简单吗?难道我不需要写入函数 a sn-p 来增加 TD id 号 td_x++ 和 tr_y++ 吗?还会更简单吗?
  • 我假设该表将保持小作为您的示例。然后for (int i=0; i&lt;maxrows, i++) { for j=0; j&lt;maxcolx; j++) {var tr=document.createElement ("tr") tr.setAttribute ("id", "td_"+i+"_"+j); 等。将很容易处理几行
  • 我还看到 Maxym 还给了你另一个更接近你想做的答案。
  • 如果表格要保持静态大小,我喜欢你的方法。不幸的是,它稍后会根据按钮点击来改变大小,我认为附加你的方法需要额外的循环集,我不想写。如果我发现它实际上会更容易,我可能会稍后再谈。谢谢! +1
【解决方案3】:

如果你想编辑表格的单元格,你需要...这很难告诉你

你有多少个 inpt 字段?

您想如何编辑表格?将单元格的文本替换为新输入,然后对其进行编辑,或者创建一个完整的新表单,您可以在其中输入行/列编号,然后编辑单元格。还是怎么做?

这并不容易。你应该告诉你的愿望来完成这项工作。

【讨论】:

    【解决方案4】:

    使用document.createElement('&lt;input type="text"/&gt;')代替document.createTextNode并生成输入框

    【讨论】:

    • document.createElement('&lt;input type="text"/&gt;') 不是跨浏览器;但是,document.createELement('input') 具有相同的效果,因为默认类型是文本
    猜你喜欢
    • 2013-11-12
    • 1970-01-01
    • 2021-07-08
    • 2012-08-18
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 2023-01-14
    • 1970-01-01
    相关资源
    最近更新 更多