前提・実現したいこと
現在
・Aの画面で問合せ番号のリンクをクリックするとwindow.openで問合せ入力画面を表示させるようにしています。
・この画面はPHPで排他ロックするように処理が組まれてて、同一の問合せ番号の問合せは複数のユーザーで編集できないようにしてあります。
・排他ロックの解除は、問合せ入力画面の閉じるボタンをクリックした際に、ajaxでサーバにpostし、成功後、問合せ入力画面も閉じるようにしてあります。
・閉じるボタンをクリックしない場合、メインの画面を遷移しても問合せ画面は閉じずにそのままになります。
発生している問題・エラーメッセージ
問題としては、Aの画面の問合せ番号のリンクをクリックした際に、同じ問合せ入力画面に内容が読み込まれ、ロック解除の処理が間に挟まれないことです。
このため意図せず、問合せがロックされたままの状態が続きます。
これが、Aの画面から遷移しない状態であればwindow.openの戻り値を変数に入れ、その変数がundefineではないかどうかで、判断できます。
js
1var win; 2function sample(){ 3 if (!win || win.closed) { 4 win = window.open(...); 5 }else{ 6 //既存の問合せを閉じるかどうか 7 //既存の問合せを閉じる場合、既存の問合せのロック処理 8 //新しい問合せを開く 9 } 10}
ただ、最初に書いた通りメインの画面を遷移しても、問合せ画面は閉じずに残ります。
その状態で、再度Aの画面に戻り問合せ番号のリンクをクリックすると、判定する変数がundefinedなため、既存の問合せ内容の画面に新しい問合せが読み込まれます。
試したこと
以下のように、beforeunloadイベントと、unloadイベントを追加し、確認ダイアログが表示され、問合せのロックが解除されるのを期待しましたが、ロック解除されませんでした。
確認ダイアログも以下のタイミングでしか表示されませんでした。
問合せ番号xのリンクをクリック
↓
問合せ番号yのリンクをクリック → 確認ダイアログ表示
↓
問合せ番号zのリンクをクリック
↓
以下どの問合せ番号をクリックしても、確認ダイアログが表示されない。
自分がそれぞれの、イベントの発生タイミングを正確に把握していないため、ログを出力させましたが、確認ダイアログが表示されないタイミングでも、beforeunloadイベント、unloadイベントともに発生しているようです。
js
1window.addEventListener('beforeunload', e => { 2 console.log('beforeunload'); 3 e.preventDefault(); 4 e.returnValue = '既に開いている問い合せを閉じますか?' 5});
js
1window.addEventListener('unload', e => { 2 console.log('unload'); 3 var url = webRoot + 'sample/unlock'; 4 var key1 = $('#sample_no').val(); 5 6 $.ajax({ 7 type : "POST", 8 async: false, 9 url: url, 10 data:{ 11 "key1": key1, 12 "key2": "" 13 }, 14 success: function(data){ 15 16 } 17 }); 18});
最終的に、
1.既存の問合せに新しい問合せが表示される前に、確認メッセージ出したい(できれば)
2.既存の問合せ画面に新しい問合せを表示させる際に、既存の問合せはロック解除処理をしたい。
以上2点(最悪2のみ)をクリアできればと思っています。
初めての投稿で至らない点もあるかと思いますがどうぞよろしくお願いします。
補足情報(FW/ツールのバージョンなど)
Google Chrome 94.0.4606.81
jQuery 1.4.2
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/14 08:39
2021/10/14 08:50