模板:Encounter.js
来自Limbo Wiki Mirror
/**
* 万隙之墟 - 奇遇节点交互脚本
* 功能:点击选项后隐藏同级其他选项,显示结果;支持重置全部状态。
*/
(function() {
// 等待DOM加载完成
function init() {
// 为所有奇遇节点绑定事件委托
document.querySelectorAll('.encounter-node').forEach(function(node) {
bindNodeEvents(node);
});
}
function bindNodeEvents(node) {
// 重置按钮
var resetBtn = node.querySelector('.reset-button');
if (resetBtn) {
resetBtn.addEventListener('click', function(e) {
e.stopPropagation();
resetNode(node);
});
}
// 事件委托:处理所有 .option-trigger 的点击
node.addEventListener('click', function(e) {
var trigger = e.target.closest('.option-trigger');
if (!trigger) return;
e.preventDefault();
e.stopPropagation();
var optionItem = trigger.closest('.option-item');
if (!optionItem) return;
// 如果该选项已经显示结果,不再重复处理(可选,可根据需求允许重新选择?这里设计为只能选一次)
if (optionItem.classList.contains('chosen')) return;
// 隐藏该 optionItem 所在的层级中的所有其他 .option-item(同级)
var parentContainer = optionItem.parentNode;
var siblings = parentContainer.querySelectorAll(':scope > .option-item');
siblings.forEach(function(sib) {
if (sib !== optionItem) {
sib.style.display = 'none';
}
});
// 标记当前选项为已选
optionItem.classList.add('chosen');
// 显示该选项对应的 result
var resultDiv = optionItem.querySelector('.option-result');
if (resultDiv) {
resultDiv.style.display = 'block';
}
// 可选:如果结果中还有子选项,子选项的触发需要再次绑定(但事件委托已覆盖,无需额外操作)
});
});
