モーダル内の情報をデータとして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">×</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;">  変更  </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>
https://teratail.com/questions/118105
これですかね?
ご回答ありがとうございます。
そうですね。遷移時に打ち切られてしまうのでどのように実装すれば良いか,困っています。
やりたい操作(POST等)を全て終えてからlocation.replace(location.href);を実行すればうまくいくと思いますよ。
https://teratail.com/questions/141736
このようにPromiseでの実装が良いのでしょうか?
「データの送信が出来ていない」というのはどうやって判断したのでしょうか?
このコードで実行した後に,Postmanで中身を確認したところ,変わってなかったのでそう判断しました。
また,コード内でeditTaskParameters()で行われるデータ内容の出力がページ遷移後に行われていることも確認できています。
location.replace(location.href)をコメントアウトしたらpostはうまくいきますか?
はい、その場合は問題なくPostは実行されます。
いまローカル環境で試してみたのですがrequest.addEventListener("load"〜の部分はレスポンスがかえってきた時に実行されているんですよね。
そうなんですよね、処理が打ち切られてるって訳でもないんですよね
Google Chromeで通信見れるのですがそちらは確認しましたか?
https://blog.ideamans.com/2018/01/google-chrome-network.html
location.replaceの1行前にdebugger;と書いておけばプログラムの実行が一度止まるのでそこまでにpostがされているかどうか確認してみてください。
返信遅れて申し訳ありません
Firefoxで動作確認を行っていたため,そこまで確認できていなかったですが,確かにクロームだと通信できていますね。環境によって処理順に差があるのでしょうか?
debugger;入れてみましたが,無視されますね・・・
firefoxにも検証ツールが付いていますのでそちらも確認してみてください。
右クリック→要素を調査→「ネットワーク」のタブ
あなたの回答
tips
プレビュー