微件

TierListMaker:修订间差异

来自卡厄思梦境WIKI

律Rhyme留言 | 贡献
无编辑摘要
律Rhyme留言 | 贡献
无编辑摘要
 
(未显示同一用户的11个中间版本)
第1行: 第1行:
<includeonly>
<includeonly>
<style>
<style>
.avatar-frame {
.tierlist-controls {
    position: relative;
  display: flex;
    display: inline-block;
  gap: 8px;
    vertical-align: top;
  margin: 8px 0 12px 0;
    border: 3px solid #ccc;
    border-radius: 5px;
    overflow: hidden;
    box-shadow: 0 2px 5px rgba(0,0,0,0.1);
    background: #f5f5f5;
    transition: transform 0.3s ease, box-shadow 0.3s ease;
    cursor: move;
    margin: 2px;
}
}
.avatar-frame:hover {
.btn {
    transform: scale(1.05);
  display: inline-block;
    box-shadow: 0 4px 8px rgba(0,0,0,0.2);
  padding: 6px 12px;
    z-index: 10;
  background: #f0f0f0;
  border: 1px solid #ccc;
  color: #333;
  border-radius: 4px;
  cursor: pointer;
  user-select: none;
}
}
.avatar-frame.dragging {
.btn:hover { background: #e6e6e6; }
    opacity: 0.5;
.btn.primary { background: #4a8cf6; color: #fff; border-color: #3b78de; }
.btn.primary:hover { background: #3b78de; }
.tierlist-table {
  width: 100%;
  table-layout: fixed;
}
}
.avatar-frame img {
.tier-row .tier-head {
    display: block;
  position: relative;
    width: 100px;
  width: 120px;
    height: 100px;
  color: #fff;
    object-fit: cover;
  text-align: center;
    pointer-events: none;
  font-size: 18px;
  font-weight: bold;
  padding: 8px;
  white-space: nowrap;
  border: 1px solid #ccc;
  background: #555;
}
}
.avatar-name {
.tier-row .tier-cell {
    position: absolute;
  border: 1px solid #ccc;
    left: 0;
  padding: 0px;
    bottom: 0;
    padding: 2px 8px;
    color: white;
    font-size: 12px;
    font-weight: bold;
    text-shadow: 0 0 2px black, 0 0 2px black;
    white-space: nowrap;
    max-width: 100%;
    overflow: hidden;
    text-overflow: ellipsis;
    border-top-right-radius: 3px;
    pointer-events: none;
}
}
.tier-content {
.tier-tools {
    min-height: 120px;
  position: absolute;
    transition: background-color 0.3s;
  right: 6px;
  top: 6px;
  display: flex;
  gap: 6px;
}
}
.tier-content.drag-over {
/* 导出时隐藏工具按钮 */
    background-color: #e3f2fd !important;
.exporting .tier-tools {
    border: 2px dashed #2196F3;
  display: none !important;
}
}
.tier-header {
.color-toggle {
    position: relative;
  width: 18px;
    user-select: none;
  height: 18px;
  border-radius: 3px;
  border: 1px solid rgba(0,0,0,0.2);
  cursor: pointer;
  background: rgba(255,255,255,0.6);
}
}
.tier-label {
.delete-row {
    display: inline-block;
  font-size: 12px;
    padding: 5px;
  padding: 2px 6px;
  border-radius: 3px;
  background: rgba(0,0,0,0.1);
  cursor: pointer;
}
}
.tier-label:focus {
.delete-row:hover { background: rgba(0,0,0,0.2); }
    outline: 2px solid white;
.tier-dropzone {
    outline-offset: -2px;
  min-height: 112px;
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  align-items: flex-start;
  padding: 4px;
}
}
.color-picker-trigger {
.tier-dropzone.pool {
    position: absolute;
  border: 2px dashed #ccc;
    top: 5px;
  padding: 8px;
    right: 5px;
  border-radius: 6px;
    font-size: 16px;
  background: #fafafa;
    cursor: pointer;
    opacity: 0.7;
    transition: opacity 0.3s;
}
}
.color-picker-trigger:hover {
/* 导出时隐藏角色池 */
    opacity: 1;
.exporting .pool-wrapper {
  display: none !important;
}
}
.control-button:hover {
.pool-wrapper { margin-top: 12px; }
    opacity: 0.9;
.pool-header {
    transform: translateY(-1px);
  font-weight: bold;
  margin-bottom: 6px;
}
}
.control-button:active {
.avatar-frame {
    transform: translateY(0);
  position: relative;
  display: inline-block;
  vertical-align: top;
  border: 3px solid #ccc;
  border-radius: 5px;
  overflow: hidden;
  box-shadow: 0 2px 5px rgba(0,0,0,0.1);
  background: #f5f5f5;
  transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
  cursor: move;
}
}
#tierlist-table {
.avatar-frame.dragging {
    border: 2px solid #ddd;
  opacity: 0.7;
  transform: scale(1.03);
  border-color: #4a8cf6;
  z-index: 10;
}
}
.tier-remove-btn {
.avatar-frame img {
    position: absolute;
  display: block;
    top: 5px;
  width: 100px;
    left: 5px;
  height: 100px;
    background: #f44336;
  object-fit: cover;
    color: white;
  pointer-events: none;
    border-radius: 3px;
  -webkit-user-drag: none;
    padding: 2px 6px;
    font-size: 12px;
    cursor: pointer;
    opacity: 0.7;
}
}
.tier-remove-btn:hover {
.avatar-name {
    opacity: 1;
  position: absolute;
  left: 0;
  bottom: 0;
  padding: 2px 8px;
  color: white;
  font-size: 12px;
  font-weight: bold;
  text-shadow: 0 0 2px black, 0 0 2px black;
  white-space: nowrap;
  max-width: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
  border-top-right-radius: 3px;
}
.color-palette {
  position: absolute;
  display: none;
  gap: 6px;
  flex-wrap: wrap;
  width: 210px;
  padding: 8px;
  background: #fff;
  border: 1px solid #ccc;
  box-shadow: 0 2px 8px rgba(0,0,0,0.15);
  border-radius: 6px;
  z-index: 9999;
}
.color-swatch {
  width: 24px; height: 24px;
  border-radius: 4px;
  border: 1px solid rgba(0,0,0,0.2);
  cursor: pointer;
}
.color-swatch:hover { outline: 2px solid rgba(0,0,0,0.2); }
.tier-label {
  display: inline-block;
  padding: 2px 6px;
  border-radius: 3px;
  background: rgba(255,255,255,0.15);
}
.tier-label[contenteditable="true"] {
  outline: none;
  cursor: text;
}
}
</style>
</style>


<script>
(function() {
  function ready(fn) {
    if (document.readyState !== 'loading') fn();
    else document.addEventListener('DOMContentLoaded', fn);
  }
  function contrastColor(hex) {
    hex = (hex || '').replace('#','');
    if (hex.length === 3) hex = hex.split('').map(c => c + c).join('');
    if (!/^[0-9a-fA-F]{6}$/.test(hex)) return '#fff';
    var r = parseInt(hex.substr(0,2), 16);
    var g = parseInt(hex.substr(2,2), 16);
    var b = parseInt(hex.substr(4,2), 16);
    var yiq = ((r*299)+(g*587)+(b*114))/1000;
    return yiq >= 128 ? '#000' : '#fff';
  }
  function getDragAfterElement(container, y) {
    const elements = [...container.querySelectorAll('.avatar-frame:not(.dragging)')];
    return elements.reduce((closest, child) => {
      const box = child.getBoundingClientRect();
      const offset = y - box.top - box.height/2;
      if (offset < 0 && offset > closest.offset) {
        return { offset: offset, element: child };
      } else {
        return closest;
      }
    }, { offset: Number.NEGATIVE_INFINITY, element: null }).element;
  }
  function ensureCrossOrigin(img) {
    try {
      if (!img) return;
      if (!img.crossOrigin) img.crossOrigin = 'anonymous';
      if (!img.referrerPolicy) img.referrerPolicy = 'no-referrer';
    } catch(e) {}
  }
  function makeDraggable(avatar) {
    if (!avatar || avatar._draggableInit) return;
    avatar._draggableInit = true;
    avatar.setAttribute('draggable', 'true');
    avatar.classList.add('draggable-avatar');
    avatar.querySelectorAll('img').forEach(ensureCrossOrigin);


<script>
    avatar.addEventListener('dragstart', function(e) {
let draggedElement = null;
      avatar.classList.add('dragging');
let currentEditingTier = null;
      avatar._prevParent = avatar.parentNode;
// 初始化拖拽功能
      e.dataTransfer.setData('text/plain', avatar.dataset.id || avatar.querySelector('.avatar-name')?.textContent || '');
function initDragAndDrop() {
      e.dataTransfer.effectAllowed = 'move';
    const avatars = document.querySelectorAll('.avatar-frame');
    });
    const tierContents = document.querySelectorAll('.tier-content');
    avatar.addEventListener('dragend', function() {
   
      avatar.classList.remove('dragging');
    avatars.forEach(avatar => {
      cleanupEmptyWrapper(avatar._prevParent);
        avatar.setAttribute('draggable', 'true');
      avatar._prevParent = null;
       
        avatar.addEventListener('dragstart', function(e) {
            draggedElement = this;
            this.classList.add('dragging');
            e.dataTransfer.effectAllowed = 'move';
            e.dataTransfer.setData('text/html', this.outerHTML);
        });
       
        avatar.addEventListener('dragend', function(e) {
            this.classList.remove('dragging');
        });
     });
     });
   
  }
    tierContents.forEach(content => {
  function initAvatars(root) {
        content.addEventListener('dragover', function(e) {
    if (!root) return;
            e.preventDefault();
    const avatars = root.querySelectorAll('.avatar-frame');
            e.dataTransfer.dropEffect = 'move';
    avatars.forEach(function(av) {
            this.classList.add('drag-over');
      if (!av.dataset.id) {
        });
        const nameEl = av.querySelector('.avatar-name');
       
         av.dataset.name = nameEl ? nameEl.textContent.trim() : '';
        content.addEventListener('dragleave', function(e) {
      }
            this.classList.remove('drag-over');
      makeDraggable(av);
         });
       
        content.addEventListener('drop', function(e) {
            e.preventDefault();
            this.classList.remove('drag-over');
           
            if (draggedElement) {
                this.appendChild(draggedElement);
                draggedElement = null;
            }
        });
     });
     });
}
  }
// 添加新行
  function cleanupEmptyWrapper(node) {
function addNewTier() {
     if (!node || node.nodeType !== 1) return;
     const table = document.getElementById('tierlist-table');
     if (node.classList && node.classList.contains('tier-dropzone')) return;
     const tbody = table.querySelector('tbody');
     const hasElementChild = node.querySelector('.avatar-frame');
     const tierCount = document.querySelectorAll('.tier-header').length;
     const onlyWhitespace = !node.textContent || node.textContent.trim().length === 0;
   
     if (!hasElementChild && node.childElementCount === 0 && onlyWhitespace) {
     const newRow = tbody.insertRow(-1);
      node.parentNode && node.parentNode.removeChild(node);
   
    const headerCell = newRow.insertCell(0);
    headerCell.className = 'tier-header';
    headerCell.setAttribute('data-tier', tierCount);
    headerCell.style = 'width: 100px; background-color: #9e9e9e; color: white; font-size: 20px; text-align: center; cursor: pointer; position: relative;';
    headerCell.innerHTML = '<div class="tier-label" contenteditable="true">新行</div><div class="color-picker-trigger" onclick="showColorPicker(this, ' + tierCount + ')">🎨</div><div class="tier-remove-btn" onclick="removeTier(this)">删除</div>';
      
    const contentCell = newRow.insertCell(1);
    contentCell.className = 'tier-content';
    contentCell.setAttribute('data-tier', tierCount);
    contentCell.style = 'min-height: 120px; padding: 10px; background: #fff;';
   
    initDragAndDrop();
}
// 删除行
function removeTier(btn) {
    if (confirm('确定要删除这一行吗?')) {
        const row = btn.closest('tr');
        row.remove();
     }
     }
}
  }
// 显示颜色选择器
  function cleanupEmptyPlaceholdersIn(container) {
function showColorPicker(trigger, tier) {
    if (!container) return;
     event.stopPropagation();
    Array.from(container.children).forEach(function(child) {
     currentEditingTier = tier;
      if (child.nodeType !== 1) return;
      
      if (child.classList.contains('avatar-frame')) return;
     const header = document.querySelector('.tier-header[data-tier="' + tier + '"]');
      const hasAvatarInside = !!child.querySelector('.avatar-frame');
     const bgColor = rgbToHex(header.style.backgroundColor);
      const onlyWhitespace = !child.textContent || child.textContent.trim().length === 0;
     const textColor = rgbToHex(header.style.color);
      if (!hasAvatarInside && child.childElementCount === 0 && onlyWhitespace) {
      
        child.remove();
     document.getElementById('bg-color-picker').value = bgColor;
      }
     document.getElementById('text-color-picker').value = textColor;
    });
     document.getElementById('color-picker-modal').style.display = 'block';
  }
    document.getElementById('modal-overlay').style.display = 'block';
  function initDropzone(zone) {
}
     if (!zone || zone._dropzoneInit) return;
// 应用颜色
     zone._dropzoneInit = true;
function applyColor() {
 
     if (currentEditingTier !== null) {
     zone.addEventListener('dragover', function(e) {
        const bgColor = document.getElementById('bg-color-picker').value;
      e.preventDefault();
        const textColor = document.getElementById('text-color-picker').value;
      e.dataTransfer.dropEffect = 'move';
         const header = document.querySelector('.tier-header[data-tier="' + currentEditingTier + '"]');
      const afterElement = getDragAfterElement(zone, e.clientY);
       
      const dragging = document.querySelector('.avatar-frame.dragging');
        header.style.backgroundColor = bgColor;
      if (!dragging) return;
        header.style.color = textColor;
      if (afterElement == null) {
        if (dragging.parentNode !== zone) zone.appendChild(dragging);
      } else {
        if (afterElement !== dragging) zone.insertBefore(dragging, afterElement);
      }
     });
 
    zone.addEventListener('drop', function(e) {
      e.preventDefault();
      e.stopPropagation();
      const dragging = document.querySelector('.avatar-frame.dragging');
      if (dragging) {
        if (dragging.parentNode !== zone) zone.appendChild(dragging);
        cleanupEmptyWrapper(dragging._prevParent);
        dragging._prevParent = null;
      }
      if (zone.classList.contains('pool')) {
        cleanupEmptyPlaceholdersIn(zone);
      }
    });
  }
  function buildEditableHead(th) {
    const currentText = (th.childNodes[0] && th.childNodes[0].nodeType === 3)
      ? th.childNodes[0].nodeValue.trim()
      : th.textContent.trim();
     const tools = th.querySelector('.tier-tools');
    th.innerHTML = '';
     const label = document.createElement('div');
    label.className = 'tier-label';
    label.setAttribute('contenteditable', 'true');
     label.textContent = currentText || '未命名';
     const toolsWrap = tools || (function() {
      const t = document.createElement('div');
      t.className = 'tier-tools';
      const color = document.createElement('div');
      color.className = 'color-toggle';
      color.title = '更改颜色';
      const del = document.createElement('div');
      del.className = 'delete-row';
      del.textContent = '删除';
      del.title = '删除该行';
      t.appendChild(color); t.appendChild(del);
      return t;
     })();
    th.appendChild(label);
    th.appendChild(toolsWrap);
    const initialBg = th.getAttribute('data-initial-bg') || '#555';
    th.style.background = initialBg;
    th.style.color = contrastColor(initialBg);
     attachColorPalette(toolsWrap.querySelector('.color-toggle'), th);
    const delBtn = toolsWrap.querySelector('.delete-row');
    delBtn.addEventListener('click', function() {
      const tr = th.closest('tr');
      const dropzone = tr.querySelector('.tier-dropzone');
      const pool = document.getElementById('character-pool');
      Array.from(dropzone.querySelectorAll('.avatar-frame')).forEach(function(av) {
        pool.appendChild(av);
      });
      tr.parentNode.removeChild(tr);
    });
  }
  function attachColorPalette(toggle, th) {
     if (!toggle) return;
    const palette = document.createElement('div');
    palette.className = 'color-palette';
    const colors = [
      '#e53935','#d81b60','#8e24aa','#5e35b1','#3949ab','#1e88e5','#039be5','#00acc1',
      '#00897b','#43a047','#7cb342','#c0ca33','#fdd835','#fb8c00','#f4511e','#6d4c41',
      '#546e7a','#9e9e9e','#000000','#ffffff'
    ];
    colors.forEach(function(c) {
      const sw = document.createElement('div');
      sw.className = 'color-swatch';
      sw.style.background = c;
      sw.addEventListener('click', function() {
        th.style.background = c;
         th.style.color = contrastColor(c);
        palette.style.display = 'none';
      });
      palette.appendChild(sw);
    });
    document.body.appendChild(palette);
    function placePalette() {
      const rect = toggle.getBoundingClientRect();
      palette.style.left = (window.scrollX + rect.left) + 'px';
      palette.style.top  = (window.scrollY + rect.bottom + 6) + 'px';
     }
     }
     closeColorPicker();
     toggle.addEventListener('click', function(e) {
}
      e.stopPropagation();
// 关闭颜色选择器
      if (palette.style.display === 'block') {
function closeColorPicker() {
        palette.style.display = 'none';
    document.getElementById('color-picker-modal').style.display = 'none';
      } else {
    document.getElementById('modal-overlay').style.display = 'none';
        placePalette();
     currentEditingTier = null;
        palette.style.display = 'block';
}
      }
// RGB转HEX
     });
function rgbToHex(rgb) {
    document.addEventListener('click', function(e) {
    if (!rgb || rgb.indexOf('rgb') === -1) return '#000000';
      if (e.target === toggle || palette.contains(e.target)) return;
      
      palette.style.display = 'none';
     const values = rgb.match(/\d+/g);
     });
    if (!values) return '#000000';
     window.addEventListener('scroll', function() {
      
      if (palette.style.display === 'block') placePalette();
     const hex = values.map(x => {
     });
        const hexValue = parseInt(x).toString(16);
     window.addEventListener('resize', function() {
        return hexValue.length === 1 ? '0' + hexValue : hexValue;
      if (palette.style.display === 'block') placePalette();
     });
     });
  }
  function addNewRow() {
    const tbody = document.querySelector('#tierlist-table tbody') || document.querySelector('#tierlist-table');
    const tr = document.createElement('tr');
    tr.className = 'tier-row';
    const th = document.createElement('th');
    th.className = 'tier-head';
    th.setAttribute('data-initial-bg', '#8888ff');
    th.textContent = '新行';
    const td = document.createElement('td');
    td.className = 'tier-cell';
    const dz = document.createElement('div');
    dz.className = 'tier-dropzone';
    dz.setAttribute('data-tier', 'CUSTOM');
    td.appendChild(dz);
    tr.appendChild(th);
    tr.appendChild(td);
    tbody.appendChild(tr);
    initDropzone(dz);
    buildEditableHead(th);
  }
  function ensureHtml2Canvas(cb) {
    if (window.html2canvas) { cb(); return; }
    var s = document.createElement('script');
    s.src = 'https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js';
    s.onload = cb;
    s.onerror = function() {
      alert('加载截图库失败,请检查网络或跨域策略。');
    };
    document.body.appendChild(s);
  }
  function downloadCanvas(canvas) {
    function done(blobOrUrl) {
      try {
        const link = document.createElement('a');
        const isBlob = blobOrUrl instanceof Blob;
        const url = isBlob ? (URL.createObjectURL(blobOrUrl)) : blobOrUrl;
        link.href = url;
        link.download = 'tierlist.png';
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
        if (isBlob) setTimeout(() => URL.revokeObjectURL(url), 0);
      } catch (e) {
        const dataUrl = canvas.toDataURL('image/png');
        window.open(dataUrl, '_blank');
      }
    }
    if (canvas.toBlob) {
      canvas.toBlob(function(blob) {
        if (blob) done(blob);
        else done(canvas.toDataURL('image/png'));
      }, 'image/png');
    } else {
      done(canvas.toDataURL('image/png'));
    }
  }
  function prepareImagesForExport(container) {
    if (!container) return;
    container.querySelectorAll('img').forEach(ensureCrossOrigin);
  }
  function savePNG() {
    const maker = document.getElementById('tierlist-maker');
    const table = document.getElementById('tierlist-table');
    if (!table) {
      alert('未找到要导出的表格。');
      return;
    }
      
      
     return '#' + hex.join('');
     // 添加导出样式类
}
    maker.classList.add('exporting');
// 导出为PNG
     prepareImagesForExport(table);
function exportToPNG() {
     const container = document.getElementById('tier-list-container');
      
      
     // 使用html2canvas库
     ensureHtml2Canvas(function() {
    if (typeof html2canvas === 'undefined') {
      // 稍微延迟以确保CSS生效
        // 动态加载html2canvas
      setTimeout(function() {
        const script = document.createElement('script');
         html2canvas(table, {
        script.src = 'https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js';
          backgroundColor: '#ffffff',
        script.onload = function() {
          scale: 2,
            captureAndDownload(container);
          useCORS: true,
        };
          allowTaint: false,
         document.head.appendChild(script);
          imageTimeout: 15000
    } else {
        }).then(function(canvas) {
        captureAndDownload(container);
          downloadCanvas(canvas);
    }
         }).catch(function(err) {
}
          console.error('html2canvas 失败', err);
function captureAndDownload(container) {
          alert('保存PNG失败:' + (err && err.message ? err.message : '未知错误'));
    html2canvas(container, {
        }).finally(function() {
        backgroundColor: '#ffffff',
          maker.classList.remove('exporting');
        scale: 2,
        logging: false,
        useCORS: true
    }).then(canvas => {
         canvas.toBlob(function(blob) {
            const url = URL.createObjectURL(blob);
            const a = document.createElement('a');
            a.href = url;
            a.download = 'tier-list-' + new Date().getTime() + '.png';
            a.click();
            URL.revokeObjectURL(url);
         });
         });
      }, 100);
    });
  }
  function resetAll() {
    const pool = document.getElementById('character-pool');
    if (!pool) return;
    const rows = document.querySelectorAll('#tierlist-table .tier-dropzone');
    rows.forEach(function(zone) {
      if (zone.classList.contains('pool')) return;
      Array.from(zone.querySelectorAll('.avatar-frame')).forEach(function(av) {
        pool.appendChild(av);
      });
      cleanupEmptyPlaceholdersIn(zone);
     });
     });
}
    cleanupEmptyPlaceholdersIn(pool);
// 页面加载完成后初始化
  }
if (document.readyState === 'loading') {
 
    document.addEventListener('DOMContentLoaded', initDragAndDrop);
  ready(function() {
} else {
    document.querySelectorAll('#tierlist-table .tier-head').forEach(buildEditableHead);
     initDragAndDrop();
    document.querySelectorAll('.tier-dropzone').forEach(initDropzone);
}
    initAvatars(document.getElementById('character-pool'));
// 监听动态添加的元素
 
const observer = new MutationObserver(function(mutations) {
    var addBtn = document.getElementById('add-row');
    initDragAndDrop();
    if (addBtn) addBtn.addEventListener('click', addNewRow);
});
    var saveBtn = document.getElementById('save-png');
observer.observe(document.body, {
    if (saveBtn) saveBtn.addEventListener('click', savePNG);
    childList: true,
 
    subtree: true
    (function insertResetButton() {
});
      const controls = document.querySelector('#tierlist-maker .tierlist-controls');
      if (!controls || document.getElementById('reset-roles')) return;
      const resetBtn = document.createElement('div');
      resetBtn.id = 'reset-roles';
      resetBtn.className = 'btn';
      resetBtn.textContent = '重置';
      controls.insertBefore(resetBtn, controls.querySelector('#save-png') || null);
      resetBtn.addEventListener('click', resetAll);
    })();
 
     const pool = document.getElementById('character-pool');
    if (pool) {
      const obs = new MutationObserver(function(muts) {
        muts.forEach(function(m) {
          if (m.addedNodes && m.addedNodes.length) {
            m.addedNodes.forEach(function(n) {
              if (n.nodeType === 1) {
                if (n.classList.contains('avatar-frame')) {
                  makeDraggable(n);
                }
                n.querySelectorAll && n.querySelectorAll('.avatar-frame').forEach(makeDraggable);
                if (pool.contains(n)) cleanupEmptyPlaceholdersIn(pool);
              }
            });
          }
        });
      });
      obs.observe(pool, { childList: true, subtree: true });
    }
  });
})();
</script>
</script>
</includeonly>
</includeonly>

2025年10月29日 (三) 14:50的最新版本