修复访客在地点详情页看不到「图片」按钮

全屏画廊的地址列表原先只从 #imgs-grid 反推,而那个缩略图墙整块包在
{{if .IsAdmin}} 里——访客页根本没有这个元素,于是 syncGallery() 数到 0 张,
把服务端已经渲染好的「图片 N」按钮 remove 掉(表现成刷新后按钮闪一下就没了)。
站长自己打开一切正常,所以只有按访客身份渲染才看得到。

首版 b327bc1 就有,不是新引入的。

- 新增 PlaceData.ImageURLs:随页面把地址列表发给浏览器,访客页自带数据源。
- cellURLs() 的判据改成「缩略图墙在不在」,而不是「墙里有几张」:
  站长把图删光时墙还在、只是空了,按张数回退会把删掉的图又数回来。
- 新增回归 TestVisitorPlacePageCarriesImageURLs:按访客身份渲染详情页,
  要求页面里有「图片」按钮、且把图片地址发给了浏览器(去掉数据源即失败)。

实测(390 访客,/places/2254 三张图):按钮回归、点开 1/3 → 2/3 → 回绕 3/3 →
关闭正常,第 2 张 1200×900 实际加载;320/390/430 横向溢出均为 0。
This commit is contained in:
tamakyi
2026-09-18 19:42:52 +08:00
parent 002755129d
commit 96e76318ab
4 changed files with 66 additions and 4 deletions
+9 -4
View File
@@ -241,20 +241,25 @@
var admin = document.getElementById('imgs-admin');
/* ---------- 全屏画廊 ----------
* 内容是「缩略图墙的镜像」:传图/删图之后不用刷新页面也能看到最新的,
* 页头那个「图片 N」按钮也一样(服务端渲染时还没有图的话,这里现补一个)。
* 所以下面统一由 syncGallery() 从 grid 反推,而不是各写一套。
* 地址有两个来源:站长页有缩略图墙,传图/删图之后就地在墙上读(它才是实时真相);
* 访客页没有那一整块,只能读服务端随页面发下来的这份。页头那个「图片 N」按钮
* 与画廊共用同一套数据,所以服务端渲染时还没有图的话,这里现补一个。
*/
var stage = document.getElementById('imgs-stage');
var viewImg = document.getElementById('imgs-img');
var counter = document.getElementById('imgs-counter');
var prevBtn = document.getElementById('imgs-prev');
var nextBtn = document.getElementById('imgs-next');
var serverURLs = {{if .ImageURLs}}{{json .ImageURLs}}{{else}}[]{{end}};
var urls = [];
var idx = 0;
// 判据必须是「缩略图墙在不在」,而不是「墙里有几张」:站长把图删光时墙还在、只是空了,
// 这时若按「墙是空的」回退到服务端那份,删掉的图就会被数回来。
function cellURLs() {
return [].map.call(document.querySelectorAll('#imgs-grid .imgs-cell img'), function (i) {
var g = document.getElementById('imgs-grid');
if (!g) return serverURLs;
return [].map.call(g.querySelectorAll('.imgs-cell img'), function (i) {
return i.getAttribute('src');
});
}