意外的数据表示形式
Unexpected data representation
所以我有一个应用程序,它允许您添加数据,然后它显示所有数据(仍然wip)。因此,到目前为止,我使用localStorage和jQueryMobile以及jQueryUI制作了创建和读取功能。
但是由于某种原因,当我在页面(主页/添加数据页面)之间切换时,我在主页上看到了克隆的数据。我看到的不是 2 个条目,而是 4 个条目,它是原始的 2 个条目彼此都有副本。当我刷新页面时,它工作正常,它只显示原始数据,没有克隆。请注意,仅当您转到"添加页面"然后返回主页(通过单击"主页"按钮)时,才会发生这种情况。
此外,当您添加运行时,由于某种原因,它会同时添加 2 个运行(运行添加功能2 次)
这是代码:
$(document).on('pageinit', function() {
//Display runs
showRuns();
//Add Handler for Adding Runs
$('#submitAdd').on('tap', addRun);
/*
* Show all runs on homepage
*/
function showRuns() {
//get runs Object
var runs = getRunsObject();
var i = 0;
if (runs != '' && runs != null) {
for (i; i < runs.length; i++) {
$('#stats').append('<li class="ui-body-inherit ui-li-static"><strong>Date: </strong>' + runs[i]["date"] + '<strong> <br/>Distnace: </strong>' + runs[i]["kms"] + 'km</li>');
}
$('#home').bind('pageinit', function() {
$('#stats').listview('refresh');
});
}
}
/*
* addRun function
*/
function addRun() {
//Get form values
var kms = $('#addKms').val();
var date = $('#addDate').val();
//Create 'Run' Object
var run = {
date: date,
kms: parseFloat(kms)
};
var runs = getRunsObject();
//Add run to runs array
runs.push(run);
alert('Run Added');
//Set stringified objects to localstorage
localStorage.setItem('runs', JSON.stringify(runs));
//Redirect
window.location.href = "index.php";
//Preventing form from submiting
return false;
}
/*
* getRunsObject
*/
function getRunsObject() {
//Set runs array
var runs = [];
//Get current runs from localStorage
var currentRuns = localStorage.getItem('runs');
//Check localStorage
if (currentRuns != null) {
//Set to runs
var runs = JSON.parse(currentRuns);
}
//Return sorted runs object
return runs.sort(function(a, b) {
return new Date(b.date) - new Date(a.date);
});
}
});
body {
text-align: center;
}
ul {
display: block;
}
.controls {
float: right;
}
<!DOCTYPE html>
<html>
<head>
<title>Running Tracker</title>
<link rel="stylesheet" href="css/style.css" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jquerymobile/1.4.5/jquery.mobile.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquerymobile/1.4.5/jquery.mobile.min.js"></script>
<script src="js/script.js"></script>
</head>
<body>
<!-- Main Page -->
<div data-role="page" id="home">
<header data-role="header" data-theme="a">
<h1>Running Tracker</h1>
</header>
<div data-role="navbar">
<ul>
<li>
<a href="#home" data-transition="none" data-icon="home">Home</a>
</li>
<li>
<a href="#add" data-transition="none" data-icon="plus">Add Run</a>
</li>
</ul>
</div>
<div data-role="content">
<h3>Welcome to the RunningTracker App</h3>
<p>
With this app you can track your running, jogging or walking.
</p>
<h3>Your Latest Runs:</h3>
<ul id="stats" data-role="listview" data-filter="true" data-filter-placeholder="Filter runs by date or distance." data-inset="true"></ul>
<br/>
<button id="clearRuns" onclick="return confirm('Are You Sure?')">
Clear Data
</button>
</div>
<footer data-role="footer">
<h4>RunningTracker © 2015 GZ</h4>
</footer>
</div>
<!-- Add Run Page -->
<div data-role="page" id="add">
<header data-role="header" data-theme="a">
<h1>Running Tracker</h1>
</header>
<div data-role="navbar">
<ul>
<li>
<a href="#home" data-transition="none" data-icon="home">Home</a>
</li>
<li>
<a href="#add" data-transition="none" data-icon="plus">Add Run</a>
</li>
</ul>
</div>
<div data-role="content">
<h3>Add Run</h3>
<form id="addForm">
<label for="km">Enter Kilometres:</label>
<input type="number" id="addKms">
<label for="km">Enter Date:</label>
<input type="date" data-role="date" class="date" id="addDate" data-inline="true">
<button id="submitAdd" class="ui-btn ui-corner-all">
Add Run
</button>
</form>
</div>
<footer data-role="footer">
<h4>RunningTracker © 2015 GZ</h4>
</footer>
</div>
</body>
</html>
由于某种原因,示例没有在StackOverflow上加载,所以这里是现场演示:
http://runningtracker.herokuapp.com/index.php
尝试添加新运行,然后切换回添加页,然后切换回主页。
问题出在pageinit
事件处理中。您省略了选择器,因此调用处理程序两次(对于home
和add
页),这样做会调用$('#submitAdd').on('tap', addRun);
两次,从而导致双addRun
调用。
将行更改为:
$(document).on("pagecreate", "#home", function() {
(pagecreate
现在取代了pageinit
,参见jQM API)
另外,请更改您的"重定向"删除window.location.href = "index.php";
。
该指令会绕过jQuery Mobile导航系统更改页面,结果是在每次addRun
调用后调用pageinit
事件(而它应该只调用一次)。
请改用更改方法更改页面:
$("body").pagecontainer("change", "#home", { transition: "none" });
好吧,我找到了一个解决方案。我替换了:
$(document).on('pageinit', function() {});
跟:
$(document).one('pageinit', function() {});
有 2 页,所以每个函数都运行两次,这导致了我的问题。通过使用one
而不是on
我强制所有脚本只运行一次,无论我有多少页。
- React中的数据集表示
- 如何在ember数据模型中表示数组
- 在 Javascript 中表示复杂/嵌套数据
- 用于在表和报表的发件人中表示 CSV 文件数据的工具
- AngularJS json.parse 在 json 数据的第 1 行第 1 列处意外的数据结尾
- 文字与原型对象表示法的数据结构
- Ajax响应成功,但无法使用数据(未捕获语法错误:意外标识符)
- 表示可用产品的所有组合的数据结构
- Json响应错误Json.parse:意外的数据结束错误
- Immutable.js:表示2D游戏场的数据结构
- Uncaught SyntaxError:尝试读取json数据时出现意外数字
- 我有来自OpenWeatherMap API的风向数据,数据以0到360度表示.我想将其转换为文本格式
- 车把中的索引运算符表示意外令牌,
- 用于大数据表示的Javascript网格
- Angular ngrid数据表示
- 如何在richselect中配置数据表示
- 调用rest WS并获取:SyntaxError: JSON.解析:JSON数据的第1行第1列数据的意外结束
- JSON.Parse报错“数据的意外结束”
- 意外的数据表示形式
- Google Charts Javascript 文字数据表示法给出“Not a array”错误