【问题标题】:Alternative to Jeditable for editable table cells可编辑表格单元格的替代 Jeditable
【发布时间】:2017-11-19 00:52:42
【问题描述】:

我一直在尝试使用 Jeditable 使我的 html 表格可编辑。然而,经过大量研究,我发现验证输入非常困难(如果不是不可能的话)。

我真的不希望使用任何类型的插件,而只是编写/使用一些 Javascript,这将使单元格可编辑并允许我将 jQuery Validator 附加到输入。数据永远不会提交到后端(将在页面刷新时返回默认值),因此解决方案不需要很复杂......只会使用 html 和 Javascript。

我使用 Google 发现的大多数代码 sn-ps 的问题是,当您在单元格内单击时,它们似乎卡住了,而在单元格外单击不会保存/提交更改。

是否有人拥有成功使用的 sn-p 和/或使用 Validator 的 sn-p 的经验?

【问题讨论】:

  • 如果您希望所有内容都可编辑但不保存,为什么不在单元格内使用输入......?
  • 验证输入并不难,只需制作您自己的可编辑控件类型,例如参见digitalbush.com/projects/masked-input-plugin
  • @vittore 感谢链接,我已经在登录表单上使用 jQuery Validator,所以我更愿意继续使用它。但是,如果我决定继续使用 Jeditable,我可能会使用您的链接作为参考来为输入创建掩码,因为我相信您可以在 Jeditable 插件中创建自定义掩码。
  • @amosrivera 我喜欢让单元格在被点击之前看起来是永久的......但是我可以尝试使用一些 CSS 看看是否可以获得相同的效果。
  • 确实,您可以使用 :focus 伪类更改样式..

标签: javascript jquery jeditable


【解决方案1】:

嗯,根据我在您的another question 中获得的信息,您可以将该函数更改为:

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.firstChild.value = subset[i++]; // the only part changed
         }
     }
 }

当你的 html 看起来像这样时:

<table id="alphabetTable" border="1">
    <thead>
        <tr>
            <th>Header1</th>
            <th>Header2</th>
            <th>Header3</th>
            <th>Header4</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><input type = "text" size="1" /></td>
            <td><input type = "text" size="1" /></td>
            <td><input type = "text" size="1" /></td>
            <td><input type = "text" size="1" /></td>
        </tr>
        <tr>
            <td><input type = "text" size="1" /></td>
            <td><input type = "text" size="1" /></td>
            <td><input type = "text" size="1" /></td>
            <td><input type = "text" size="1" /></td>
        </tr>
        <tr>
            <td><input type = "text" size="1" /></td>
            <td><input type = "text" size="1" /></td>
            <td><input type = "text" size="1" /></td>
            <td><input type = "text" size="1" /></td>
        </tr>
    </tbody>
</table>

如您所见,我依赖 firstChild 属性,但它可能很危险,例如当你的 html 看起来像:

<td> <input type = "text" size=1 /> </td>

那么至少 FF 返回 &lt;TextNode textContent=" "&gt; 作为 firstChild。不要依赖这个问题,你可以去:

cell.getElementsByTagName("input")[0].value = subset[i++]; 

PS。我写的所有内容都是基于我从另一个问题中获得的信息,如果有问题 - 发表评论,我会尝试改变;)

【讨论】:

  • 您能以多快的速度将其击倒,真是令人惊讶。我希望我能很好地了解我的 javascript 方式.. 才从星期一开始,所以还有很长的路要走!再次感谢,它工作得很好!我选择了cell.getElementsByTagName("input")[0].value = subset[i++]; 方法,因为我看到随着编辑的继续,另一个方法可能会很危险。
  • 我将开始处理下一部分,即添加行并让它们在添加时自动填充,基于原始单元格集中最后一个单元格的值(基本上运行 @987654329再次@函数)。如果我发布有关下一步的问题,是否应该稍后在这些帖子中评论您?
  • @tehaaron:我要睡觉了;)明天我可以看看你的问题;由你决定,我也可以在你的个人资料中找到它们;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
相关资源
最近更新 更多