soiz1 commited on
Commit
776c0c7
·
1 Parent(s): 13fc860

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +128 -94
index.html CHANGED
@@ -379,7 +379,7 @@ document.addEventListener('DOMContentLoaded', function () {
379
  /* プログレスバーのマーカー */
380
  .progress-marker {
381
  position: absolute;
382
- bottom: -5px;
383
  width: 0;
384
  height: 0;
385
  border-left: 5px solid transparent;
@@ -934,7 +934,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
934
  </div>
935
  </div>
936
  <h1>文化発表会音声動画プレイヤー</h1>
937
- <div class="settings" hidden>
938
  <h2>サービスワーカー設定</h2>
939
  <div hidden>
940
  <!--邪魔だから一時的に非表示-->
@@ -998,102 +998,136 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
998
  <input type="checkbox" id="sw-root" checked>ルートファイル (/)</label>
999
  </div>
1000
  </div>
1001
- <a>絶対に押さないでください。これはオフラインでも使用できるようにする機能のテスト中で、ページが更新できなくなります。</a>
 
 
1002
  <br>
1003
  <button class="combine-button" id="sw-register-btn" disabled>登録を開始</button>
1004
  <div class="combine-status" id="sw-status">
1005
  </div>
1006
- <script>
1007
- document.getElementById('sw-register-btn').addEventListener('click', async () => {
1008
- const statusElem = document.getElementById('sw-status');
1009
-
1010
- function updateStatus(message) {
1011
- console.log(message);
1012
- statusElem.textContent = message;
1013
- }
1014
-
1015
- function updateError(message, error) {
1016
- const errorMsg = `${message}\nエラー詳細: ${error?.message || error}`;
1017
- console.error(errorMsg, error);
1018
- statusElem.textContent = errorMsg;
1019
- }
1020
-
1021
- if (!('serviceWorker' in navigator)) {
1022
- updateError('このブラウザはService Workerに対応していません。');
1023
- return;
1024
- }
1025
-
1026
- try {
1027
- updateStatus('既存のService Workerをアンレジスター中...');
1028
-
1029
- const registrations = await navigator.serviceWorker.getRegistrations();
1030
- for (const registration of registrations) {
1031
- try {
1032
- await registration.unregister();
1033
- updateStatus('Service Workerをアンレジスターしました。');
1034
- } catch (unregErr) {
1035
- updateError('Service Workerのアンレジスター中に例外が発生しました。', unregErr);
1036
- return;
1037
- }
1038
- }
1039
-
1040
- updateStatus('アンレジスター完了。新しいService Workerを登録中...');
1041
-
1042
- setTimeout(async () => {
1043
- try {
1044
- const newRegistration = await navigator.serviceWorker.register('/sw.js');
1045
- updateStatus('Service Workerが正常に登録されました。\n登録範囲: ' + newRegistration.scope);
1046
-
1047
- // チェックボックスの状態からファイルリストを作成
1048
- const fileMap = {
1049
- 'sw-video': '/v.mp4',
1050
- 'sw-t-video': '/t/v.mp4',
1051
- 'sw-piano': '/p.mp3',
1052
- 'sw-soprano': '/s.mp3',
1053
- 'sw-alto': '/a.mp3',
1054
- 'sw-tenor': '/t.mp3',
1055
- 'sw-combined': '/k.mp3',
1056
- 'sw-t-piano': '/t/p.mp3',
1057
- 'sw-t-soprano': '/t/s.mp3',
1058
- 'sw-t-alto': '/t/a.mp3',
1059
- 'sw-t-tenor': '/t/t.mp3',
1060
- 'sw-t-combined': '/t/k.mp3',
1061
- 'sw-index': '/index.html',
1062
- 'sw-root': '/',
1063
- };
1064
-
1065
- // チェックされているものだけ抽出
1066
- const filesToCache = [];
1067
- const checkboxStates = {};
1068
- for (const [id, url] of Object.entries(fileMap)) {
1069
- const checkbox = document.getElementById(id);
1070
- if (!checkbox) continue;
1071
- checkboxStates[id] = checkbox.checked;
1072
- if (checkbox.checked) {
1073
- filesToCache.push(url);
1074
- }
1075
- }
1076
-
1077
- // SWがコントロール中ならメッセージ送信
1078
- if (navigator.serviceWorker.controller) {
1079
- navigator.serviceWorker.controller.postMessage({
1080
- type: 'CACHE_FILES',
1081
- files: filesToCache,
1082
- checkboxStates: checkboxStates,
1083
- });
1084
- updateStatus('キャッシュ更新のメッセージをサービスワーカーに送信しました。');
1085
- } else {
1086
- updateStatus('サービスワーカーがコントロール中ではありません。キャッシュ更新メッセージは送信できません。');
1087
- }
1088
- } catch (regErr) {
1089
- updateError('Service Workerの登録に失敗しました。', regErr);
1090
- }
1091
- }, 500);
1092
- } catch (err) {
1093
- updateError('Service Workerの処理中に致命的なエラーが発生しました。', err);
1094
- }
1095
- });
1096
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1097
  </div>
1098
  <div class="container">
1099
  <div class="audio-controls">
 
379
  /* プログレスバーのマーカー */
380
  .progress-marker {
381
  position: absolute;
382
+ bottom: -10px;
383
  width: 0;
384
  height: 0;
385
  border-left: 5px solid transparent;
 
934
  </div>
935
  </div>
936
  <h1>文化発表会音声動画プレイヤー</h1>
937
+ <div class="settings">
938
  <h2>サービスワーカー設定</h2>
939
  <div hidden>
940
  <!--邪魔だから一時的に非表示-->
 
998
  <input type="checkbox" id="sw-root" checked>ルートファイル (/)</label>
999
  </div>
1000
  </div>
1001
+ <a>下記のボタンを押すと、サービスワーカーを使用してページをオフラインで使用できるようにします。<br>
1002
+ <b>これはテスト的な機能で、ページの更新などができなくなるバグが発生する可能性があります。<br>(更新機能は実装していますが安定して動作するとは限りません。)<br>
1003
+ ページが更新されない場合、動画の更新ができなかったり既存のバグが残り続けたりする可能性があります。</b></a>
1004
  <br>
1005
  <button class="combine-button" id="sw-register-btn" disabled>登録を開始</button>
1006
  <div class="combine-status" id="sw-status">
1007
  </div>
1008
+ <script>
1009
+ window.addEventListener('load', async () => {
1010
+ const statusElem = document.getElementById('sw-status');
1011
+ const registerBtn = document.getElementById('sw-register-btn');
1012
+
1013
+ function updateStatus(message) {
1014
+ console.log(message);
1015
+ statusElem.textContent = message;
1016
+ }
1017
+
1018
+ function updateError(message, error) {
1019
+ const errorMsg = `${message}\nエラー詳細: ${error?.message || error}`;
1020
+ console.error(errorMsg, error);
1021
+ statusElem.textContent = errorMsg;
1022
+ }
1023
+
1024
+ if (!('serviceWorker' in navigator)) {
1025
+ updateError('このブラウザはService Workerに対応していません。');
1026
+ return;
1027
+ }
1028
+
1029
+ // 更新フラグ
1030
+ let hasUpdate = false;
1031
+
1032
+ try {
1033
+ const registration = await navigator.serviceWorker.getRegistration();
1034
+ if (registration) {
1035
+ updateStatus('Service Workerは既に登録されています。更新を確認中...');
1036
+
1037
+ registration.onupdatefound = () => {
1038
+ const newWorker = registration.installing;
1039
+ if (newWorker) {
1040
+ newWorker.onstatechange = () => {
1041
+ if (newWorker.state === 'installed') {
1042
+ if (navigator.serviceWorker.controller) {
1043
+ // すでに別のSWがアクティブ ⇒ 更新あり
1044
+ updateStatus('新しいService Workerがインストールされました。更新が利用可能です。');
1045
+ hasUpdate = true;
1046
+ registerBtn.textContent = '更新を開始';
1047
+ registerBtn.disabled = false;
1048
+ } else {
1049
+ updateStatus('Service Workerが初めてインストールされました。');
1050
+ }
1051
+ }
1052
+ };
1053
+ }
1054
+ };
1055
+
1056
+ // 明示的に更新を確認
1057
+ await registration.update();
1058
+ } else {
1059
+ updateStatus('Service Workerはまだ登録されていません。');
1060
+ registerBtn.textContent = '登録とキャッシュ';
1061
+ registerBtn.disabled = false;
1062
+ }
1063
+ } catch (err) {
1064
+ updateError('Service Workerの初期確認中にエラーが発生しました。', err);
1065
+ }
1066
+
1067
+ // ボタンクリック時の動作
1068
+ registerBtn.addEventListener('click', async () => {
1069
+ registerBtn.disabled = true;
1070
+ const fileMap = {
1071
+ 'sw-video': '/v.mp4',
1072
+ 'sw-t-video': '/t/v.mp4',
1073
+ 'sw-piano': '/p.mp3',
1074
+ 'sw-soprano': '/s.mp3',
1075
+ 'sw-alto': '/a.mp3',
1076
+ 'sw-tenor': '/t.mp3',
1077
+ 'sw-combined': '/k.mp3',
1078
+ 'sw-t-piano': '/t/p.mp3',
1079
+ 'sw-t-soprano': '/t/s.mp3',
1080
+ 'sw-t-alto': '/t/a.mp3',
1081
+ 'sw-t-tenor': '/t/t.mp3',
1082
+ 'sw-t-combined': '/t/k.mp3',
1083
+ 'sw-index': '/index.html',
1084
+ 'sw-root': '/',
1085
+ };
1086
+
1087
+ function getSelectedFiles() {
1088
+ const filesToCache = [];
1089
+ const checkboxStates = {};
1090
+ for (const [id, url] of Object.entries(fileMap)) {
1091
+ const checkbox = document.getElementById(id);
1092
+ if (checkbox) {
1093
+ checkboxStates[id] = checkbox.checked;
1094
+ if (checkbox.checked) filesToCache.push(url);
1095
+ }
1096
+ }
1097
+ return { filesToCache, checkboxStates };
1098
+ }
1099
+
1100
+ try {
1101
+ updateStatus('既存のService Workerをアンレジスター中...');
1102
+ const registrations = await navigator.serviceWorker.getRegistrations();
1103
+ for (const registration of registrations) {
1104
+ await registration.unregister();
1105
+ }
1106
+
1107
+ updateStatus('新しいService Workerを登録中...');
1108
+ const newReg = await navigator.serviceWorker.register('/sw.js');
1109
+ updateStatus('登録成功: ' + newReg.scope);
1110
+
1111
+ // 少し待ってcontrollerを取得
1112
+ setTimeout(() => {
1113
+ if (navigator.serviceWorker.controller) {
1114
+ const { filesToCache, checkboxStates } = getSelectedFiles();
1115
+ navigator.serviceWorker.controller.postMessage({
1116
+ type: 'CACHE_FILES',
1117
+ files: filesToCache,
1118
+ checkboxStates,
1119
+ });
1120
+ updateStatus('キャッシュ更新メッセージを送信しました。');
1121
+ } else {
1122
+ updateStatus('Service Workerがコントロール中ではありません。');
1123
+ }
1124
+ }, 1000);
1125
+ } catch (err) {
1126
+ updateError('Service Workerの再登録に失敗しました。', err);
1127
+ }
1128
+ });
1129
+ });
1130
+ </script>
1131
  </div>
1132
  <div class="container">
1133
  <div class="audio-controls">