質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

184閲覧

[javascript]addEventListener()関数にセットした引数について

xjaPANDA

総合スコア124

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/07/06 12:03

下記のコードは、addEventListener() メソッドを使って、パソコンキーボードの[F]のキーを押したら、indexedDBのデータベースに、データが挿入されるようにしようとしています。

しかし、データベース用に定義した、関数のDateInsert()が、コメントアウトの(1)の箇所では、しっかりと動いており、Chromeブラウザで確認しても、データが挿入されている一方で、
(2)の場所に置くと全く動きません。(2)の箇所でデータを挿入したいので、この場所で動かすには、どのような解決方法がありますでしょうか?

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>Test</title> </head> <body> <script> (function() { 'use strict'; //データベースとストア作成 var dbName ='Test'; var storeName ='SampleDate'; var db; var indexedDB = window.indexedDB || window.mozIndexedDB || window.msIndexedDB; var openRequest = indexedDB.open(dbName, 1.0); openRequest.onupgradeneeded = function(e) { db = e.target.result; db.createObjectStore(storeName, { keyPath: 'id'}); } //挿入用データ var data = {id : '10300', time : 'Hello World!'}; //データ挿入の為の関数 function DateInsert(){ openRequest.onsuccess = function(e){ db = e.target.result; var putReq = db.transaction(storeName, 'readwrite').objectStore(storeName).put(data); } } //DateInsert(); //(1)動く window.addEventListener('keydown', function(e) { if(70 == e.keyCode){ //F key alert(); DateInsert(); //(2)動かない } }); })(); </script> </body> </html>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

DateInsert()内で行われている処理は、onsuccessイベントに処理成功時のハンドラをセットするというものです。

(1)のタイミングでは.openと同期的にセットしているので、この時点でonsuccessが実行されていることはなく、処理は間に合うのですが、(2)でセットしようとすると、keydownイベントが発生するのは、ほぼ確実にonsuccessが発生した後になってしまうので、そこでセットしても後の祭りです。

投稿2019/07/06 12:53

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xjaPANDA

2019/07/06 14:13

ありがとうございます。構造に問題があったようで、アドバイスにより解決することができました。
guest

0

openRequest.onsuccess = function(ev){ window.addEventListener('keydown', function(e) { if(70 == e.keyCode){ //F key db = ev.target.result; var putReq = db.transaction(storeName, 'readwrite').objectStore(storeName).put(data); } }); }

投稿2019/07/06 14:13

xjaPANDA

総合スコア124

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問