95 lines
4.0 KiB
PHP
95 lines
4.0 KiB
PHP
@once
|
||
@push('scripts')
|
||
<script>
|
||
(function () {
|
||
if (window.__onebotPdfPreviewInit) { return; }
|
||
window.__onebotPdfPreviewInit = true;
|
||
|
||
// 注入弹窗样式(内联,不依赖前端构建)
|
||
var css = ''
|
||
+ '.ob-pdf-overlay{position:fixed;inset:0;background:rgba(15,23,42,0.66);z-index:99990;display:flex;align-items:center;justify-content:center;padding:24px;animation:obPdfFade .15s ease;}'
|
||
+ '.ob-pdf-modal{position:relative;width:min(1100px,96vw);height:min(820px,92vh);background:#fff;border-radius:10px;box-shadow:0 20px 60px rgba(0,0,0,0.4);display:flex;flex-direction:column;overflow:hidden;}'
|
||
+ '.ob-pdf-header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 14px;border-bottom:1px solid #e5e7eb;background:#f8fafc;}'
|
||
+ '.ob-pdf-title{font-size:14px;font-weight:600;color:#0f172a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}'
|
||
+ '.ob-pdf-close{flex:none;width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius:6px;cursor:pointer;color:#475569;font-size:18px;line-height:1;text-decoration:none;}'
|
||
+ '.ob-pdf-close:hover{background:#e2e8f0;color:#0f172a;}'
|
||
+ '.ob-pdf-frame{flex:1;width:100%;border:0;background:#fff;}'
|
||
+ '@keyframes obPdfFade{from{opacity:0;}to{opacity:1;}}';
|
||
var styleEl = document.createElement('style');
|
||
styleEl.textContent = css;
|
||
document.head.appendChild(styleEl);
|
||
|
||
function param(name, url) {
|
||
var m = new RegExp('[?&]' + name + '=([^&]*)').exec(url || '');
|
||
return m ? decodeURIComponent(m[1]) : '';
|
||
}
|
||
|
||
function openPdf(url, title) {
|
||
var overlay = document.createElement('div');
|
||
overlay.className = 'ob-pdf-overlay';
|
||
|
||
var modal = document.createElement('div');
|
||
modal.className = 'ob-pdf-modal';
|
||
|
||
var header = document.createElement('div');
|
||
header.className = 'ob-pdf-header';
|
||
var t = document.createElement('span');
|
||
t.className = 'ob-pdf-title';
|
||
t.textContent = title || 'PDF';
|
||
var close = document.createElement('a');
|
||
close.className = 'ob-pdf-close';
|
||
close.setAttribute('role', 'button');
|
||
close.setAttribute('aria-label', 'Close');
|
||
close.innerHTML = '<i class="fa-solid fa-xmark"></i>';
|
||
header.appendChild(t);
|
||
header.appendChild(close);
|
||
|
||
var frame = document.createElement('iframe');
|
||
frame.className = 'ob-pdf-frame';
|
||
frame.setAttribute('src', url);
|
||
frame.setAttribute('title', title || 'PDF');
|
||
|
||
modal.appendChild(header);
|
||
modal.appendChild(frame);
|
||
overlay.appendChild(modal);
|
||
document.body.appendChild(overlay);
|
||
|
||
function closeModal() {
|
||
overlay.remove();
|
||
document.removeEventListener('keydown', onKey);
|
||
}
|
||
function onKey(e) {
|
||
if (e.key === 'Escape') { closeModal(); }
|
||
}
|
||
overlay.addEventListener('click', function (e) {
|
||
if (e.target === overlay) { closeModal(); }
|
||
});
|
||
close.addEventListener('click', closeModal);
|
||
document.addEventListener('keydown', onKey);
|
||
}
|
||
|
||
// capture 阶段拦截,确保先于 nyroModal/colorbox 等其它绑定执行
|
||
document.addEventListener('click', function (e) {
|
||
var a = e.target && e.target.closest ? e.target.closest('a[href*="files/get"]') : null;
|
||
if (!a) { return; }
|
||
var href = a.getAttribute('href') || '';
|
||
if (!/[?&]ext=pdf/i.test(href)) { return; }
|
||
|
||
e.preventDefault();
|
||
e.stopImmediatePropagation();
|
||
e.stopPropagation();
|
||
|
||
var title = a.getAttribute('title')
|
||
|| param('realName', href)
|
||
|| (a.querySelector('.filename') ? a.querySelector('.filename').textContent.trim() : '')
|
||
|| 'PDF';
|
||
openPdf(href, title);
|
||
}, true);
|
||
|
||
// 暴露给其它模块(如 BOM 附件点击预览 PDF)复用
|
||
window.__onebotOpenPdf = openPdf;
|
||
})();
|
||
</script>
|
||
@endpush
|
||
@endonce
|