yachiiiyo
@yachiiiyo (龍聖 八千代)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

rails6 家計簿アプリボタンを押しても何も起こらない javascript

解決したいこと

rails6でボタンを押した後にjavascriptが反応されない
データベースに保存されない

webpackerを使用してjavascriptを読み込んでいます。

cloud9のjsの複数のファイル上で変数または関数の呼び出しにis not defined : please fix or add /*global */
と三角の表示が出てしまう

consoleにエラー表示は出ていません。

発生している問題・エラー

スクリーンショット 2021-10-10 8.01.45.png

スクリーンショット 2021-10-10 18.29.08.png

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

indexedDB.js
/*global indexedDB*/
/*global onclick*/
/*global inputCheck*/
/*global createList*/

document.addEventListener("DOMContentLoaded", function(){
//indexedDBの名前などの設定
const dbName = "kakeiboDB";
const storeName = "kakeiboStore";
const dbVersion = 1;

//データベース接続する。データベースが未作成なら新規作成する。
let database = indexedDB.open(dbName, dbVersion);

//データベースとオブジェクトストアの作成
database.onupgradeneeded = function (event) {
    let db = event.target.result;
    db.createObjectStore(storeName, { keyPath: "id" });
    console.log("データベースを新規作成しました");
}

//データベースに接続に成功した時に発生するイベント
database.onsuccess = function (event) {
    let db = event.target.result;
    // 接続を解除する
    db.close();
    console.log("データベースに接続できました");
}
database.onerror = function (event) {
    console.log("データベースに接続できませんでした");
}


//フォームの内容をDBに登録する
  let btn = document.getElementById('btn');

  btn.addEventListener(onclick, function regist(){
   
    //フォームの入力チェック。falseが返却されたら登録処理を中断
    if (inputCheck() == false) {
        return;
    }else {
        console.log("処理が中断されました。");
    }
    //ラジオボタンの取得
    let radio = document.getElementsByName("balance");
    let balance;
    for (let i = 0; i < radio.length; i++) {
        if (radio[i].checked == true) {
            balance = radio[i].value;
            break;
        }
    }

    //フォームに入力された値を取得
    let date = document.getElementById("date").value;
    let amount = document.getElementById("amount").value;
    let memo = document.getElementById("memo").value;
    let category = document.getElementById("category").value;
    //ラジオボタンが収入を選択時はカテゴリを「収入」とする
    if (balance == "収入") {
        category = "収入";
    }

    //データベースにデータを登録する
    insertData(balance, date, category, amount, memo);

    //入手金一覧を作成
    createList();
  });





//データの挿入
function insertData(balance, date, category, amount, memo) {
    //一意のIDを現在の日時から作成
    let uniqueID = new Date().getTime().toString();
    console.log(uniqueID);
    //DBに登録するための連想配列のデータを作成
    let data = {
        id: uniqueID,
        balance: balance,
        date: String(date),
        category: category,
        amount: amount,
        memo: memo,
    }

    //データベースを開く
    let database = indexedDB.open(dbName, dbVersion);

    //データベースの開けなかった時の処理
    database.onerror = function (event) {
        console.log("データベースに接続できませんでした");
    }

    //データベースを開いたらデータの登録を実行
    database.onsuccess = function (event) {
        let db = event.target.result;
        let transaction = db.transaction(storeName, "readwrite");
        transaction.oncomplete = function (event) {
            console.log("トランザクション完了");
        }
        transaction.onerror = function (event) {
            console.log("トランザクションエラー");
        }
        let store = transaction.objectStore(storeName);
        let addData = store.add(data);
        addData.onsuccess = function () {
            console.log("データが登録できました");
            alert("登録しました");
        }
        addData.onerror = function () {
            console.log("データが登録できませんでした");
        }
        db.close();
    }
}


//データの削除
function deleteData(id) {
    //データベースを開く
    let database = indexedDB.open(dbName, dbVersion);
    database.onupgradeneeded = function (event) {
        let db = event.target.result;
    }
    //開いたら削除実行
    database.onsuccess = function (event) {
        let db = event.target.result;
        let transaction = db.transaction(storeName, "readwrite");
        transaction.oncomplete = function (event) {
            console.log("トランザクション完了");
        }
        transaction.onerror = function (event) {
            console.log("トランザクションエラー");
        }
        let store = transaction.objectStore(storeName);
        let deleteData = store.delete(id);
        deleteData.onsuccess = function (event) {
            console.log("削除成功");
            createList();
        }
        deleteData.onerror = function (event) {
            console.log("削除失敗");
        }
        db.close();

    }
    //データベースの開けなかった時の処理
    database.onerror = function (event) {
        console.log("データベースに接続できませんでした");
    }
}
});

自分で試したこと

ここ3日間ほど調べてみましたがわかりませんでした。
rails にjavascriptが読みこていないのでしょうか?

ブラウザ上のconsoleにデータベースに接続できましたとは表示されました。

0

1Answer

まず、切り分けをしたいので、クリックイベントを発火した場所で

alert(1)

などと記載して、イベントが発火出来てるかを見ていただけますでしょうか?

0Like

Comments

  1. @yachiiiyo

    Questioner

    フォームの内容を登録するregist関数のaddEventListenerの中でalert()を書き込みましたが何も起こりませんでした。
    イベントが発火していませんでした。
  2. では、イベントハンドラを発火させる要素があるかのチェックと、このaddEventListnerが呼ばれてるregist()という関数がどこから呼び出されているかをチェックしてみてください。
  3. @yachiiiyo

    Questioner

    要素はonclickで発火させます。
    regist()関数は元々html上のbuttonタグのonclick="regist()"呼び出されていましたがボタンのidを取得してそこにaddEventListenerのonclickで関数を読み込むにしたので今はなくしても大丈夫です。

    また、document.addEventListener("DOMContentLoaded", function(){
    });
    を追記しこの中に記述しました。

    <button id="btn"></button>で呼び出されています。

    上記の質問に写真を追加しました。
    awsで左横に三角表示のある関数名と変数名全部に ~ is not defined : please fix or add global ~
    と出ています。
  4. ではとりあえず、addEventListenerをregist()メソッドの外に書き出してみるのはいかがでしょうか?
    コメントの最後は投稿とは別のエラーですかね?変数が定義されてないそうなので、定義し忘れがないか確認してみてください。
  5. @yachiiiyo

    Questioner

    addEventListenerをregist()外に書き出しました。
    でも何も変わらなかったです。

    コメントの最後は調べて/*global 〜〜〜*/と入力する三角表示が消えました。

Your answer might help someone💌