待合室で順番が来たときに、サイトへすすむかの確認ダイアログを強制表示し、待合室を通過する(サイトへ入る)タイミングを数分間だけ調整(先延ばし)できるようにします
※確認ダイアログは、通常ではブラウザが最小化されている場合などに表示されるものです
※ブックマークレットの登録・利用方法が分からない場合は、基本的な使い方のページを参考にしてください
以下の文字列でブックマークレットを登録し、待合室ページで使用してください
ダミー登録用の空ページのリンク
待合室に入ったら、ブックマークレットを呼び出してください
実行されると「実行しました」とアラートメッセージが表示されます
このメッセージは閉じてください
ブックマークレット化前のソースコードです
ご自身で表示等カスタマイズされたい方はご自由にご利用ください
※ブックマークレット化の方法については記載していません
簡単な解説
javascript: (function (confirmLimitMin) {
if (document.getElementById('windowStartTimeDetail') || !document.querySelector('span#MainPart_lbExpectedServiceTime')) {
alert('すでに実行されているか、対象のページではありません');
return;
};
if (window.QueueIt.Queue.InactivityDetector) {
window.QueueIt.Queue.InactivityDetector.prototype.isHidden = () => { return true };
} else {
alert('[エラー] 実行できませんでした(QueueIt.Queue.InactivityDetector が見つかりませんでした');
return;
};
const insertAfter = (elem, posElem) => {
posElem.parentElement.insertBefore(elem, posElem.nextSibling);
};
let pos1 = document.querySelector('#pConfirmRedirectTime');
const area1 = document.createElement('span');
area1.setAttribute('id', 'windowStartTimeDetail');
area1.style.cssText = 'text-align:center; font-weight:bold; color:blue;';
area1.innerHTML = '';
pos1.appendChild(area1);
const area2 = document.createElement('div');
area2.setAttribute('id', 'windowStartTimeRemain');
area2.style.cssText = 'font-size:1.5rem; text-align:center; font-weight:bold; color:blue; margin-top:10px;';
area2.innerHTML = '';
insertAfter(area2, pos1);
let timetId;
let windowStartTime;
var origOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function () {
const dateFormat = (date, format) => {
const _fmt = {
hh: date => { return ('0' + date.getHours()).slice(-2) },
mm: date => { return ('0' + date.getMinutes()).slice(-2) },
ss: date => { return ('0' + date.getSeconds()).slice(-2) },
dd: date => { return ('0' + date.getDate()).slice(-2) },
yyyy: date => { return date.getFullYear() + '' },
MM: date => { return ('0' + (date.getMonth() + 1)).slice(-2) },
};
const _priority = ['dd', 'yyyy', 'MM', 'hh', 'mm', 'ss'];
return _priority.reduce((res, fmt) => res.replace(fmt, _fmt[fmt](date)), format);
};
const getHMS = (total_sec) => {
const hours = Math.floor(total_sec / 60 / 60);
const minutes = Math.floor((total_sec - hours * 60 * 60) / 60);
const seconds = Math.floor(total_sec - (hours * 60 + minutes) * 60);
return [hours, minutes, seconds]
};
this.addEventListener('load', () => {
if (!timetId) {
try {
const res = JSON.parse(this.responseText);
if (res.ticket) {
const { windowStartTimeUTC } = res.ticket;
if (windowStartTimeUTC) {
windowStartTime = new Date(windowStartTimeUTC);
// インターバルタイマー起動(1回だけ)
timetId = setInterval(() => {
const windowStartTimeDetail = document.getElementById('windowStartTimeDetail');
windowStartTimeDetail.innerHTML = `
案内開始時刻: ${dateFormat(windowStartTime, 'hh:mm:ss')}`;
const windowStartTimeRemain = document.getElementById('windowStartTimeRemain');
const now = new Date();
const confirmLimitTime = new Date(windowStartTimeUTC);
confirmLimitTime.setMinutes(confirmLimitTime.getMinutes() + confirmLimitMin);
const remain_sec = (windowStartTime - now + confirmLimitMin * 60 * 1000) / 1000;
const [hours, minutes, seconds] = getHMS(remain_sec);
if (remain_sec >= 0) {
windowStartTimeRemain.innerHTML = `通過期限: ${dateFormat(confirmLimitTime, 'hh:mm:ss')}
(残り: ${minutes}分 ${seconds}秒)`;
} else {
windowStartTimeRemain.style.color = 'red';
windowStartTimeRemain.innerHTML = `通過期限: ${dateFormat(confirmLimitTime, 'hh:mm:ss')}まで
(*** 期限切れ ***)`;
};
}, 1000);
};
};
} catch (err) {
}
};
});
origOpen.apply(this, arguments);
};
alert('実行しました\n(このメッセージは閉じてください)');
})(5);