我有一个页面,我在一个表中显示数据。
在每个表中,我有一个checkbox
的列,如果是checked
,用户可以通过Javascript修改特定的行。
这是因为它的td
封装了input
或select
,并且我使它们可供用户编辑。
用户修改该行并按下save键,然后保存更改。到目前为止还好。
我的问题是如何实现cancel
?
用户可以选择许多行,即复选框并修改它们,但用户也可以按取消。取消后,应该显示原始值(并且行再次变为不可编辑)。
但是如何在Javascript中实现取消操作呢?我们是否将数据存储在一些全局数据结构中?这在Javascript中是什么?
好的,在添加了您提供的信息之后,我建议您设置以下机制:
function getDatas() {
var oXhr;
//get datas from database:
oXhr = new XMLHttpRequest();
oXhr.onreadystatechange = function() {
if (oXhr.readyState == 4 && (oXhr.status == 200)) {
g_oData = (new DOMParser()).parseFromString(oXhr.responseText, "text/xml");
}
}
oXhr.open("POST", "yourphpscriptthatreturnsthexmldatas.php", true);
oXhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=utf-8");
oXhr.send();
}
function populateGrid() {
//use g_oData to populate your grid, but at first totally clean the body
var mygrid = document.getElementById("mygridid");
//mygrid.innerHtml = "<table><tr><td>...</td></tr></table>";
//use the xml library to parse g_oData and fill up the table:
var xmlRows = g_oData.getElementsByTagName("TAG");
var xmlRow;
iLen = xmlRows.length;
for (var i=0;i<iLen;i++) {
xmlRow = xmlRows[i];
//use xmlRow->textContent to build each cell of your table
}
}
function revertChange() {
//on cancel, revert the changes by populating the grid.
//it will use the global xml/json object loaded directly from database, to refill everything.
populateGrid();
}
我自己做过很多次刷新页面中的一些数据。这就是你所做的只是你不向数据库请求任何东西,你只是重新填充字段
您可以访问输入的原始value
属性以获取defaultValue
。示例实现:
$("table").on("dblclick", "td", function(e) {
var val = $(this).html();
$(this).empty().append($("<form/>").append(
$("<input/>", {type:"text"}).attr("value", val),
// ^^^^
// set the *attribute*, as if it was present in the parsed HTML
$("<button/>", {type:"reset"}).text("Reset"),
$("<button/>", {type:"button", class:"cancel"}).text("Cancel"),
$("<button/>", {type:"submit"}).text("Submit")
));
}).on("submit", "form", function(e) {
var val = $(this).find("input:text").val();
// ^^^^^
// which is equivalent to .prop("value")
/* then do something with val, e.g. send it to server via ajax */
$(this).parent().html(val);
e.preventDefault();
}).on("click", "button.cancel", function(e) {
var $form = $(this).parent(),
$input = $form.find("input:text"),
oldval = $input.attr("value");
// ^^^^^^^^^^^^^
// or .prop("defaultValue"), but not .val()!
if (oldval == $input.val() || confirm("Do you really want to discard your changes?"))
$(this).parent().html(oldval);
e.preventDefault();
});
(Demo at jsfiddle.net)
一个更简单的解决方案可能是使用创建表单的dblclick-handler作为闭包,并将原始html存储在那里的本地变量中。
这是一个非常简单的方法:
不要用form元素替换单元格内容。将值(文本)保留在span
元素中,并在显示表单元素时隐藏它。这样你就不用在cancel上做任何事情了。只需再次显示span
并隐藏或删除表单元素。只有当用户想保存值时才更新span
。
下面是一个例子。显示和隐藏都是通过CSS完成的。
<tr>
<td>
<span>value</span>
<input type='text' value='' />
</td>
<td>
<button class="save">Save</button>
<button class="revert">Revert</button>
</td>
</tr>
JS:
var rows = document.querySelectorAll('table tr');
for(var i = 0, l = rows.length; i < l; i++) {
rows[i].addEventListener('click', function(event) {
// all value display elements in the row
var spans = this.querySelectorAll('span');
// all form elements in the row
var inputs = this.querySelectorAll('input');
// handle click on save button
if (event.target.className === 'save') {
[].forEach.call(inputs, function(input, i) {
spans[i].innerHTML = input.value;
});
this.className = '';
}
// handle click on revert button
else if (event.target.className === 'revert') {
// not much to do
this.className = '';
}
else {
// update form element values
[].forEach.call(inputs, function(input, i) {
input.value = spans[i].innerHTML;
});
this.className = 'edit';
}
});
}
您可以使用HTML5 data-
属性来实现恢复功能。这样,如果使用revert
按钮,每个<input>
将保持其原始值。
它看起来是这样的:
<table>
<tr>
<td><input type='text' value='change me' data-original='change me' /></td>
<td><input type='text' value='change me2' data-original='change me2' /></td>
<td><input type='button' value='revert' onclick='revert(this)'/></td>
</tr>
<table>
和返回的代码:
function revert(btn) {
var parentTr = btn.parentNode.parentNode;
var inputs = parentTr.getElementsByTagName('input');
for(var i = 0; i < inputs.length; i++) {
if (inputs[i].type == 'text') {
inputs[i].value = inputs[i].getAttribute('data-original');
}
}
}
可以生成data-original
属性:
- 由服务页面的服务器端应用程序(参见(1)demo fiddle here);或
- 由一个JavaScript函数执行,该函数在DOM准备好后立即执行(参见(2)demo fiddle for this here)。
作为附带解决方案,您可以将原始值存储在map
对象中。下面是这个的(3)演示(注意我为每个input
添加了id
,因此它可以用作map
的键)。
请记住,解决方案(2)或(3)都不需要更改服务器端代码(3假设您的输入有id)。(2)感觉更清晰。
关于defaultValue
属性:
defaultValue
属性只能是一个解决方案,如果要恢复的值永远不会改变,如果涉及的字段是文本input
s。
首先,改变"默认值"是相当尴尬的,可能会破坏页面上的其他东西(人们会期望浏览器使defaultValue
属性为只读,但情况似乎并非如此)。其次,您将被限制为文本类型的input
s。
但是,如果这些都不是问题,可以快速调整上面的代码以使用它们来代替data-
属性。