diff --git a/.zcode/plans/plan-sess_b00c85f4-499c-4183-a5b5-4baf7a69aa0d.md b/.zcode/plans/plan-sess_b00c85f4-499c-4183-a5b5-4baf7a69aa0d.md new file mode 100644 index 00000000..e0bc6f26 --- /dev/null +++ b/.zcode/plans/plan-sess_b00c85f4-499c-4183-a5b5-4baf7a69aa0d.md @@ -0,0 +1,48 @@ +# 修复前台文章卡片无刷新加载出现空位的问题 + +## 根因 + +规范分页控件(`aksrt_render_pagination()` 输出的 `.ajax-pag[data-aksrt-pagination]`,内含 `.next-page.ajax-next`)携带了遗留引擎的触发类 `ajax-next`。全站加载的 `main.min.js` 在 body 上委托监听 `.ajax-next` 点击(另有 IAS 无限滚动路径用 jQuery 模拟点击 `.ajax-next/.ias-btn`),导致每次"加载更多"被两套引擎同时处理: + +1. **规范引擎**(pagination.js):POST `aksrt_load_more_posts`,把卡片正确插入 `.ajax-pag` 之前; +2. **遗留引擎**(main.min.js `post_ajax()`):抓取整页 `?paged=2` HTML,**先删除 `.ajax-pag`**,把占位加载器、重复的一批卡片和一个新的**块级** `.ajax-pag` div 插到最后一张卡之后。 + +卡片网格是 inline-block 布局(`width: calc(33.333% - 16px)`),块级分页 div / 重复批次插入流中会强制换行 → 网格中出现空位(即"隔出一个卡片位置"),且第 2 页内容被加载两次。评论分页(`inc/helpers/template-tags/search-meta.php:533`)已用 `order-ajax-next` + `ias-btn` 避开遗留引擎,文章分页是唯一例外。 + +另经确认:生产环境实际生效的懒加载运行时是 main.min.js 内置版(`assets/js/lazysizes.js` 无任何 enqueue),其 IAS 自动加载走 jQuery 模拟点击,只到得了遗留引擎——所以无限滚动模式目前完全由遗留引擎执行。若只摘掉 `ajax-next` 类而不接管 IAS 触发,无限滚动会失效,因此两处改动必须配套。 + +## 修改内容(4 个文件) + +### 1. `inc/helpers/template-tags/pagination-permissions.php:123` +`.next-page` 包装类的 `ajax-next` → `order-ajax-next ias-btn`: +- 移除遗留引擎的点击触发 token(手动点击与 IAS 模拟点击双双失效于遗留引擎); +- `order-ajax-next` 复用现有按钮样式 `.theme-pagination .order-ajax-next a`(main.css:9659+),**零 CSS 改动**; +- `ias-btn` 保持 main.min.js 的 IAS 匹配器仍能找到元素(其后续 jQuery 点击成为无害空操作),且 pagination.js 的 clickTarget 选择器 `.next-page.ajax-next, .ias-btn` 原生支持,**零 JS 选择器改动**; +- 与评论分页的既有模式完全一致。 + +### 2. `assets/js/core/pagination.js` +在点击绑定块后新增容器级 `lazybeforeunveil` 监听(仅当服务端输出了 `lazyload` 契约类时挂载):unveil 事件由 main.min.js 内置 lazySizes 原生派发(可冒泡),监听到后设置 `lazyAuto` 并原生 `click()`,把无限滚动自动加载**收归规范引擎**的既有点击管线(复用 loading 守卫、iasMax 上限、按钮状态机): +```js +if (container.classList.contains("lazyload") || clickTarget.classList.contains("lazyload")) { + container.addEventListener("lazybeforeunveil", function (e) { + if (e.target !== container && e.target !== clickTarget) return; + clickTarget.dataset.lazyAuto = "1"; + clickTarget.click(); + }); +} +``` +附带修复:评论分页的 IAS 自动加载此前同样到不了规范引擎(jQuery 模拟点击不可见),此监听一并接管。 + +### 3. `search.php:112-118` — 消除双层包裹 +去掉外层冗余 `