Newer
Older
JD / sinkei-csv.js
document.addEventListener("DOMContentLoaded", () => {
    var photo = document.querySelector("div.photo"), // <div class="photo">
        shop  = document.querySelector("div.shop");  // <div class="shop">
    var photobtn, shopbtn;    // あとでボタン一覧を格納する
    
    // 最後に選択されたラジオボタンを記憶する
    let lastPhoto = null;
    let lastShop = null;

    function resetBtns() {    // ラジオボタンを全部未チェックにする
        for (let b of document.querySelectorAll('input[type="radio"]')) {
            b.checked = false;
            console.log("Cleared");
        }
    }

    function createDivs(csv) {
        console.log(`photo=${photo}`);
        console.log(`csv=${csv.length}`);
        for (let row of csv) {
            let ph = row["photo"], sh = row["shop"], desc = row["説明"],
                jpg = "image/"+ph+".jpg";
            photo.insertAdjacentHTML(
                'beforeend',
                `<input name="photo" type="radio" id="${ph}">
    <label for="${ph}"><img src="${jpg}" title="${desc}" class="toggle-photo" style="display: none;"></label>\n`);
            shop.insertAdjacentHTML(
                'beforeend',
                `<input name="shop" type="radio" id="s-${ph}">
    <label for="s-${ph}" class="toggle-shop"><span style="display: none;">${sh}</span></label>\n`);
        }
        photobtn = document.querySelectorAll('div.photo input[type="radio"]');
        shopbtn  = document.querySelectorAll('div.shop input[type="radio"]');
        resetBtns();

        // 写真ラジオボタンのトグル処理
        for (let radio of photobtn) {
            radio.addEventListener("click", function () {
                let img = this.nextElementSibling.querySelector('img');
                if (this.checked && this === lastPhoto) {
                    this.checked = false;  // チェックを解除
                    lastPhoto = null;
                    img.style.display = 'none'; // 画像非表示
                } else {
                    lastPhoto = this;
                    img.style.display = 'block'; // 画像表示
                }
            }, false);
        }

        // 店名ラジオボタンのトグル処理
        for (let radio of shopbtn) {
            radio.addEventListener("click", function () {
                let labelSpan = this.nextElementSibling.querySelector('span');
                if (this.checked && this === lastShop) {
                    this.checked = false;  // チェックを解除
                    lastShop = null;
                    labelSpan.style.display = 'none'; // 店名非表示
                } else {
                    lastShop = this;
                    labelSpan.style.display = 'block'; // 店名表示
                }
                hantei1(this); // 正誤判定を行う
            }, false);
        }
    }

    // 正誤判定: 写真が選ばれたらリセット処理
    function hantei0(e) {
        var selection = e.target.id;
        console.log(`val = ${selection}`);    // 写真側どれかボタンが選ばれたら
        for (let b of shopbtn) {    // 店名ラジオボタンを
            b.checked = false;        // 全部未チェックにする
        }
        document.getElementById("kekka").textContent = ''; // 結果表示をリセット
    }

    // 正誤判定: 選択されているshopボタンのidを返す
    function whichshop() {
        let selected;
        for (let b of photobtn)
            if (b.checked) return b.id;
        return null;    // 選択されていなければnull
    }

    // 正誤判定: 店名が選ばれたら判定する
    function hantei1(selectedShop) {
        let kekka = document.getElementById("kekka"),
            selphoto = whichshop();
        if (selphoto) {            // 写真側で何か選ばれていたら
            if (selectedShop.id === "s-" + selphoto) {
                kekka.textContent = "正解!"    // p要素の内部文字列を上書き
                kekka.classList.remove("ng");    // ngのclass設定を外して
                kekka.classList.add("ok");    // okのclass設定を足す
            } else {
                kekka.textContent = "ぶっぶー!"
                kekka.classList.remove("ok");
                kekka.classList.add("ng");
            }
        } else {
            kekka.textContent = "写真側を選んでください。";
        }
    }

    document.getElementById("shuffle").addEventListener("click", (e) => {
        let script = document.createElement("script");
        script.src = "memory-shuffle.js";
        document.body.appendChild(script);
        resetBtns();
    }, false);

    fetch("./memory.csv").then(resp=>{
        return resp.text().then(text=>{
            createDivs(new CSV(text, {header: true}).parse());
        });
    })
}, false);