大约一个小时之前,我给出了关于索引数据框的表示。有个参会者问了关于日期以及如何基于日期范围进行过滤。我告诉他我的设想是将日期转换为数值,然后使用数值相关的范围。但事实证明我错了,下面是一个例子。
开始,我创建了一个基于创建域的存储对象。我们目的是想通过日期来进行搜索,因此我使用创建这个名字。同时将存储对象命名为data。虽然看起来很无聊,但是很有用。 - function doSeed() {
- var now = new Date();
- for(var i=0; i<10; i++) {
- var dayDiff = getRandomInt(1, 7);
- var thisDate = new Date();
- thisDate.setDate(now.getDate() + dayDiff);
- db.transaction(["data"],"readwrite").objectStore("data").add({created:thisDate});
- }
- }
- //Credit: Mozilla Developer Center
- function getRandomInt (min, max) {
- return Math.floor(Math.random() * (max - min + 1)) + min;
- }
复制代码需要注意的是,由于索引数据框调用是异步的,因此代码需要处理更新,让用户知道什么时候操作结束了。由于这只是一个简单的演示,因此添加操作将很快结束,我就没必要担心了。 - function doSearch() {
- var fromDate = document.querySelector("#fromDate").value;
- var toDate = document.querySelector("#toDate").value;
- var range;
- if(fromDate == "" && toDate == "") return;
- var transaction = db.transaction(["data"],"readonly");
- var store = transaction.objectStore("data");
- var index = store.index("created");
- if(fromDate != "") fromDate = new Date(fromDate);
- if(toDate != "") toDate = new Date(toDate);
- if(fromDate != "" && toDate != "") {
- range = IDBKeyRange.bound(fromDate, toDate);
- } else if(fromDate == "") {
- range = IDBKeyRange.upperBound(toDate);
- } else {
- range = IDBKeyRange.lowerBound(fromDate);
- }
- var s = "";
- index.openCursor(range).onsuccess = function(e) {
- var cursor = e.target.result;
- if(cursor) {
- s += "<h2>Key "+cursor.key+"</h2><p>";
- for(var field in cursor.value) {
- s+= field+"="+cursor.value[field]+"
- ";
- }
- s+="</p>";
- cursor.continue();
- }
- document.querySelector("#status").innerHTML = s;
- }
- }
复制代码现在就可以创建一个应用程序,它可以让我们添加包含Javascript合法日期的创建属性。请注意,我没有将它转为毫秒,而是直接传入。
最后只需在页面上添加两个日期域即可。在Chrome里还是不错的。
根据上述,我就可以创建一个上限,下限范围的索引数据框,并能在日期前,后或者在日期范围内的提示。
此处唯一需要转换的就是将用户的输入转换为真正的日期对象,这样就可以运行了。
运行下面的演示:
http://www.raymondcamden.com/demos/2013/jun/6/test1.html
|