带有 contenteditable
属性的元素可以在浏览器窗口中进行实时编辑。但当然,这些更改不会影响服务器上的实际文档,因此这些更改不会在页面刷新后保留。
一种保存数据的方法是等待按下回车键,然后触发发送元素的新 innerHTML 作为 Ajax 调用并使元素失去焦点。按 Esc 键将元素恢复到编辑前的状态。
document.addEventListener('keydown', function (event) {
var esc = event.which == 27,
nl = event.which == 13,
el = event.target,
input = el.nodeName != 'INPUT' && el.nodeName != 'TEXTAREA',
data = {};
if (input) {
if (esc) {
// restore state
document.execCommand('undo');
el.blur();
} else if (nl) {
// save
data[el.getAttribute('data-name')] = el.innerHTML;
// we could send an ajax request to update the field
/*
$.ajax({
url: window.location.toString(),
data: data,
type: 'post'
});
*/
log(JSON.stringify(data));
el.blur();
event.preventDefault();
}
}
}, true);
function log(s) {
document.getElementById('debug').innerHTML = 'value changed to: ' + s;
}
查看 CodePen 上 Chris Coyier (@chriscoyier) 编写的 Contenteditable / Save with JSON/Ajax。
我不明白如何将此保存到服务器?我尝试删除注释符号以使 ajax 工作,但没有成功。有人知道吗?
在这里看看,我做了一些简单的更改,允许你直接读取/写入 HTML 文件中来自任何名为
<div class='editable'>
标签的 contentEditable 更改,我将代码上传到 GitHub 上,这里有一个完整的解释,http://www.abrandao.com/2019/12/saving-contenteditable-html-using-php/
如果用户按撤消(Ctrl-Z 或 Cmd-Z)怎么办?然后 contenteditable 元素恢复到其先前状态,但恢复不会持久保存到数据库。有没有一种跨平台的方法来检测它?
为了使其也适用于 FF
document.execCommand('undo', false, null); // 恢复到上一个状态
我如何将输出保存到 cookie 中,以便如果我刷新或关闭页面,内容仍然存在。
谢谢
Dan
我是否也可以监听可编辑内容外部的鼠标点击?
嗨,我正在尝试将结果存储到数据库中,但是当我检索结果时,它输出没有任何格式,只是一个简单的纯文本。我使用的是 PHP,谁能帮我一下?
提前感谢
1) 为什么之后需要失去焦点
2) 为什么每个人都链接到那个奇怪的 JS Bin - 它不起作用?
请更新演示
给你
http://codepen.io/chriscoyier/pen/LVEdJg
“keydown” 事件,就像 “input” 事件一样,在嵌套了多个 contenteditable 元素时表现得很奇怪(就我的口味而言)。
例如,如果我将 contenteditable 属性添加到 “body”,它将破坏此演示代码。这是因为在这种情况下 “event.target” 将是 body,因为它是一个更高级别的 contenteditable 祖先。因此,如果你的页面上有多个 contenteditable 元素,你应该注意它们之间没有嵌套关系。
来源:https://mdn.org.cn/en-US/docs/Web/Events/input
在 2018 年仍然有效。最佳且简洁的 contentEditable 监听器,可以在不被打扰 Enter 和 Esc 的默认行为的情况下保存更改。我用它来保存 dataTable 上的更改。谢谢!
是否有任何 IDE 可以本地执行此操作?我有一个朋友想编辑一个 Bootstrap 模板。