信仰指数:修订间差异
来自SOKA CAFE
小 |
小 |
||
第1行: | 第1行: | ||
<html> | <html> | ||
< | <!-- Faith Index (MediaWiki inline, no inline event handlers) --> | ||
<div class="fi-root"> | |||
<div class="faith-index-body"> | |||
<div class="faith-index-container"> | |||
<h1>信仰指数测试</h1> | |||
<p class="subtitle">测测你的信仰有多虔诚</p> | |||
< | |||
<div class="faith-index-body"> | |||
<div class="input-group"> | |||
<label>请输入您的名字:</label> | |||
<input class="fi-input" type="text" placeholder="输入名字..." autocomplete="off"> | |||
</div> | |||
<button type="button" class="fi-btn"> | |||
<span class="fi-btn-text">开始测试</span> | |||
<div class="loader fi-loader" style="display:none;"></div> | |||
</button> | |||
<div class="error fi-error" style="display:none;"></div> | |||
<div class="result fi-result" style="display:none;"> | |||
<h2>测试结果</h2> | |||
<p>姓名: <span class="fi-name"></span></p> | |||
<div class="score fi-score">0%</div> | |||
<div class="meter"><div class="meter-fill fi-meter" style="width:0%"></div></div> | |||
<div class="ranges"><span>0-20</span><span>21-40</span><span>41-60</span><span>61-80</span><span>81-100</span></div> | |||
<div class="comment fi-comment"></div> | |||
<p class="footer">* 本结果为娱乐目的,基于名字的随机计算,每次查询结果相同</p> | |||
</div> | |||
</div> | </div> | ||
</div> | </div> | ||
</div> | </div> | ||
< | <style> | ||
/* ---- styles (scoped by .faith-index-*) ---- */ | |||
.faith-index-body{background:linear-gradient(135deg,#0052a5 0%,#f9e300 50%,#d40000 100%);min-height:90vh;display:flex;justify-content:center;align-items:center;padding:20px;font-family:'Segoe UI','Microsoft YaHei',sans-serif} | |||
.faith-index-container{background:rgba(255,255,255,.25);backdrop-filter:blur(12px);border-radius:20px;padding:40px;width:100%;max-width:500px;box-shadow:0 8px 32px rgba(0,0,0,.1);border:1px solid rgba(255,255,255,.4);text-align:center;margin:0 auto} | |||
.faith-index-container h1{color:#2c3e50;margin-bottom:10px;font-size:2.2rem;font-weight:600} | |||
.faith-index-container .subtitle{color:#34495e;margin-bottom:30px;font-size:1rem} | |||
.faith-index-container .input-group{margin-bottom:25px;text-align:left} | |||
.faith-index-container label{display:block;color:#2c3e50;margin-bottom:8px;font-weight:500} | |||
.faith-index-container input{width:100%;padding:15px;border-radius:12px;border:none;background:rgba(255,255,255,.5);color:#2c3e50;font-size:1rem;transition:all .3s ease;border:1px solid rgba(255,255,255,.5);box-sizing:border-box} | |||
.faith-index-container input:focus{outline:none;background:rgba(255,255,255,.7);box-shadow:0 0 0 3px rgba(44,62,80,.2)} | |||
.faith-index-container button{background:linear-gradient(to right,#34495e,#2c3e50);color:#fff;border:none;padding:15px 30px;border-radius:12px;font-size:1.1rem;font-weight:600;cursor:pointer;transition:all .3s ease;width:100%;margin-top:10px;box-shadow:0 5px 15px rgba(44,62,80,.3);display:flex;justify-content:center;align-items:center;gap:10px} | |||
.faith-index-container button:hover{transform:translateY(-3px);box-shadow:0 8px 20px rgba(44,62,80,.4)} | |||
.faith-index-container button:active{transform:translateY(0)} | |||
.faith-index-container button[disabled]{opacity:.7;cursor:not-allowed;transform:none} | |||
.faith-index-container .loader{width:20px;height:20px;border:2px solid rgba(255,255,255,.3);border-radius:50%;border-top:2px solid #fff;animation:faith-index-spin 1s linear infinite} | |||
@keyframes faith-index-spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}} | |||
.faith-index-container .result{margin-top:30px;padding:25px;border-radius:15px;background:rgba(255,255,255,.3);display:none;animation:faith-index-fadeIn .5s ease} | |||
@keyframes faith-index-fadeIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}} | |||
.faith-index-container .score{font-size:3.5rem;font-weight:800;margin:15px 0;color:#2c3e50} | |||
.faith-index-container .comment{font-size:1.2rem;color:#2c3e50;margin:15px 0;padding:15px;border-radius:10px;background:rgba(255,255,255,.4);text-align:left;line-height:1.5} | |||
.faith-index-container .meter{height:20px;background:rgba(0,0,0,.1);border-radius:10px;margin:20px 0;overflow:hidden} | |||
.faith-index-container .meter-fill{height:100%;border-radius:10px;transition:width 1s ease;background:linear-gradient(to right,#0052a5,#f9e300,#d40000)} | |||
.faith-index-container .ranges{display:flex;justify-content:space-between;margin-top:10px;color:#34495e;font-size:.85rem} | |||
.faith-index-container .footer{margin-top:30px;color:#34495e;font-size:.9rem} | |||
.faith-index-container .error{color:#d9534f;background:rgba(217,83,79,.1);padding:10px;border-radius:8px;margin-top:10px;display:none} | |||
</style> | |||
function calculateFaithIndex( | <script type="text/javascript"> | ||
(function(){ | |||
if ( | // —— 逻辑函数 —— // | ||
for ( | function calculateFaithIndex(name){ | ||
var hash = 0, i, ch; | |||
hash = ((hash << 5) - hash) + | if (!name) return 0; | ||
hash = hash | for (i=0;i<name.length;i++){ | ||
ch = name.charCodeAt(i); | |||
hash = ((hash<<5) - hash) + ch; | |||
hash = hash | 0; | |||
} | } | ||
return Math.abs(hash) % 101; | return Math.abs(hash) % 101; | ||
} | } | ||
function getFaithComment(score){ | |||
function getFaithComment(score) { | |||
if (score <= 20) return "信仰指数较低,信心还需磨练。请多参加活动,加强学习,在广布的道路上继续精进!"; | if (score <= 20) return "信仰指数较低,信心还需磨练。请多参加活动,加强学习,在广布的道路上继续精进!"; | ||
if (score <= 40) return "作为一名初信者,你的信心正在萌芽。坚持每日的实践,你将见证不可思议的功德!"; | if (score <= 40) return "作为一名初信者,你的信心正在萌芽。坚持每日的实践,你将见证不可思议的功德!"; | ||
第237行: | 第80行: | ||
} | } | ||
function showError(msg) { | function bindOne(root){ | ||
if (!root || root.__fiBound) return; | |||
root.__fiBound = true; | |||
var input = root.querySelector('.fi-input'); | |||
var btn = root.querySelector('.fi-btn'); | |||
var btnTxt = root.querySelector('.fi-btn-text'); | |||
var loader = root.querySelector('.fi-loader'); | |||
var result = root.querySelector('.fi-result'); | |||
var error = root.querySelector('.fi-error'); | |||
var nameEl = root.querySelector('.fi-name'); | |||
var scoreEl= root.querySelector('.fi-score'); | |||
var cmtEl = root.querySelector('.fi-comment'); | |||
var meter = root.querySelector('.fi-meter'); | |||
function showError(msg){ if(!error) return; error.textContent=msg; error.style.display='block'; } | |||
function hideError(){ if(error) error.style.display='none'; } | |||
function run(){ | |||
var username = (input && input.value || '').trim(); | |||
if (!username){ | |||
showError('请输入您的名字!'); | |||
if (result) result.style.display = 'none'; | |||
return; | |||
} | |||
hideError(); | |||
if (loader) loader.style.display = 'inline-block'; | |||
if (btnTxt) btnTxt.textContent = '计算中...'; | |||
if (btn) btn.disabled = true; | |||
setTimeout(function(){ | |||
try{ | |||
var score = calculateFaithIndex(username); | |||
if (nameEl) nameEl.textContent = username; | |||
if (scoreEl) scoreEl.textContent = score + '%'; | |||
if (cmtEl) cmtEl.textContent = getFaithComment(score); | |||
if (result) result.style.display = 'block'; | |||
setTimeout(function(){ if (meter) meter.style.width = score + '%'; }, 60); | |||
} finally { | |||
if (loader) loader.style.display = 'none'; | |||
if (btnTxt) btnTxt.textContent = '开始测试'; | |||
if (btn) btn.disabled = false; | |||
} | |||
}, 80); | |||
} | |||
// 事件绑定(不使用 inline handler) | |||
if (btn) btn.addEventListener('click', run); | |||
if (input) input.addEventListener('keydown', function(e){ if (e.key === 'Enter') run(); }); | |||
// 兜底委托:DOM 若被替换,仍可触发 | |||
root.addEventListener('click', function(e){ | |||
var b = e.target.closest && e.target.closest('.fi-btn'); | |||
if (b && root.contains(b)) run(); | |||
}); | |||
} | |||
function bindAll(ctx){ | |||
var scope = ctx || document; | |||
var roots = scope.querySelectorAll ? scope.querySelectorAll('.fi-root') : []; | |||
for (var i=0; i<roots.length; i++) bindOne(roots[i]); | |||
} | } | ||
// 1) 立刻尝试 | |||
bindAll(document); | |||
// 2) 常见时机再尝试 | |||
if (document.readyState === 'complete') { | |||
bindAll(document); | |||
} else { | |||
// DOMContentLoaded / load | |||
document.addEventListener('DOMContentLoaded', function(){ bindAll(document); }); | |||
window.addEventListener('load', function(){ bindAll(document); }); | |||
} | |||
// MediaWiki 的局部刷新 | |||
if (window.mw && mw.hook) { | |||
mw.hook('wikipage.content').add(function($c){ | |||
var node = $c && $c[0] ? $c[0] : document; | |||
bindAll(node); | |||
}); | |||
} | |||
} | } | ||
// 3) 监听 DOM 变化:新加/替换时自动绑定 | |||
try { | |||
}); | var mo = new MutationObserver(function(muts){ | ||
for (var i=0;i<muts.length;i++){ | |||
var m = muts[i]; | |||
if (m.type === 'childList') { | |||
// 直接子节点 | |||
for (var j=0;j<m.addedNodes.length;j++){ | |||
var n = m.addedNodes[j]; | |||
if (!n || n.nodeType !== 1) continue; | |||
if (n.matches && n.matches('.fi-root')) bindOne(n); | |||
if (n.querySelectorAll) bindAll(n); | |||
} | |||
} | |||
} | |||
}); | |||
mo.observe(document.documentElement || document.body, { childList:true, subtree:true }); | |||
} catch(_) {} | |||
})(); | |||
</script> | </script> | ||
</html> | </html> |
2025年10月12日 (日) 16:40的版本
信仰指数测试
测测你的信仰有多虔诚