2026-09-21 12:56:30 +08:00
|
|
|
// ============================================
|
|
|
|
|
// 文件: js/main.js
|
|
|
|
|
// 说明: 全站公共脚本。add.php 与 edit.php 的「一起看的人 / 电影院」
|
|
|
|
|
// 表单联动逻辑集中在此,避免两个页面各写一份。
|
|
|
|
|
// ============================================
|
|
|
|
|
|
2026-09-21 08:20:56 +08:00
|
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
|
|
|
console.log('🎬 电影日志系统已加载');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
function formatDate(dateStr) {
|
|
|
|
|
if (!dateStr) return '';
|
|
|
|
|
const d = new Date(dateStr);
|
|
|
|
|
return d.getFullYear() + '年' +
|
|
|
|
|
String(d.getMonth() + 1).padStart(2, '0') + '月' +
|
|
|
|
|
String(d.getDate()).padStart(2, '0') + '日';
|
2026-09-21 12:56:30 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ---------- 一起看的人 ----------
|
|
|
|
|
|
|
|
|
|
// 下拉框切到「新增」时显示姓名输入框
|
|
|
|
|
function toggleNewViewer(select) {
|
|
|
|
|
var parent = select.parentElement;
|
|
|
|
|
var input = parent.querySelector('input[name="viewers_new[]"]');
|
|
|
|
|
if (select.value === 'new') {
|
|
|
|
|
input.style.display = 'block';
|
|
|
|
|
input.required = true;
|
|
|
|
|
} else {
|
|
|
|
|
input.style.display = 'none';
|
|
|
|
|
input.required = false;
|
|
|
|
|
input.value = '';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 删除一行观影人(至少保留一行)
|
|
|
|
|
function removeViewerRow(btn) {
|
|
|
|
|
var container = document.getElementById('viewerContainer');
|
|
|
|
|
if (container.children.length > 1) {
|
|
|
|
|
btn.parentElement.remove();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ---------- 电影院 ----------
|
|
|
|
|
|
|
|
|
|
// 下拉框切到「新建电影院」时显示新建表单
|
|
|
|
|
function toggleNewCinema() {
|
|
|
|
|
var select = document.getElementById('cinemaSelect');
|
|
|
|
|
var group = document.getElementById('newCinemaGroup');
|
|
|
|
|
group.style.display = select.value === 'new' ? 'block' : 'none';
|
|
|
|
|
}
|
2026-09-21 22:06:02 +08:00
|
|
|
|
|
|
|
|
// ---------- 图片破图回退 ----------
|
|
|
|
|
|
|
|
|
|
// 服务端代理模式下,图片需要登录才能读取(media.php 未登录返回 403)。
|
|
|
|
|
// 会话过期后页面上的图片会加载失败——统一替换为内联占位图,避免满屏破图。
|
|
|
|
|
// 注意:error 事件不冒泡,必须用捕获阶段监听;占位图用 data URI,不依赖任何文件。
|
|
|
|
|
(function () {
|
|
|
|
|
var PLACEHOLDER = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(
|
|
|
|
|
'<svg xmlns="http://www.w3.org/2000/svg" width="160" height="200">' +
|
|
|
|
|
'<rect width="100%" height="100%" fill="#eceef2"/>' +
|
|
|
|
|
'<text x="50%" y="50%" font-size="13" fill="#9aa0a6" text-anchor="middle" ' +
|
|
|
|
|
'dominant-baseline="middle">图片不可用</text></svg>');
|
|
|
|
|
|
|
|
|
|
document.addEventListener('error', function (e) {
|
|
|
|
|
var el = e.target;
|
|
|
|
|
if (!el || el.tagName !== 'IMG') return;
|
|
|
|
|
if (el.dataset.fallbackApplied === '1') return; // 防死循环
|
|
|
|
|
el.dataset.fallbackApplied = '1';
|
|
|
|
|
el.src = PLACEHOLDER;
|
|
|
|
|
}, true);
|
|
|
|
|
})();
|