使用本地存储的可排序列表函数出错
Error in function for sortable list using local storage
我使用这个函数与framework7排序列表来保存列表顺序的位置,我可以将它们保存到本地存储,但我无法读取它们,我得到了这个错误:
Uncaught TypeError: Cannot read property 'id' of undefined
它指的是这一行:
if (ls[j] === itemsArr[i].dataset.id) {
这是我的全部功能:
var list = document.getElementById('my-id');
var items = list.children;
var itemsArr = [];
for (var i in items) {
itemsArr.push(items[i]);
}
// localStorage
var ls = JSON.parse(localStorage.getItem('data-user-sort') || '[]');
for (var j = 0; j < ls.length; j++) {
for (i = 0; i < itemsArr.length; ++i) {
if (ls[j] === itemsArr[i].dataset.id) {
list.appendChild(itemsArr[i]);
}
}
}
$('.list-block.sortable').on('sort', function () {
var newIdsOrder = [];
$(this).find('li').each(function(){
newIdsOrder.push($(this).attr('data-id'));
});
localStorage.setItem('data-user-sort', JSON.stringify(newIdsOrder));
});
这里是my html:
<div class="list-block sortable">
<ul id="my-id">
<li data-id="1">
<a href="#" class="item-link item-content">
<div class="item-inner">
<div class="item-title">Item 1</div>
</div>
</a>
<div class="sortable-handler"></div>
</li>
<li data-id="2">
<a href="#" class="item-link item-content">
<div class="item-inner">
<div class="item-title">Item 2</div>
</div>
</a>
<div class="sortable-handler"></div>
</li>
<li data-id="3">
<a href="#" class="item-link item-content">
<div class="item-inner">
<div class="item-title">Item 3</div>
</div>
</a>
<div class="sortable-handler"></div>
</li>
</ul>
</div>
帮忙吗?
问题是你的itemsArr变量不仅包含"li"对象,所以当你迭代它时,你最终试图访问对象上的"dataset"属性,而它不存在。
如果你调试你的javascript,你会看到你有3个"li"类,列表的长度和2个函数(item()和namedItem()),正因为如此,你在第三次迭代后得到这个错误。
正如其他人已经说过的,您首先需要验证属性是否存在,但是他提供给您的代码将失败,因为他还检查了dataset的属性id,这是一个未定义的值。下面的代码应该可以为您工作:
for (var j = 0; j < ls.length; j++) {
for (i = 0; i < itemsArr.length; ++i) {
if(itemsArr[i].dataset !== undefined){
if (ls[j] === itemsArr[i].dataset.id) {
list.appendChild(itemsArr[i]);
}
}
}
}
您也可以通过验证来检查这个jsfiddle https://jsfiddle.net/7bv849wc/1/
编辑,因为我忘记添加索引itemsArr*
似乎不是抛出错误的本地存储,而是试图访问未定义的数组元素的属性(在您的情况下是数据集)。您可以先检查属性是否未定义:
if ((itemsArr[i].dataset.id !== undefined) && ls[j] === itemsArr[i].dataset.id) {
你可能希望对你的数据做额外的检查,以防止这些类型的错误,希望这能帮助你回到正轨。
相关文章:
- 为什么HTML5拖放的目标是孩子?(可排序列表)
- jQuery拖动到相对位置的可排序列表中时出现可拖动辅助对象位置问题
- jQuery带计数器的可排序列表
- 我们可以在 CouchDB 中对排序列表视图进行排序吗?
- SharePoint :按日期排序列表
- jQueryUI可排序-从可排序列表中删除li
- Rails3-可排序列表不能与wysihtml5一起工作
- 如何同步包含克隆元素的jquery可排序列表
- 无法将id放在Jquery插件生成的模式中的未排序列表上
- 为未排序列表设置onclick()属性
- Mvc4将Jquery可排序列表项的顺序保持到控制器
- 无法从jQuery可排序列表中删除新添加的项
- iframe内容可编辑,位于jqueryUI可排序列表项中
- 对象的数组列表的Javascript排序列表-基于特定的数组列表
- 动态生成<选择>未显示已排序列表中的第一个项目
- 从 ajax 调用到 jquery UI 可排序列表构建 html
- 使用 jqueryui 的多个可排序列表 - 不希望项目在列表组之间混合
- jQuery - 获取可排序列表的索引
- jQuery - 排序后更新可排序列表
- YUI 轮播导航按钮在排序列表下