Jieiz
@Jieiz (Eiji Minami)

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!

Javascript: 入力したデータを種類毎のページに反映されるようにしたい。

はじめまして、初めて質問させて頂きます、よろしくお願い致します。

現在、JavascriptでTodoリストを元にオーダーリスト(買い物リスト)を作成しています。
リストの追加と削除は出来るようになったのですが、リストを入力し終え、confirmボタンを押すと種類毎にそれぞれのページにリストが反映されるようにしたいと思っています。
(うまく説明ができないので図を添付致しますが、伝わるでしょうか?)
page.jpg

色々調べていますが、locationというのを使うという所までは分かったのですが、それを使っても特にエラーも出ず動作もしません。恥ずかしながら知識がなく、どうすればやりたいと思っている事が実現できるかが分かりません。

お時間を取らせて申し訳ないのですが、もしどなたか何かいい方法をご存じでしたら教えて頂ければ大変有難いです。
どうぞよろしくお願いします。

以下は作成したJavascriptのcodeになります。

'use strict';
{
  const tBody = document.querySelector('tbody');  
  const addBtn = document.getElementById('add-btn');


    // ボタンを押したときのイベントとサプライヤーを選ぶ
    addBtn.addEventListener('click', e => {
      e.preventDefault();
        const tr = document.createElement('tr');
        const supplier = document.createElement('td');
        const select = document.getElementById('select');
        supplier.textContent = `${select.value}`;
        tr.appendChild(supplier);

        // 商品コード入力
        const product = document.createElement('td');
        const codeInput = document.getElementById('code-input');
        product.textContent = `${codeInput.value}`;
        tr.appendChild(product);

        codeInput.value = '';
        codeInput.focus();

        // オーダー数を入力
        const quantity = document.createElement('td');
        const qtnInput = document.getElementById('qtn-input');
        quantity.textContent = `${qtnInput.value}`;
        tr.appendChild(quantity);

        qtnInput.value = '';
        qtnInput.focus();

         // デリートボタンを作成
        const delBtn = document.createElement('td');
        const createDelete = document.createElement('button');
        createDelete.textContent = 'Del';
        delBtn.appendChild(createDelete);
        tr.appendChild(delBtn); 

      tBody.appendChild(tr);

      // 選んだ商品のデリートをする
      delBtn.addEventListener('click', () => {
        tr.removeChild(supplier);
        tr.removeChild( product);
        tr.removeChild(quantity);
        tr.removeChild(delBtn);
       });
     });

       const confirmBtn = document.getElementById('confirm-btn');
       confirmBtn.addEventListener('click', () => {
         const select = document.getElementById('select');
        if(select.value === 'Prokiwi') {
          window.location= 'index-prokiwi.html';
            } else if(select.value === 'Hallifax') {
              window.location= 'index-hallifax.html';    
            } else if(select.value === 'Derek') {
              window.location= 'index-derek.html';    
            } else if(select.value === 'Parrs') {
              window.location= 'index-parrs.html';    
            } else {
              window.location= 'index-others.html';  
            }
   });
}

こちらはHTMLのcodeです。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Plactice</title>
    <link rel="stylesheet" href="ordersystem-stylesheet.css">
  </head>
  <body>
    <div class="container">
      <h1>Order System</h1>
      <div class="order-container">
        <table id="table1">
          <thead>
            <tr>
              <th width="200">Supplier</th>
              <th width="350">Product</th>
              <th width="100">Quantity</th>
              <th width="60">Del</th>
              <!-- <th width="60">Update</th> -->
            </tr>
          </thead>
          <form method = post action ="#">
            <tbody>
              <tr>
                <td>
                  <select class="supplier" id="select" name="supplier">
                    <option>Prokiwi</option>
                    <option>Hallifax</option>
                    <option>Derek</option>
                    <option>Parrs</option>
                  </select>
                </td>
                <td class="product"><input type="text" id="code-input"></td>
                <td class="quantity"><input type="text" id="qtn-input"></td>
                <td id="del" type="button"></td>
                <!-- <td id="updatebtn" type="button"></td> -->
                <td  width="60"><button id="add-btn">Add</button></td>
              </tr>
            </tbody>  
          </form>               
        </table>
      </div>
      <div class="confirm-button">
        <div id="confirm-btn">Confirm</div>
      </div>
    </div>      
    <script src="ordersystem-main.js"></script>
  </body>
</html>
0

4Answer

1/20

現時点で解ること

  • window.location.href="¥Program¥lesson2¥index3.html";とありますが、¥/の間違いではないでしょうか?
  • 終盤、引数を変えてjump1(~)を3度呼んでいますが、それらの引数は受け取られず、同じURLへの移動が3度繰り返されるように見えます。
  • addBtn.addEventListener('click', () => {の括弧が閉じていないので、貼り付けられているのは、作成されたコードの一部分のようです。
    • 作成されたコードの全体を貼り付けていただくと、回答を得やすいと思います。
    • JavascriptだけでなくHTMLもあると、より解決に近付くと思います。

蛇足

  • ソースを貼り付ける際に、「```javascript」の行で始めると、Javascriptの文法に基づいて着色されて読みやすくなります。
    • もし、HTMLのファイル中にjavascriptが記述されている場合は、「```html」としてください。
    • **```**の前後には、空行が必要です。
    • 詳しくは、Qiita公式ヘルプの「コードの挿入」をご参照ください。
  • 既に投稿した質問でも、再度編集して書き替えることができます。
    • 記事の右上辺りに「編集する」リンクがあると思います。

1/22

新たに解ったこと

改めてhtmlとJavaScriptのcodeを修正を加えて記載し直しました。
前回と少し内容が違いますが、こちらが本番で作成しているものです。(内容はほぼ一緒です)

コードでは、以下のHTMLファイルが登場します。
'index-prokiwi.html', 'index-hallifax.html', 'index-derek.html', 'index-parrs.html', 'index-others.html'
掲載されている(ファイル名の解らない)コードから、上記のコードへ、データを受け渡したいわけですよね?

さて、ここで、改めて課題を確認させてください。

やりたいこと

  • ToDoリストページ
    • 行の追加ボタン
      • ボタンを押すと、選択・入力欄の内容から新しい行が追加される。
      • 選択・入力欄 ( 種別、品目、数量 )
    • ToDoリスト (行列)
      • 列 ( 種別、品目、数量 )
      • 行の削除ボタン
    • 確認ボタン
      • ボタンを押すと、種別毎のページへリスト内容が反映される。
  • 種別毎のページ ×5
    • オーダーリスト (行列)
      • 列 ( 種別、品目、数量 )

情報を何処に保存するのか?

  • 現在は、ドキュメントオブジェクトとして保存されています。
    • 従って、リロードすれば消えます。
  • 選択肢と課題の解決手法
    • 振り分けのために一時的に使うだけなので、現状で問題ない。
      • window.open()を使って新しいウインドウを作り、そのウインドウに対して情報を書き込みます。
    • 特定の一端末でのみ使用するので、ローカルストレージで問題ない。
      • ⇒ 「localStorage」や「IndexedDB」などを使うことができます。
    • 端末に拠らず同じデータにアクセスしたいので、サーバストレージを使いたい。
      • ⇒ mogamoga1337さんが書かれたような、「サーバサイド」の開発によって実現可能です。

1/23

  • ストレージを利用する場合は、window.open()を使わずに、あらかじめページのファイルを用意する方法をお勧めします。
    • 各ページは、共有ストレージにアクセスして、同じ情報を得ることができます。
  • ストレージを使わない場合に、window.open()を使うのは、ページ間の受け渡しをせずに済むからです。
0Like

Comments

  1. 質問の修正を受けて、回答を追記いたしました。
  2. @Jieiz

    Questioner

    tetr4labさん

    ご返信有難うございます。

    また、私がやりたい事を分かりやすくまとめて頂いて有難うございます!
    質問の際には、tetr4labさんがまとめてくださったように記載すると読み手の方も分かりやすいのでお手本にさせてください。

    ・'index-prokiwi.html', 'index-hallifax.html', 'index-derek.html', 'index-parrs.html', 'index-others.html'
    掲載されている(ファイル名の解らない)コードから、上記のコードへ、データを受け渡したいわけですよね?

    ◯確認ボタン
    ・ボタンを押すと、種別毎のページへリスト内容が反映される。
    ◯種別毎のページ ×5
     ・オーダーリスト (行列)
     ・列 ( 種別、品目、数量 )

    ☆そうなんです、この辺りが躓いている所で質問をさせて頂きました。

    ・⇒ window.open()を使って新しいウインドウを作り、そのウインドウに対して情報を書き込みます。

    ☆有難うございます、早速やってみます!

    ◯特定の一端末でのみ使用するので、ローカルストレージで問題ない。
     ・⇒ 「localStorage」や「IndexedDB」などを使うことができます。

    ☆まずはここまでをやりたいので、教えて頂いたwindow.open()を調べて実装する事を試みます。

    ◯端末に拠らず同じデータにアクセスしたいので、サーバストレージを使いたい。
     ・⇒ mogamoga1337さんが書かれたような、「サーバサイド」の開発によって実現可能です。

    ☆そして目指しているところがこの部分なので、学習を重ねて一つ一つ課題をクリアしていきたいと思っています。

    少し時間が掛かるかもしれませんが、改めて、実装結果を報告させて頂ければと思います。
    重ねてになりますが、tetr4labさん、色々と教えて下さって有難うございます!

  3. 僅かなりとお役に立てたのであれば何よりです。
    どうぞお楽しみください。

「locationでページ遷移したいができない」が質問なら…

window.location.href="¥Program¥lesson2¥index3.html";のパスが違う。
if(various.value === '野菜')がfalseを返している。
document.getElementById('confirm-btn');で実はとれていない。
(ブラウザでF12キーを押すと出てくるDevToolsのコンソールにエラーがでるはず)

のどれか

質問とは関係ないですが出題された問題はJavascriptのみでこの機能を実現しろといってますか?(JSだけだとパラメータの引き渡しがめんどそう&この教材で出題者はlocalStorage使うようなコードを求めるのかなぁ…なんか変わってるなって思った。)
質問者さんもかなり試行錯誤して頭の中がゴチャゴチャになっているだろうから、一旦このソースを指導者かプログラムに詳しい人に見てもらったほうがいいと思った。

0Like

Comments

  1. HTML,CSS,JSはフロントエンド側の言語でDB操作やパラメータのやり取りが伴うページ遷移は難しいので、何かサーバーサイドの言語を学ばれるのはどうでしょう。
    純粋なPHPでHTMLのformの入力値を受け取って別のページにそれを表示させるといったことを学習するといいと思います。(いきなりLaravelとかのフレームワークは難しいと思う。)
  2. @Jieiz

    Questioner

    mogamogaさん

    アドバイス有難うございます、早速PHPの勉強も始めます!

mogamoga1337さん
ご返信ありがとうございます!

・window.location.href="¥Program¥lesson2¥index3.html";のパスが違う。
・if(various.value === '野菜')がfalseを返している。
・document.getElementById('confirm-btn');で実はとれていない。

教えて頂いた上記の事を早速Dev Toolで調べてみます。

恥ずかしながら、出題者は自分自身です(汗)。今勉強している言語がHTML、CSSとJavaScriptでして、その中で試行錯誤をして、質問させていただいた時の図の左側のものができましたが、今回のページ遷移の件で改めて躓きました。

実は、いつもは販売の仕事をしていまして、その中で自動オーダーシステムのようなものを作れたら作業がもっと効率化できるのではないか、データベースも勉強して、将来的にオーダーした商品を元に商品管理と分析が出来るようになりたいなと思い、5か月前から独学でプログラムの勉強を始めましたが、頭の中はゴチャゴチャになっているのを見透かされてしまいました(笑)

mogamoga1337さんがおっしゃる通り、上記の3つの言語だけでは、思っている事を実現するのは難しいのかなと思い始めていた所なのですが、どんな言語をプラスで勉強したほうがいいかmogamogaさんの意見を聞かせて頂く事はできますか?

Jieiz

0Like

tetetr4labさん、ご返信ありがとうございます!

・window.location.href="¥Program¥lesson2¥index3.html";とありますが、¥は/の間違いではないでしょうか?

☆ありがとうございます!早速変更して試してみます。

・終盤、引数を変えてjump1(~)を3度呼んでいますが、それらの引数は受け取られず、同じURLへの移動が3度繰り返されるように見えます。

☆ここは勉強不足で頭がごちゃごちゃしている部分なので、改めて見直します。

・addBtn.addEventListener('click', () => {の括弧が閉じていないので、貼り付けられているのは、作成されたコードの一部分のようです。

☆実はJavaScriptのコードはこれで全部になります。。 最後の "}" は載せたコードの最初の方と同じようにバックグランドが白になってしまった為、なくてもいいかと思い削除しました。
ただ、括弧閉じがないと、tetr4labさんがおっしゃる通り、読んで頂いている方はこの先もコードがあると思われてしまいますね、反省です。
きっちりと最後までコードを載せるようにします、有難うございます。

・もし、HTMLのファイル中にjavascriptが記述されている場合は、「```html」としてください。

☆そうなんですね! 最初htmlのコードを載せたら上手くいかなかったのでJavaScriptだけ載せてしまいました。(ちなみにhtmlはJavaScriptとは別に書いています。)

公式ヘルプの「コードの挿入」を読んで、改めてJavaScriptもhtmlのコードと併せて載せたいと思います。

tetr4labさん
たくさん教えて頂いて有難うございます! 教えて頂いた事やってみます!

jieiz

0Like

Comments

  1. @Jieiz

    Questioner

    tetr4labさん

    昨日はありがとうございます、改めてhtmlとJavaScriptのcodeを修正を加えて記載し直しました。
    前回と少し内容が違いますが、こちらが本番で作成しているものです。(内容はほぼ一緒です)

Your answer might help someone💌