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

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

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

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

Q&A

0回答

1435閲覧

POSTとページ更新を同時に行う

atena

総合スコア20

JavaScript

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

0グッド

1クリップ

投稿2019/01/04 01:48

モーダル内の情報をデータとしてPOSTした際に同時にページ更新を行おうと思ったのですが,更新のみが実行されてデータの送信を行うことができませんでした。これではできないのでしょうか?何か解決策がありましたら教えていただきたいです。

JavaScript

1function editTaskParameters(task_id, data){ 2 data = 'jsonstring=' + data; 3 4 console.log(data); 5 var url = "https://us-central1-singletasker-dev.cloudfunctions.net/task?api_token=" + api_token + "&task_id=" + task_id; 6 const request = new XMLHttpRequest(); 7 request.open("POST", url); 8 request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 9 request.addEventListener("load", (event) => { 10 if (event.target.status !== 200) { 11 console.log(`${event.target.status}: ${event.target.statusText}`); 12 location.replace(location.href); 13 return; 14 } 15 }); 16 request.addEventListener("error", () => { 17 console.error("Network Error"); 18 }); 19 request.send( data ); 20} 21 22function editTask(){ 23 var name = document.getElementById('editName').value; 24 var memo = document.getElementById('editMemo').value; 25 var due = document.getElementById('editDue').value; 26 due = due.replace(new RegExp("/", 'g'), '-') 27 var priority = document.getElementById('editPriority').value; 28 // var tags = document.getElementById('tags').value; 29 var hour = document.getElementById('editHour').value; 30 var minute = document.getElementById('editMinute').value; 31 32 console.log(document.getElementById('editPriority')); 33 34 most_important_taskid = localStorage.getItem('most_important_taskid'); 35 most_important_task = JSON.parse(localStorage.getItem(most_important_taskid)); 36 37 var data = "{"; 38 39 if(name != most_important_task.name){ 40 data += "\"name\":\"" + name + "\","; 41 } 42 if(memo != most_important_task.description){ 43 data += "\"description\":\"" + memo + "\","; 44 } 45 if(priority != most_important_task.priority){ 46 data += "\"priority\":" + priority + ","; 47 } 48 if(due != most_important_task.due.replace(new RegExp("-", 'g'), '/')){ 49 data += "\"due\":\"" + due + "\","; 50 } 51 if(hour != reformat_time(most_important_task.estimate)[0] || minute != reformat_time(most_important_task.estimate)[1]){ 52 hour = ('0' + hour).slice(-2); 53 minute = ('0' + minute).slice(-2); 54 data += "\"estimate\":\"" + hour + ":" + minute + ":00\"," 55 } 56 57 data = data.slice(0, -1) + "}"; 58 59 most_important_taskid = localStorage.getItem('most_important_taskid'); 60 editTaskParameters(most_important_taskid, data); 61 62 // console.log(name); 63 // console.log(memo); 64 // console.log(due); 65 // console.log(priority); 66 // console.log(hour); 67 // console.log(minute); 68 // console.log(data); 69}

HTML

1  <div class="modal fade bd-example-modal-lg" id="taskmodModal" tabindex="-1" role="dialog" aria-labelledby="taskmodModalLabel" 2 aria-hidden="true"> 3 <div class="modal-dialog modal-lg" role="document"> 4 <div class="modal-content"> 5 <div class="modal-header"> 6 <h5 class="modal-title" id="taskmodModalLabel">タスク変更</h5> 7 <button type="button" class="close" data-dismiss="modal" aria-label="Close"> 8 <span aria-hidden="true">&times;</span> 9 </button> 10 </div> 11 <div class="modal-body mx-5"> 12 <form> 13 <!-- タスク名の設定 --> 14 <div class="form-group"> 15 <input type="text" class="form-control" id="editName"> 16 </div> 17 18 <!-- その他パラメータの設定 --> 19 </form> 20 </div> 21 <div class="modal-footer"> 22 <button type="button" class="btn btn-secondary" data-dismiss="modal" style="border-radius: 100px;"> 23 キャンセル 24 </button> 25 <button type="button" onclick="editTask()" class="btn btn-primary" style="border-radius: 100px;">&nbsp;&emsp;変更&emsp;&nbsp;</button> 26 <!--<button onclick="addTask()" href="home.html" type="submit"--> 27 <!--class="btn btn-primary btn-lg" style="border-radius: 10px;">作成--> 28 <!--</button>--> 29 </div> 30 </div> 31 </div> 32 </div>

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

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

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

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

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

atena

2019/01/04 23:43

ご回答ありがとうございます。 そうですね。遷移時に打ち切られてしまうのでどのように実装すれば良いか,困っています。
退会済みユーザー

退会済みユーザー

2019/01/05 00:02

やりたい操作(POST等)を全て終えてからlocation.replace(location.href);を実行すればうまくいくと思いますよ。
退会済みユーザー

退会済みユーザー

2019/01/05 00:16

「データの送信が出来ていない」というのはどうやって判断したのでしょうか?
atena

2019/01/05 00:21

このコードで実行した後に,Postmanで中身を確認したところ,変わってなかったのでそう判断しました。 また,コード内でeditTaskParameters()で行われるデータ内容の出力がページ遷移後に行われていることも確認できています。
退会済みユーザー

退会済みユーザー

2019/01/05 00:45

location.replace(location.href)をコメントアウトしたらpostはうまくいきますか?
atena

2019/01/05 00:47

はい、その場合は問題なくPostは実行されます。
退会済みユーザー

退会済みユーザー

2019/01/05 00:57

いまローカル環境で試してみたのですがrequest.addEventListener("load"〜の部分はレスポンスがかえってきた時に実行されているんですよね。
atena

2019/01/05 01:08

そうなんですよね、処理が打ち切られてるって訳でもないんですよね
退会済みユーザー

退会済みユーザー

2019/01/05 01:18

location.replaceの1行前にdebugger;と書いておけばプログラムの実行が一度止まるのでそこまでにpostがされているかどうか確認してみてください。
atena

2019/01/06 23:30

返信遅れて申し訳ありません Firefoxで動作確認を行っていたため,そこまで確認できていなかったですが,確かにクロームだと通信できていますね。環境によって処理順に差があるのでしょうか? debugger;入れてみましたが,無視されますね・・・
退会済みユーザー

退会済みユーザー

2019/01/07 00:59

firefoxにも検証ツールが付いていますのでそちらも確認してみてください。 右クリック→要素を調査→「ネットワーク」のタブ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問