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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

Q&A

解決済

3回答

1907閲覧

localstorageのkey、valueを使いPOST送信するには

cp_cop

総合スコア40

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

0グッド

0クリップ

投稿2017/09/21 03:31

編集2017/09/21 05:13
<form method="post" id="form" action="https://example.com/hoge.cgi"> <input type="hidden" name="foo" id="foo" value="abc" /> <input type="hidden" name="bar" id="bar" value="123" /> <input type="hidden" name="page" id="page" value="baz" /> <input type="submit" value="" /> </form> ```上記のformを送信するとパラメータが付与されてhttps://example.com/hoge.cgiに飛びますが、 スマートフォンのchromeでform送信後のページを開いたままブラウザを一度終了させ、 再びブラウザを起動させるとパラメータが反映されていないhttps://example.com/hoge.cgiが表示されてしまいます。 (safariの場合にはフォーム内容を再送信するかどうか聞いてきます) そこでformの内容をlocalstorageに保存し、再読み込み時(ブラウザを一度終了させ再び起動した場合)に keyとvalueを使い再びPOST送信してページを表示させたいと思っています。 POST送信するURLは https://example.com/hoge.cgi?foo=abc&bar=123&page=baz です。 onloadでkeyとvalueを呼び出し送信させることで可能になるようなのですが、 肝心のjavascriptをどのように記述すればよいのかわかりません。 formの内容は以下の方法でローカルストレージに保存できています。 ```ここに言語を入力 $('#form').submit(function() { var param = $(this).serializeArray(); $.each(param, function(index,elem){ localStorage.setItem(elem.name,elem.value); }); }); ```localstorageには以下のkeyとvalueが保存されています。 foo abc bar 123 page baz ご教授お願いいたします。 ----- 追記 ----- データベースのようなCGIを使っており、データファイル(data.cgi)からformで送信した内容に合致するデータを表示しています。 データのカテゴリがname、保存データがvalueとなっています。 form method="get"にするとmts10806さんの仰る通りデータも問題なく抽出でき、 またブラウザを再度開いてリロードしてもURLにパラメータが付与されているので問題なくデータが抽出されたページが開きます。 ただ、できればURLにはパラメータ(https://example.com/hoge.cgi?foo=abc&bar=123&page=baz)を付与させたくなく パラメータを付与(URLに表示)せずに(https://example.com/hoge.cgiで)読み込めないかと思っております。

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

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

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

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

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

m.ts10806

2017/09/21 04:27

記載のjavascript(おそらく以前私が提示したもの)ではHTMLにid=formの要素がないのでそもそもsubmitを感知できないように思います。
cp_cop

2017/09/21 04:49

昨日はご回答ありがとうございました。とても助かりました。質問のHTMLにid="form"を記述し忘れていました。申し訳ありません。教えていただいたjavascriptでsubmitするとformの値が取得できています。
m.ts10806

2017/09/21 04:51

POST送信にGETのクエリストリングを入れる理由を明記された方が良いと思います。正直なところこれだけだとformのmethod=getにするだけで解決します。
cp_cop

2017/09/21 05:14

分かりにくい説明で申し訳ありません。質問文に追記いたしましたのでご確認宜しくお願い致します。
guest

回答3

0

ベストアンサー

データ抽出はcgiプログラムで行っているので無理です。
localstorageはjavascriptでクライアント側のプログラム、
cgiはサーバー側のプログラム。

cgiはサーバー側のプログラムのため、クライアント側で画面が表示される前に全ての処理が行われ、
「結果を表示するHTMLをprint」して処理を終了してクライアントが「結果のHTMLを受け取って表示」しています(正しい表現ではないかもしれませんがざっくり言うとこんな感じ)

後からいくらlocalstorageで検索条件をセットしてもcgi側の仕事は既に終わっているわけです。
つまり、今の状態でGETでURLに条件を含ませるしか方法はありません。

ただし、全くないかと言えばそうではないです。
ajaxという仕組みがあり、javascript側からサーバー側の言語を呼び出すことができます。

画面遷移を伴うSUBMITをせずにサーバー側の言語を呼び出し、処理させて結果を受け取ることができるわけです。
サーバー側の言語を実行できるのでDBへのアクセスもできますので、
やり方次第ではありますがサーバー側の言語でできることはほとんどできます。

ロジック的には以下のような感じ
0. hoge.cgiのonloadでlocalstorageから値を受け取り
0. その値をajaxでcgiに渡して処理を実行し
0. 結果を受け取ってHTMLに整形して出力する

ajaxで要件が実現可能かどうかは今サンプルコードをここでもらうより
色々調べてみてやって見られたほうが良いかと思います。

追記:
kei344さんが仰るようにセッションを利用される方が実装が簡単かもしれません。

投稿2017/09/21 05:45

編集2017/09/21 05:47
m.ts10806

総合スコア80850

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

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

cp_cop

2017/09/21 06:08 編集

とても詳しく教えていただき本当にありがとうございます。 どうも私はいろいろと無知が故の勘違いをしていたようです。 この質問をする前にajaxでの通信についていろいろと調べてはいました。 非同期通信を行うことで私のやりたい事が可能なのではないかと思ったからです。 しかし、そう思ってもなかなか難しいことが多く、いまいち何をどうすればいいのかわからずにいました。 しかし、教えていただきましたことで少し何をすればよいのかが見えてきたような気もします。 教えて頂きました内容、とても参考になりました。 まずは参考URLを熟読し、ひとつづつトライしていきたいと思います。 セッションでの実装の方が簡単かも知れないとのことですが、ajaxについては必要な知識だと思うのでまずはこちらを実践してみたいと思います。 また、何かわからないことがあれば質問させていただくかと思いますが、その時はまたご教授宜しくお願い致します。 昨日に引き続き、本当にありがとうございました。
m.ts10806

2017/09/21 06:19 編集

ちなみにセッション場合 ・POSTがあればPOSTを利用  ・POSTなければSESSIONがあればSESSIONを利用 だけでできます。(同じ変数を利用して検索処理を行うようにすること) もちろん仰るようにajaxは必須と言っても良い技術なので、 これを期に勉強しておいても損はありません。
cp_cop

2017/09/21 09:37

ありがとうございます。 とても参考になります。 セッションを使う方が簡単な気もするので、セッションについてもいろいろと調べてみます。
guest

0

ブラウザのリロードが起こることはとめられないので、JavaScriptをつかって項目を入れなおす場合もう一度ページを移動(リロード)することになります。

サーバ側でセッションに入れておくとかするほうが良い気がします。

投稿2017/09/21 05:44

kei344

総合スコア69407

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

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

cp_cop

2017/09/21 05:57

ご回答ありがとうございます。 実はいろいろと調べている中で教えていただいたセッションで実行することも考えていましたが 調べれば調べるほど難しくその難易度の高さに躊躇してしまいました。 ただ今後のことも考えこれを機に勉強してみたいと思います。 ありがとうございました。
guest

0

postしたページをgetで表示しているということでしょうか?
もし想定外のリクエスト(get)がされるのであれば、formのあるページにリダイレクトしたほうがよくないですか?

ローカルストレージからの取得は以下の通りです。

JavaScript

1localStorage.getItem('keyname')

localStorage基本操作
http://qiita.com/ichikawa_0829/items/85413fedc59822ccef75

投稿2017/09/21 04:15

x_x

総合スコア13749

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

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

cp_cop

2017/09/21 04:57

ご回答ありがとうございます。 >postしたページをgetで表示しているということでしょうか? あまり知識が無いため、回答に誤りがあるかもしれませんが、 formをpost送信するとhttps://example.com/hoge.cgiに飛び新たなページが表示されるようになっています。 簡単に言うとformがあるページとは別のページに飛びます。 その時、post送信なのでアドレスにパラメータは付与されていません。 そしてブラウザを閉じ、また立ち上げるとページがリロードされますが、その時にformで指定しているhiddenの情報がない単なるhttps://example.com/hoge.cgiが表示されてしまいます。 これをformの値を継承したものにしたいと思っています。 リダイレクトも考えたのですが、できれば再びブラウザを開いてもpost送信された状態のページが表示できるようにしたいと思っています。
x_x

2017/09/21 05:35

postだけ受け付けているページに、ブラウザがgetしてくるのですよね? ブラウザの挙動としてはあまりよろしくない感じがします
cp_cop

2017/09/21 05:44

ありがとうございます。 >ブラウザの挙動としてはあまりよろしくない感じがします やはり再読み込みされた時には別のページにリダイレクトさせるなりして、再度送信元のページからpostさせることがいいようですね。 参考になりました。 ご回答いただきありがとうございました。
cp_cop

2017/09/21 06:10 編集

調べていただきありがとうございます。 URL参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問