可编辑文档中多个字段的本地存储
Localstorage to multiple fields in a editable document
我有一个本地运行的HTML/CSS/Jquery网页,用于一个项目。
我正在尝试实现我刚刚学到的两件事,即让页面上的所有文本区域对访问它的人都是可编辑的,然后尝试获得本地存储来为编辑人员保存编辑。
这是我所拥有的一个片段(其余部分只是行和列的延续):这是HTML,它也使它可以编辑(这很有效)
<div id="columns">
<ul id="column1" class="column">
<li class="widget color-red" contenteditable="true">
<div class="widget-head" id="persisted-text">
<h3>Widget title</h3>
</div>
<div class="widget-content">
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam magna sem, fringilla in, commodo a, rutrum ut, massa. Donec id nibh eu dui auctor tempor. Morbi laoreet eleifend dolor. Suspendisse pede odio, accumsan vitae, auctor non, suscipit at, ipsum. Cras varius sapien vel lectus.</p>
</div>
</li>
<li class="widget color-red">
<div class="widget-head">
<h3>Widget title</h3>
</div>
<div class="widget-content">
<p id="persisted-text">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam magna sem, fringilla in, commodo a, rutrum ut, massa. Donec id nibh eu dui auctor tempor. Morbi laoreet eleifend dolor. Suspendisse pede odio, accumsan vitae, auctor non, suscipit at, ipsum. Cras varius sapien vel lectus.</p>
</div>
</li>
</ul>
以及JS:
var supported = 'This text will be saved locally, forever.',
unsupported = 'Oh no! Your browser does not support localStorage.';
if (window.localStorage) {
var p = document.querySelector('#persisted-text');
if (localStorage.text == null) {
localStorage.text = p.value = supported;
} else {
p.value = localStorage.text;
}
p.addEventListener('keyup', function(){ localStorage.text = p.value; }, false);
} else {
document.getElementById('persisted-text').value = unsupported;
}
如果我创建一个文本区域并添加id,这也可以,但它只适用于其中一个区域。如果可能的话,我希望两者结合(可编辑和本地存储)。我错过了什么?
我还加载了一个jsfiddlehttp://jsfiddle.net/6LdfD/2/
感谢您查看
在我的演示中,我选择了p
和contenteditable
的所有元素。您还可以使用一个类来标识您希望使用的元素。我根据元素在页面上的位置将其与数据关联,因此第一个<p contenteditable="true"></p>
标记与localStorage['editable0']
关联。如果您四处移动标记,这可能会有问题,因此您可能希望在每个元素上放置一个标记(类或数据属性),并使用它来标识每个元素。这应该让你开始,你可以扩展它并根据你的需求进行调整。
现场演示(点击)。
var editables = document.querySelectorAll('p[contenteditable]');
for (var i=0; i<editables.length; ++i) {
var prop = 'editable'+i;
if (localStorage[prop]) { //restore content from cache if it exists
editables[i].textContent = localStorage[prop];
}
addKeyup(editables[i], prop);
}
function addKeyup(elem, prop) {
elem.addEventListener('keyup', function() {
store(prop, this.textContent);
});
}
function store(prop, val) {
localStorage[prop] = val;
console.log(prop);
console.log(localStorage[prop]);
}
你的标记可能看起来像:
<p contenteditable="true">Some text.</p>
<p contenteditable="true">Some text.</p>
<p contenteditable="true">Some text.</p>
<p contenteditable="true">Some text.</p>
<p contenteditable="true">Some text.</p>
因此,您的代码存在几个问题
- 多个id,html标准不允许
- 您不能在可竞争的子项上设置keyup/input事件
- 您必须更改节点的innerText属性,而不是"value"
所以这里是对你的代码进行最小更改的演示(请注意,我并没有为pararpah索引做最好的处理(只是为了出现的顺序)
html:
<div id="columns">
<ul id="column1" class="column">
<li class="widget color-red" id="edit1">
<div class="widget-head">
<h3>Widget title</h3>
</div>
<div class="widget-content">
<p class="persisted-text" contenteditable="true">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam magna sem, fringilla in, commodo a, rutrum ut, massa. Donec id nibh eu dui auctor tempor. Morbi laoreet eleifend dolor. Suspendisse pede odio, accumsan vitae, auctor non, suscipit at, ipsum. Cras varius sapien vel lectus.</p>
</div>
</li>
<li class="widget color-red">
<div class="widget-head">
<h3>Widget title</h3>
</div>
<div class="widget-content">
<p class="persisted-text" contenteditable="true">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam magna sem, fringilla in, commodo a, rutrum ut, massa. Donec id nibh eu dui auctor tempor. Morbi laoreet eleifend dolor. Suspendisse pede odio, accumsan vitae, auctor non, suscipit at, ipsum. Cras varius sapien vel lectus.</p>
</div>
</li>
</ul>
</div>
js
var supported = 'This text will be saved locally, forever.',
unsupported = 'Oh no! Your browser does not support localStorage.';
if (window.localStorage) {
var ps = document.querySelectorAll('.persisted-text');
//localStorage.text=localStorage.text||[];
for (var n = 0; n < ps.length; n++) {
var p = ps[n];
if (localStorage['text' + n] === undefined) {
localStorage['text' + n] = p.innerText = supported;
} else {
p.innerText = localStorage['text' + n];
}
console.log(p);
document.addEventListener('input', (function (p, n) {
return function (e) {
console.log(e, "111");
localStorage['text' + n] = p.innerText;
};
})(p, n));
}
} else {
var ps = document.getElementsByClassName('persisted-text');
for (var n = 0; n < ps.length; n++) {
var p = ps[n];
p.innerText = unsupported;
}
}
http://jsfiddle.net/6LdfD/5/
相关文章:
- npm警告包.jsonCrackingJS@0.0.1没有存储库字段
- 本地存储自动完成/提前键入字段的数据
- 将会话登录页存储在cookie中以进行表单解析(通过隐藏字段)
- 如何存储&读取输入字段中的任意url
- 将布尔值存储在隐藏字段中以进行表单处理
- 为什么在下面的场景中,用于存储所选文件名和文件路径的隐藏输入字段没有在表单上生成
- 使用本地存储存储字段值
- 可编辑文档中多个字段的本地存储
- jQuery:在输入字段上使用Web存储/本地存储
- 在数组中存储 JQuery 字段与仅存储选择字符串相比如何
- 如何在煎茶上循环存储和计数字段数据
- 如何移除 DOJO 数据存储添加到我提取的项目中的所有额外字段
- 如何使用 jquery 使用本地存储变量设置输入字段
- EXT JS :在组合框中,如何为不在存储中的记录设置显示字段
- 在 Jquery 中添加循环变量并存储在输入字段中
- Google Maps JavaScript API v3 - 在iPhone上查看的网页上的自动完成字段不存储值,不返
- 洋红色 2 中的媒体存储浏览器字段
- 如何使用存储在 rails 序列化字段中的数据
- 克隆 使用 javascript 选择选项并将它们存储在隐藏字段中
- 返回数组中存储字段的数据