您可以通过添加contenteditable
属性使任何 HTML 元素内的文本可编辑。
<div contenteditable>
Hey, I'm like a textarea kinda now!
</div>
我不会说有成堆的用例,但它很简洁。一个可能的用途可能是正在进行的设计,其中从设计本身编辑内容对您或其他人(客户?)很有用,他们需要更改文本。
所以,很棒,contenteditable
。现在有人可以点击文本并编辑它。
这些更改不是永久性的。刷新页面,查看另一个浏览器或任何其他操作。这些编辑都消失了。
假设您想做得稍微好一点,并使更改持久化。您不是要在这里构建一个CMS,也不是通过经过身份验证的连接到数据库来保存数据。您只是想在页面刷新时保持对文本的编辑。
一种方法是将您对文本所做的更改中的数据放入localStorage
中。
- 当文本被编辑时(在元素的
blur
事件中),使用命名空间将数据保存到localStorage
中,并使用
元素的ID作为键。 - 页面加载时,查看
localStorage
并查看是否有任何键与页面上的元素匹配,如果有,则替换内容。
const editables = document.querySelectorAll("[contenteditable]");
// save edits
editables.forEach(el => {
el.addEventListener("blur", () => {
localStorage.setItem("dataStorage-" + el.id, el.innerHTML);
})
});
// once on load
for (var key in localStorage) {
if (key.includes("dataStorage-")) {
const id = key.replace("dataStorage-","");
document.querySelector("#" + id).innerHTML = localStorage.getItem(key);
}
}
查看 CodePen 上 Chris Coyier (@chriscoyier) 编写的
localStorage + contenteditable。
在 CodePen 上。
这让我想起了其他一些事情……
是否可以将此数据保存到更永久的位置?
你的意思是?
当然。您可以将其保存到 .db 文件或数据库中,而不是将其保存到 localStorage 中。或者在会话中。取决于你的目的
是的,但这就是 CMS(如 WordPress)的作用。本文重点介绍的是能够拥有一个 Web 草稿本,而不是一个 CMS。如果您能够与客户合作并进行此类动态更改,则可以获得更精确的调整,然后将这些更改更永久地纳入后续审查会议。
TIL
document.designMode
。您可以使用 ajax 并将其发送到数据库来使其更持久。
在 React 中,需要更改为“contentEditable”,它会给你一个警告
您还可以使用
display: block
显示 head 和 style/script 元素,并将其设置为 contenteditable 以动态更改 css 或 javascript。我实际上喜欢将其用于原型和 POC,这些原型和 POC 会传递给开发人员。有助于为客户和利益相关者提供更真实的演示。
有没有办法让其他人看到这些更改?(我仅使用 html)