indexedDB:删除功能不起作用
indexedDB: Delete function is not working
下面这组函数其实是给indexedDb
用的,在这deleteTodo
里不起作用。我从一个站点记下了以下代码,在 运行 示例中它运行良好。但是在我写下的代码中,delete
函数并没有删除那些项目。我分析了那个代码发现,据我所知,没有错误但是因为我是新手这个技术(indexedDB
)所以我不知道错误在哪里?
这是我的代码:
<head>
<script type="text/javascript">
var html5rocks = {};
html5rocks.indexedDB = {};
html5rocks.indexedDB.db = null;
html5rocks.indexedDB.open = function() {
var version = 1;
var request = indexedDB.open("todos", version);
request.onsuccess = function(e) {
html5rocks.indexedDB.db = e.target.result;
// Do some more stuff in a minute
};
request.onerror = html5rocks.indexedDB.onerror;
};
html5rocks.indexedDB.open = function() {
var version = 1;
var request = indexedDB.open("todos", version);
// We can only create Object stores in a versionchange transaction.
request.onupgradeneeded = function(e) {
var db = e.target.result;
// A versionchange transaction is started automatically.
e.target.transaction.onerror = html5rocks.indexedDB.onerror;
if(db.objectStoreNames.contains("todo")) {
db.deleteObjectStore("todo");
}
var store = db.createObjectStore("todo",
{keyPath: "timeStamp"});
};
request.onsuccess = function(e) {
html5rocks.indexedDB.db = e.target.result;
html5rocks.indexedDB.getAllTodoItems();
};
request.onerror = html5rocks.indexedDB.onerror;
};
html5rocks.indexedDB.addTodo = function(todoText) {
var db = html5rocks.indexedDB.db;
var trans = db.transaction(["todo"], "readwrite");
var store = trans.objectStore("todo");
var request = store.put({
"text": todoText,
"timeStamp" : new Date().getTime()
});
trans.oncomplete = function(e) {
// Re-render all the todo's
html5rocks.indexedDB.getAllTodoItems();
};
request.onerror = function(e) {
console.log(e.value);
};
};
html5rocks.indexedDB.getAllTodoItems = function() {
var todos = document.getElementById("todoItems");
todos.innerHTML = "";
var db = html5rocks.indexedDB.db;
var trans = db.transaction(["todo"], "readwrite");
var store = trans.objectStore("todo");
// Get everything in the store;
var keyRange = IDBKeyRange.lowerBound(0);
var cursorRequest = store.openCursor(keyRange);
cursorRequest.onsuccess = function(e) {
var result = e.target.result;
if(!!result == false)
return;
renderTodo(result.value);
result.continue();
};
cursorRequest.onerror = html5rocks.indexedDB.onerror;
};// end of getAllTodoItems
function renderTodo(row) {
var todos = document.getElementById("todoItems");
var li = document.createElement("li");
var a = document.createElement("a");
a.href="#";
var t = document.createTextNode(row.text);
//t.data = row.text;
a.addEventListener("click", function(e) {
html5rocks.indexedDB.deleteTodo(row.text);
});
a.textContent = " [Delete]";
li.appendChild(t);
li.appendChild(a);
todos.appendChild(li);
};
html5rocks.indexedDB.deleteTodo = function(id) {
var db = html5rocks.indexedDB.db;
var trans = db.transaction(["todo"], "readwrite");
var store = trans.objectStore("todo");
var request = store.delete(id);
trans.oncomplete = function(e) {
html5rocks.indexedDB.getAllTodoItems(); // Refresh the screen
};
request.onerror = function(e) {
console.log(e);
};
};
function init() {
html5rocks.indexedDB.open(); // open displays the data previously saved
}
window.addEventListener("DOMContentLoaded", init, false);
function addTodo() {
var todo = document.getElementById('todo');
html5rocks.indexedDB.addTodo(todo.value);
todo.value = '';
}
</script>
</head>
<body>
<h1>This is an experimental page...</h1>
<ul id="todoItems"></ul>
<input placeholder="add todo things" id='todo' type="text" />
<input type="submit" value="Add Todo Item" onclick="addTodo(); return false;">
</body>
这是我写下这段代码的 link:html5rock
请告诉我哪里错了。
anyFelp 会很棒
您必须将记录的键传递给 delete
,并且您将 timeStamp
定义为键,而不是 text
。
替换
html5rocks.indexedDB.deleteTodo(row.text);
和
html5rocks.indexedDB.deleteTodo(row.timeStamp);
下面这组函数其实是给indexedDb
用的,在这deleteTodo
里不起作用。我从一个站点记下了以下代码,在 运行 示例中它运行良好。但是在我写下的代码中,delete
函数并没有删除那些项目。我分析了那个代码发现,据我所知,没有错误但是因为我是新手这个技术(indexedDB
)所以我不知道错误在哪里?
这是我的代码:
<head>
<script type="text/javascript">
var html5rocks = {};
html5rocks.indexedDB = {};
html5rocks.indexedDB.db = null;
html5rocks.indexedDB.open = function() {
var version = 1;
var request = indexedDB.open("todos", version);
request.onsuccess = function(e) {
html5rocks.indexedDB.db = e.target.result;
// Do some more stuff in a minute
};
request.onerror = html5rocks.indexedDB.onerror;
};
html5rocks.indexedDB.open = function() {
var version = 1;
var request = indexedDB.open("todos", version);
// We can only create Object stores in a versionchange transaction.
request.onupgradeneeded = function(e) {
var db = e.target.result;
// A versionchange transaction is started automatically.
e.target.transaction.onerror = html5rocks.indexedDB.onerror;
if(db.objectStoreNames.contains("todo")) {
db.deleteObjectStore("todo");
}
var store = db.createObjectStore("todo",
{keyPath: "timeStamp"});
};
request.onsuccess = function(e) {
html5rocks.indexedDB.db = e.target.result;
html5rocks.indexedDB.getAllTodoItems();
};
request.onerror = html5rocks.indexedDB.onerror;
};
html5rocks.indexedDB.addTodo = function(todoText) {
var db = html5rocks.indexedDB.db;
var trans = db.transaction(["todo"], "readwrite");
var store = trans.objectStore("todo");
var request = store.put({
"text": todoText,
"timeStamp" : new Date().getTime()
});
trans.oncomplete = function(e) {
// Re-render all the todo's
html5rocks.indexedDB.getAllTodoItems();
};
request.onerror = function(e) {
console.log(e.value);
};
};
html5rocks.indexedDB.getAllTodoItems = function() {
var todos = document.getElementById("todoItems");
todos.innerHTML = "";
var db = html5rocks.indexedDB.db;
var trans = db.transaction(["todo"], "readwrite");
var store = trans.objectStore("todo");
// Get everything in the store;
var keyRange = IDBKeyRange.lowerBound(0);
var cursorRequest = store.openCursor(keyRange);
cursorRequest.onsuccess = function(e) {
var result = e.target.result;
if(!!result == false)
return;
renderTodo(result.value);
result.continue();
};
cursorRequest.onerror = html5rocks.indexedDB.onerror;
};// end of getAllTodoItems
function renderTodo(row) {
var todos = document.getElementById("todoItems");
var li = document.createElement("li");
var a = document.createElement("a");
a.href="#";
var t = document.createTextNode(row.text);
//t.data = row.text;
a.addEventListener("click", function(e) {
html5rocks.indexedDB.deleteTodo(row.text);
});
a.textContent = " [Delete]";
li.appendChild(t);
li.appendChild(a);
todos.appendChild(li);
};
html5rocks.indexedDB.deleteTodo = function(id) {
var db = html5rocks.indexedDB.db;
var trans = db.transaction(["todo"], "readwrite");
var store = trans.objectStore("todo");
var request = store.delete(id);
trans.oncomplete = function(e) {
html5rocks.indexedDB.getAllTodoItems(); // Refresh the screen
};
request.onerror = function(e) {
console.log(e);
};
};
function init() {
html5rocks.indexedDB.open(); // open displays the data previously saved
}
window.addEventListener("DOMContentLoaded", init, false);
function addTodo() {
var todo = document.getElementById('todo');
html5rocks.indexedDB.addTodo(todo.value);
todo.value = '';
}
</script>
</head>
<body>
<h1>This is an experimental page...</h1>
<ul id="todoItems"></ul>
<input placeholder="add todo things" id='todo' type="text" />
<input type="submit" value="Add Todo Item" onclick="addTodo(); return false;">
</body>
这是我写下这段代码的 link:html5rock
请告诉我哪里错了。
anyFelp 会很棒
您必须将记录的键传递给 delete
,并且您将 timeStamp
定义为键,而不是 text
。
替换
html5rocks.indexedDB.deleteTodo(row.text);
和
html5rocks.indexedDB.deleteTodo(row.timeStamp);