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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

7946閲覧

フォーム送信時に送信日時を取得してメールに表示させる方法

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2017/08/04 02:07

<form id="form"> (省略) <button id="buttton"> <input type="hidden" name="Time" id="Time"> <span>送信</span> </button> </form> //外部スクリプトの読み込み //エラーがなければsubmitボタンにvalidation::okを発生させている <script> //サーバーから送信日時を取得 function getTime() { var request = new XMLHttpRequest(); request.open('HEAD', window.location.href, true); request.send(); request.onreadystatechange = function() { if (this.readyState === 4) { var time = new Date(request.getResponseHeader('Date')); document.getElementById("Time").value = time; console.log(document.getElementById('Time')); } } } $(function(){ var $form = $("#form"), $submit = $("#button"); $submit.on('validation::ok', function(event, $form) { if($submit.not('error')){ getTime(); $form.submit(); } }); }); </script>

フォーム送信日時を取得して、hiddenで渡し、メール本文に記載したいと思っています。
こちらのフォームの送信ボタンを押すと、
コンソールログにはTimeの値(送信日時)が表示されるのですが、
メール本文にはの値が表示されません。

試しに、

function getTime() { (略) }

$(function(){ (略) });

の間にgetTime();を記載してみたところメール本文にも日時が表示されるのですが、
これだとブラウザにアクセスした時間になってしまうので、
送信のタイミングで実行させたいのですが。。。

解決のためのアドバイスをいただければ幸いです。

よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

getTime()が非同期なメソッドだからですね。

getTime()で時刻設定指示を出す→$form.submit();でフォームデータを送信する→request.onreadystatechangeで時刻を設定する、の順番になっています。

順番通りに動作させるためには、

if($submit.not('error')){ getTime($form); }

として呼び出しして、

if (this.readyState === 4) { var time = new Date(request.getResponseHeader('Date')); document.getElementById("Time").value = time; console.log(document.getElementById('Time')); $form.submit(); }

とすれば、時刻設定後に$form.submit();が実行されることを保証できますので、おそらくうまくいくでしょう。

ただ、そのまえにjavascriptでnew Date()で生成した時刻じゃダメなんだろうかとか、サーバ側でフォーム処理するときに時刻処理できないんだろうか、とか疑問点はありますが。

投稿2017/08/04 02:26

zohnam

総合スコア1441

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

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

退会済みユーザー

退会済みユーザー

2017/08/04 02:48

ありがとうございます。大変勉強になりました。ご教授いただいた方法で無事に送信時刻を取得できるようになりました。
guest

0

日付を取るためにどういう理由があってXMLHttpRequestをはさんでいるのでしょうか。意味がないと思います。(非同期処理だから先にsubmitが実行されてしまっているだけ)

正確な送信日時はサーバ側でしかわからないので、サーバ側で日時を取得して追加すればよいのでは?

投稿2017/08/04 02:16

kei344

総合スコア69398

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

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

退会済みユーザー

退会済みユーザー

2017/08/04 02:48

ありがとうございます。大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問