/** * Ubui 广告运行时 v1.0(2026-10-23) * 全站共用一份:任何页面只需放
* header/footer 两个全站通用位无需页面预埋,本运行时自动补位。 * * 行为约定: * - 一次请求聚合所有位置(GET /api/public/ads?slots=...) * - 懒加载:滚到可视区才注入(header 首屏位立即注入) * - 静默失败:API 挂/代码错 → 容器隐藏,绝不影响页面功能 * - 合规:每个容器带「广告」标识;容器与上下内容 ≥24px 间距 * - 隐私:请求不带任何用户信息 */ (function () { 'use strict'; if (window.UbuiAds && window.UbuiAds.__loaded) return; var AUTO_SLOTS = { header: { minH: 90, pos: 'top' }, footer: { minH: 60, pos: 'bottom' } }; var PRELAID_MIN_H = { 'download-result': 100, sidebar: 250, 'inpage-1': 120 }; var API = '/api/public/ads'; var AD_CSS = '.ubui-ad{position:relative;max-width:1080px;margin:24px auto;padding:0 14px;box-sizing:border-box;clear:both}' + '.ubui-ad[style*="display: none"]{display:none!important}' + '.ubui-ad-inner{min-height:inherit}' + '.ubui-ad-inner img{max-width:100%;height:auto}' + '.ubui-ad-tag{position:absolute;top:2px;left:16px;font-size:10px;line-height:1;color:#9aa0ab;background:rgba(255,255,255,.85);border:1px solid rgba(0,0,0,.06);border-radius:4px;padding:2px 5px;pointer-events:none;user-select:none}' + '.ubui-ad-on{animation:ubuiAdIn .25s ease}' + '@keyframes ubuiAdIn{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}' + '@media(max-width:820px){.ubui-ad{margin:18px auto}}'; function ensureStyles() { if (document.getElementById('ubui-ads-css')) return; var s = document.createElement('style'); s.id = 'ubui-ads-css'; s.textContent = AD_CSS; (document.head || document.documentElement).appendChild(s); } function injectScripts(container) { // innerHTML 不会执行