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

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

ただいまの
回答率

91.77%

  • JavaScript

    10060questions

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

  • HTML

    5578questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

submit後に実行される処理が先に行われる場合があるか

受付中

回答 2

投稿 2017/09/13 21:11 ・編集 2017/09/15 16:38

  • 評価
  • クリップ 1
  • VIEW 90

winwin

score 2

発生している問題・エラーメッセージ

submit()後に処理される関数がsubmit前か処理中に行われた

java(struts)でWEBアプリを作っています。
ある画面にて登録処理を行うとサーバーに入力した項目の値が渡ってこない現象が発生しました。

ソースは下記のようになっており

function 登録ボタンクリック処理() {
    // 登録ボタン非活性処理
    buttonDisabled();
    // 入力チェック
    validation();
    // 送信
    form.submit();
    // 入力項目非活性
    inputDisabled();
}

パラメータが渡ってこないということはsubmit時に入力項目が非活性になっていたことが考えられるのですが、
submit後に入力項目を非活性にしているため、何が悪さをしているのかわからず困っています。
※submit後に入力項目を非活性にしているのは、画面がロックされているように表現するためです。

試したこと

submitは再送することがあるという仕様を見つけたので、入力項目の非活性処理が行われた後に
再送されるとどうなるか試してみました。
(submit時にネットワークの無効・有効を利用)
結果はsubmit実行時の状態で作成されたパラメータが正常に送信されてしまい、期待通りになりませんでした。
※ただしこの方法だとsubmitのリクエストは保留中となり、再送が行われたかは微妙ではあります。

知りたいこと

・submit後に実行される処理が先に行われる場合があるか?
・submitの再送時にパラメータを再作成することがあるか?
・入力項目の非活性以外に入力項目の値が飛んでこない場合があるか?
・今回試したやり方以外でのsubmitの再送方法

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+3

 考えられる可能性

ソースが断片的なので確かな事はいえませんが…。

  • もし、submitイベントハンドラ内で disabled にしたならば、submitイベントハンドラは submit 前に発火するので、その症状になります。
  • そもそも論として、inputDisabled() が阻害している可能性を考慮しているのでしたら、何よりも先にinputDisabled() をコメントアウトして検証してみるべきだと思います。disabled が先なのか、後なのかは後で検証しても構いませんが、本当にそれが原因なのかは先に確かめるべきです。
  • 開示できるコードが少ないためにコードが断片的になっているのだと思いますが、そういう場合は本番コードとは別にテスト環境を用意して下さい。再現可能な最小限のコードになるまでコードを削っていけば、自ずと原因が絞り込めます。

 ログの確認

パラメーターが渡っていないということは、経路上のどこかで通信されていない事は間違いないので、経路上の全てのログを洗い出して下さい。

  • Fiddler で通信ログを取る
  • ネットワーク系路上にある全てのネットワーク機器のログを確認(ポートのLinkDown履歴がないか、NATセッション制限で通信がブロックされてないか、等)
  • Webサーバのログを確認
  • サーバサイドスクリプト側でログを出力して確認

 輻輳調査

輻輳はネットワーク経路上のどこても発生しうるのて、一つずつ確認していきます。

  • クライアント側のISP (biglobe, nifty, OCN, IIJ等) の網終端装置
  • クライアント側の回線業者(NTT, KDDI等)の管理する機器
  • クライアント側のネットワーク機器(ルータ、SW-HUB等)
  • サーバマシン
  • サーバ側のISPの網終端装置
  • サーバ側の回線業者(NTT, KDDI等)の管理する機器

サーバ側はホスティングサービスに問い合わせるとして、クライアント側のISP、回線業者は回線ID、PPPoEアカウント等の回線が特定出来る情報があれば、問い合わせる事が可能です。
NTT以外は過去にさかのぼって輻輳調査を依頼することが可能なので、現象発生時刻を添えて問い合わせれば、輻輳状態を確認してくれます。

クライアント側のネットワーク機器は各機器にログインして、ログを確認して下さい。

リアルタイムに輻輳状態を確認するには、1000byteのpingパケットを送信し続け
て、pingロス率を確認する方法があります。
https://www.google.co.jp/search?q=ping+コマンド

Re: winwin さん

投稿 2017/09/13 23:52

編集 2017/09/15 08:28

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2017/09/14 10:55

    ご回答ありがとうございます。
    この現象ですが、非常に再現率が低いのと(1/100000)机上ではありえないことが起きているので困っております。
    引き続き再現可能な条件を探ってみます。

    キャンセル

  • 2017/09/14 13:48

    試行回数が10000回に達したのですか…。
    そこまで、再現率が低いのであれば、輻輳が起きてないか等のネットワーク系統も疑ってみるべきだと思います。
    あるいは、特定端末起因の可能性はないのてしょうか。

    キャンセル

  • 2017/09/14 16:20

    まだ1回しか再現していないので、特定端末起因の可能性なのかもわからない状態です。
    輻輳が起きたことにより、入力項目が非活性の状態でリクエストの再送が行われてしまい、パラメータが欠落したという線を疑っております。
    ただ輻輳を発生させるのが難しく困っております。

    キャンセル

  • 2017/09/15 08:12

    原因究明になりそうな「事実」を詳しく書いて頂くと、直接的な回答を得られるかもしれません。
    「もし、submitイベントハンドラ内で disabled にしたならば」もYes/Noの返答がないので、よく分からないです。
    コードに原因が可能性を踏まえるなら、どういうコードでsubmitを実行しているのか、を書くべきではないかと。
    form.submit()している、submitボタンを押して貰っている、非同期通信で
    リクエストしている...、いくつか方法はありますよね。

    また、通信か発生していない可能性を考慮するなら、「どこまでは通信が発生しているのか」を切り分けるべきだと思います。
    ブラウザが通信リクエストしていない、ファイアウォールがブロックしている、ルータが通信をブロックしている、SW-HUBがボートを閉鎖している、...可能性はいくつもあります。
    親記事に追記しました。

    キャンセル

  • 2017/09/15 08:29

    > ただ輻輳を発生させるのが難しく困っております。
    輻輳調査について、親記事に追記しました。

    キャンセル

  • 2017/09/15 16:48

    色々とコメントを頂きありがとうございます。
    回答するのが漏れており、申し訳ございませんでした。
    抜粋ソースにあるsubmit()ですが、form.submit()で送信しています。
    それからsubmitイベントハンドラでは何もしておりません。
    なので、submit時に入力項目が非活性になることはありえないと思うのですが、何らかの理由で入力項目非活性処理実行後に再度form.submit()が実行されたことを疑うしかない状況です。
    輻輳については頂いた情報をもとに調査してみます。

    キャンセル

0

送信直前にdisabledを解除しないといけないのかもしれません。

加えて、submit関数内でもサブミットをする場合は、
ボタン押下時のサブミットはキャンセルしてください。

また、Webでシステムを作るときは、リクエスト毎にどういうパラメータが送られているかを確認する手段を用意しておくといいと思います。
多重サブミット可能かどうかなどの検証にも役に立つと思います。

PS.
submit後の入力項目の非活性化に意味があるように思えないのですが、、、
(ボタン押下後に入力欄を変える時間があるのかと、変えようと思う人がいるのかどうか。。。)

投稿 2017/09/13 21:32

編集 2017/09/14 01:06

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2017/09/14 10:52

    ご回答ありがとうございました。
    仰る通りsubmit後の非活性化に意味はなく、単純に更新中だから触らないでというのをアピールしたかっただけなんです。。。

    キャンセル

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

ただいまの回答率

91.77%

関連した質問

同じタグがついた質問を見る

  • JavaScript

    10060questions

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

  • HTML

    5578questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。