以下のJavaScriptが思うように動作しません。
A.バリュー1、キー値の追加で追加した値を
B.バリュー値の検索で検索し
C.処理結果に表示したいのですが、何処を修正すれば良いのでしょうか?
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
</head>
<body>
<b>A.バリュー1、キー値の追加</b>
<ul>
<li>バリュー1値
<input id="todovalue" name="todovalue" type="text"/>
</li>
<li>キー値<input type="text" id="todoItem" name="todo" /></li>
</ul>
<input type="button" id="btnAddTodo" value="追加"/><br><br>
<ul id="todoItems">追加結果表示</ul>
<script>
var db; //
var indexedDB = window.indexedDB || window.mozIndexedDB || window.msIndexedDB || window.webkitIndexedDB;
if (indexedDB) {
var app = {}
app.indexedDB = {};
app.indexedDB.db = null;
} else {
window.alert("IndexedDBが使えません");
}
app.indexedDB.open = function() {
var version = 1;
var openRequest = webkitIndexedDB.open("todoList", version);
// データベースの初回時オープン時とバージョンの変更時に呼ばれる
openRequest.onupgradeneeded = function(e) {
app.indexedDB.db = e.target.result;
// オブジェクト・ストアの作成
var store = app.indexedDB.db.createObjectStore( "todo" , { "keyPath" : "timeStamp"} );
store.createIndex("myvalueIndex", "myvalue");
e.target.transaction.oncomplete = function() {
app.indexedDB.getAllTodoItems();
};
}
// IndexedDBオープン成功時に呼ばれる
openRequest.onsuccess = function(e) {
// 宣言していた app.indexedDB.db に IDBDatabaseオブジェクトを格納
app.indexedDB.db = e.target.result;
app.indexedDB.getAllTodoItems();
};
// IndexedDBオープンの失敗時に呼ばれる
openRequest.onerror = function(e) {
// エラーがおこった場合、一旦コンソールログで確認
console.log("Database error: " + e.target.errorCode);
};
};
app.indexedDB.deleteDB = function() {
// todosデータベースを削除する
webkitIndexedDB.deleteDatabase("todoList");
};
app.indexedDB.getAllTodoItems = function() {
var initTodoItems = $("#todoItems").html("");
var initTodoItem = $("#todoItem").val("");
var initTodovalue = $("#todovalue").val("");
var db = app.indexedDB.db;
var trans = db.transaction("todo", "readwrite");
var store = trans.objectStore("todo");
var value = document.getElementById("todovalue").value;
var cursorRequest = store.openCursor();
cursorRequest.onsuccess = function(e) {
var result = e.target.result;
if(!!result == false)
return;
renderTodo(result.value);
result.continue();
};
};
app.indexedDB.addTodo = function() {
var db = app.indexedDB.db;
var trans = db.transaction("todo", "readwrite");
var store = trans.objectStore("todo");
var todoText = $("#todoItem").val();
var todoValue = $("#todovalue").val();
if( todoText == "") return;
var data = {
"text": todoText,
"text2": todoValue,
"timeStamp": new Date().getTime()
};
var request = store.put(data);
request.onsuccess = function(e) {
app.indexedDB.getAllTodoItems();
};
request.onerror = function(e) {
console.log("Error Adding: ", e);
};
};
function renderTodo(row) {
var $todoItems = $("#todoItems");
$todoItems.append("<li>" + row.text + row.text2 +"<a id='" + row.timeStamp + "' class='btnDeleteTodo' href='#'>[ 削除 ]</a>" +"</li>");
}
app.indexedDB.getValue =function(e){
var db = app.indexedDB.db;
var key2 = document.getElementById("selectkey").value;
var result = document.getElementById("result");
result.innerHTML = "";
var trans = db.transaction("[todo]", "readwrite");
var store = trans.objectStore("todo");
var request = store.get(key2);
request.onsuccess = function (e) {
if (e.target.result === undefined) {
result.innerHTML = "指定したキーは存在しません。";
} else {
result.innerHTML = "key2:" + e.target.result.key2 + " value:" + e.target.result.text + "<br/>"
}
}
}
function init() {
app.indexedDB.open();
}
// 読み込み実行
$(function(){
var $btnAddTodo = $("#btnAddTodo");
var $btngetValue = $("#btngetValue");
$btnAddTodo.on("click",app.indexedDB.addTodo);
$btngetValue.on("click",app.indexedDB.getValue);
init();
});
</script>
<hr />
<h3>B.バリュー値の検索</h3>
キー値の入力<input type="text" id="selectkey" />
<input type="button" value="検索" id="btngetValue"/>
<h3> C.処理結果</h3>
<div id="result"/>
</body>
</html>
No.1ベストアンサー
- 回答日時:
var indexedDB = window.indexedDB || window.mozIndexedDB || window.msIndexedDB || win
これに全角空白が!
ーー
var openRequest = webkitIndexedDB.open("todoList", version);
のwebkitIndexedDB?
ーー
var trans = db.transaction("[todo]", "readwrite");
の
"[todo]"が["todo"]
ーー
var store = app.indexedDB.db.createObjectStore ("todo", { "keyPath" : "timeStamp" });
タイムスタンプでいいの?
ーー
app.indexedDB.getValue の
request.onsuccess = function (e) { の
if (e.target.result === undefined) { は
request.result を参照なんじゃ?
ーー
result.innerHTML = "key2:" + e.target.result.key2 + " value:" + e.target.result.tex の
e.target.result.key2 は?
ーー
まだまだありそうだけど、あとはトライ&ごう?!
No.4
- 回答日時:
こんにちは
ちゃんと見てませんけれど・・・
https://oshiete.goo.ne.jp/qa/10131683.html
からほとんど変わっていないように見受けられます。
前回も書きましたけれど、(クロスブラウザ対応のつもりだと思いますが)IDBFactoryオブジェクトを取得以降に、プレフィックス付きのオブジェクトを使っているので、ブラウザ限定のスクリプトになっていますね。
おまけに、(webkit系はChromeだと思いますが)Chromeではプレフィックス付きは非推奨になっていて、手元のChrome63だと既にエラーになってしまうようです。(なので、どのブラウザでも動かない可能性が…)
あとは、前回回答のように、検索時のオブジェクトは(当然のことながら)定義した際の key:value 形式で返されるので、そのあたりを一貫させることが必要だと思います。
ついでに、No.3様へ
>>よほど長い回答をしない限りは大丈夫かな(笑)
>(さっそくやっちまったじゃないか!)
元が長いから仕方がないけれど、部分だけの回答にしてしまえば長くはならない(笑)
さらには、CSS入れて、jQuery外した分だけ(←外すのはもっともですが)、長くなっているかも?
No.3
- 回答日時:
/*
連投ですみません! やっぱり文字数制限に引っかかりました。
なので分割になります。
>よほど長い回答をしない限りは大丈夫かな(笑)
(さっそくやっちまったじゃないか!)
)
*/
app.indexedDB.getValue =
function (_){
app.indexedDB.db
.transaction ([TRANSACTION_NAME])
.objectStore (TRANSACTION_NAME)
.get (document.querySelector ('#selectkey').value)
.onsuccess =
function ({target: { result }}) {
document.querySelector ('#result').textContent = result
? 'key:' + result.key + ' value:' + result.val
: '指定したキーは存在しません。';
};
};
app.indexedDB.handleEvent =
function ({ target }) {
switch (target.id) {
case 'btnAddTodo' : return app.indexedDB.addTodo ();
case 'btngetValue' : return app.indexedDB.getValue ();
}
switch (target.className) {
case 'btnDeleteTodo' :
break;
}
};
//_________________________
init:
document.addEventListener ('click', app.indexedDB, false);
app.indexedDB.open();
</script>
No.2
- 回答日時:
全角空白は半角に置換してください。
自分も勉強のために試行錯誤してみました。
Firefoxで動かないのが痛い。その理由が知りたいです!
Chromeだと動きました。
--
<!DOCTYPE html>
<html lang="ja">
<meta charset="UTF-8">
<title>IndexedDB test</title>
<style>
body {
background-image: linear-gradient(-90deg, #495B4B, #FFFFFF);
}
h1, h2, h3, h4, h5, h6, th {
font-weight: normal;
}
body {
counter-reset : no 0;
}
fieldset {
box-shadow: 3px 3px 8px rgba(0,0,0,.6);
border: 2px silver solid;
border-radius: 8px;
margin-bottom: 1em;
}
legend, table {
color: #343;
text-shadow: -1px -1px 0px white, 1px 1px 2px black;
}
legend:before {
counter-increment : no 1;
content : "[" counter(no, upper-latin) "]";
padding-right : 1ex;
}
</style>
<body>
<fieldset>
<legend>Input</legend>
<table>
<tr>
<th>バリュー1値
<td><input id="todovalue" name="todovalue" type="text">
<tr>
<th>キー値
<td><input type="text" id="todoItem" name="todo">
<input type="button" id="btnAddTodo" value="追加">
</table>
<h4>追加結果表示</h4>
<ul id="todoItems">
</ul>
</fieldset>
<fieldset>
<legend>Serach</legend>
キー値の入力<input type="text" id="selectkey">
<input type="button" value="検索" id="btngetValue">
</fieldset>
<fieldset>
<legend>Result</legend>
<div id="result"></div>
</fieldset>
<script>
window.indexedDB = window.indexedDB || window.mozIndexedDB || window.msIndexedDB || window.webkitIndexedDB;
const
DATA_BASE_NAME = 'todoList',
TRANSACTION_NAME = 'todo';
if (indexedDB)
var app = { indexedDB: {db: null} };
else
throw new Error (alert ("IndexedDBが使えません"));
app.indexedDB.open =
function () {
let openRequest = indexedDB.open (DATA_BASE_NAME);
openRequest.onupgradeneeded = function ({target}) {
(app.indexedDB = target.result)
.createObjectStore (TRANSACTION_NAME, { keyPath: 'key' })
.createIndex ('val', 'val', { unique: false });
target.transaction.oncomplete = function () {
app.indexedDB.getAllTodoItems();
};
};
openRequest.onsuccess = function ({target: { result }}) {
app.indexedDB.db = result;
app.indexedDB.getAllTodoItems ();
};
openRequest.onerror = function (e) {
console.log ('Database error: ' + e.target.error);
};
};
app.indexedDB.deleteDB =
function () {
indexedDB.deleteDatabase (DATA_BASE_NAME);
};
app.indexedDB.getAllTodoItems =
function () {
let doc = document;
doc.querySelector ('#todoItems').textContent =
doc.querySelector ('#todoItem').value =
doc.querySelector ('#todovalue').value = '';
app.indexedDB.db
.transaction (TRANSACTION_NAME, 'readonly')
.objectStore (TRANSACTION_NAME)
.openCursor ()
.onsuccess =
function ({target: { result }}) {
if (result) {
renderTodo (result.value);
result.continue ();
}
};
function renderTodo ({ key, val }) {
let
doc = document,
items = doc.querySelector ('#todoItems'),
li = doc.createElement ('li'),
a = doc.createElement ('a');
li.textContent = key + ' = ' + val;
a.textContent ='[ 削除 ]';
a.href = '#key=' + key;
a.className = 'btnDeleteTodo';
items.appendChild (li).appendChild (a);
}
};
app.indexedDB.addTodo =
function () {
let
doc = document,
key = doc.querySelector ('#todoItem').value,
val = doc.querySelector ('#todovalue').value;
if ('' !== key) {
let request = app.indexedDB.db
.transaction ([TRANSACTION_NAME], 'readwrite')
.objectStore (TRANSACTION_NAME)
.add ({ key, val });
request.onsuccess = function (_) { app.indexedDB.getAllTodoItems (); };
request.onerror = function (event) { console.log ('Error Adding: ', event); };
}
};
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript コードレビューをお願いします。 1 2022/07/16 05:38
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- JavaScript 以前の質問だと、どの条件でも配列が表示されてしまいます。 1 2022/07/09 11:40
- JavaScript javascriptでテーブルに追加した項目のid追加してローカルストレージを操作したい 5 2023/01/01 15:52
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- JavaScript スマフォではボタンを表示させたくない 2 2023/01/20 14:26
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
google apps scriptの終了のさせ方
-
JavaScriptで決まった「時刻」...
-
jqGridについて
-
C#OpenCv V4にのエラーに関する...
-
ローカルにあるファイルを検索...
-
C# 演算 奇数と偶数 表現の仕方
-
VSCODE[Python]の設定について
-
ASP.NETのコントロールの値をJa...
-
1日1回だけ引けるjavascriptお...
-
イベントが初めの一回しか起き...
-
1日1回だけ引けるjavascriptお...
-
C# 演算 分岐処理 繰り返し処理
-
イラストレーターでドキュメン...
-
シンプルなweb版スタンプラリー...
-
チェックボックスのチェック保持
-
javascriptでテーブルに追加し...
-
【javascript】正規表現で括弧...
-
gas スプレッドシートがアクテ...
-
なぜmatchメソッドがエラーにな...
-
カンマで終わってるのはセミコ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
var exports = exports || {}; ...
-
google apps scriptの終了のさせ方
-
C#OpenCv V4にのエラーに関する...
-
GASでundefinedエラーが出ます
-
ジェネレーターの作り方
-
GASでGoogleフォームの自動返信...
-
HTMLで作った時報アプリが動き...
-
javascriptでテーブルに追加し...
-
html javascript リンク先アド...
-
【西暦等の変換】
-
ローカルにあるファイルを検索...
-
ASP.NETのコントロールの値をJa...
-
なぜmatchメソッドがエラーにな...
-
翌月を取得するGASが分かりません
-
gas スプレッドシートがアクテ...
-
ASP.NET MVCでObjectをjsに渡す
-
カンマで終わってるのはセミコ...
-
JavaScriptで文字列の特定文字...
-
javascriptでiframeのURL変更は?
-
APIを使って埋め込んだグーグル...
おすすめ情報