Update index.html
Browse files- index.html +128 -94
index.html
CHANGED
@@ -379,7 +379,7 @@ document.addEventListener('DOMContentLoaded', function () {
|
|
379 |
/* プログレスバーのマーカー */
|
380 |
.progress-marker {
|
381 |
position: absolute;
|
382 |
-
bottom: -
|
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"
|
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
|
|
|
|
|
1002 |
<br>
|
1003 |
<button class="combine-button" id="sw-register-btn" disabled>登録を開始</button>
|
1004 |
<div class="combine-status" id="sw-status">
|
1005 |
</div>
|
1006 |
-
|
1007 |
-
|
1008 |
-
|
1009 |
-
|
1010 |
-
|
1011 |
-
|
1012 |
-
|
1013 |
-
|
1014 |
-
|
1015 |
-
|
1016 |
-
|
1017 |
-
|
1018 |
-
|
1019 |
-
|
1020 |
-
|
1021 |
-
|
1022 |
-
|
1023 |
-
|
1024 |
-
|
1025 |
-
|
1026 |
-
|
1027 |
-
|
1028 |
-
|
1029 |
-
|
1030 |
-
|
1031 |
-
|
1032 |
-
|
1033 |
-
|
1034 |
-
|
1035 |
-
|
1036 |
-
|
1037 |
-
|
1038 |
-
|
1039 |
-
|
1040 |
-
|
1041 |
-
|
1042 |
-
|
1043 |
-
|
1044 |
-
|
1045 |
-
|
1046 |
-
|
1047 |
-
|
1048 |
-
|
1049 |
-
|
1050 |
-
|
1051 |
-
|
1052 |
-
|
1053 |
-
|
1054 |
-
|
1055 |
-
|
1056 |
-
|
1057 |
-
|
1058 |
-
|
1059 |
-
|
1060 |
-
|
1061 |
-
|
1062 |
-
|
1063 |
-
|
1064 |
-
|
1065 |
-
|
1066 |
-
|
1067 |
-
|
1068 |
-
|
1069 |
-
|
1070 |
-
|
1071 |
-
|
1072 |
-
|
1073 |
-
|
1074 |
-
|
1075 |
-
|
1076 |
-
|
1077 |
-
|
1078 |
-
|
1079 |
-
|
1080 |
-
|
1081 |
-
|
1082 |
-
|
1083 |
-
|
1084 |
-
|
1085 |
-
|
1086 |
-
|
1087 |
-
|
1088 |
-
|
1089 |
-
|
1090 |
-
|
1091 |
-
|
1092 |
-
|
1093 |
-
|
1094 |
-
|
1095 |
-
|
1096 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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">
|