You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在if-else语句中使用两个querySelector显示不同消息及问题排查

问题解答

关于在if-else中使用多个querySelector

完全可以在同一个if-else语句中使用多个独立的document.querySelector()调用——你当前的代码已经在这么做了,这不是导致问题的原因。你的代码逻辑本身是有效的,真正的问题出在元素显示控制和CSS定位上。

你的代码存在的两个核心问题

1. refreshText元素从未被设置为显示状态

在函数开头你只打开了displayText的显示:

document.querySelector('#displayText').style.display = 'flex'

但refreshText的display属性一直是CSS里默认的none,所以它根本不会出现在页面上。

2. CSS定位错误

#refreshText的top: 10缺少单位(比如px),浏览器无法识别这个值,会忽略该属性,导致两个元素完全重叠。同时你给两个元素都设置了top:0和bottom:0,会让元素高度撑满整个容器,进一步加重重叠问题。

修复方案

步骤1:同时控制两个元素的显示

在函数开头添加一行代码,把refreshText也设置为显示:

function determineWinner({
  player,
  enemy,
  timerId
}) {
  clearTimeout(timerId)
  // 同时显示两个文本元素
  document.querySelector('#displayText').style.display = 'flex'
  document.querySelector('#refreshText').style.display = 'flex'
  // ... 后续判断逻辑不变
}

步骤2:修复CSS定位,实现垂直排列

这里提供两种简单的实现方式:

方案A:调整绝对定位属性(保留现有HTML结构)

给refreshText添加正确单位,调整top值让它在displayText下方,同时去掉多余的bottom属性避免高度撑满:

#displayText {
  align-items: center;
  justify-content: center;
  top: 40%;
  right: 0;
  left: 0;
  position: absolute;
  color: white;
  display: none;
  height: 40px; /* 固定高度避免文本换行重叠 */
}

#refreshText {
  align-items: center;
  justify-content: center;
  top: 50%; /* 比displayText的top值大,确保在下方 */
  right: 0;
  left: 0;
  position: absolute;
  color: white;
  display: none;
  height: 40px;
}

方案B:用容器包裹文本(更优雅的布局方式)

修改HTML,把两个文本放在一个容器里,用flex垂直排列:

<div id="textContainer">
  <div id="displayText">Tie</div>
  <div id="refreshText">Refresh Screen</div>
</div>

然后修改CSS:

#textContainer {
  position: absolute;
  top: 40%;
  left: 0;
  right: 0;
  display: none;
  flex-direction: column;
  align-items: center;
  gap: 20px; /* 两个文本之间的间距 */
}

#displayText, #refreshText {
  color: white;
}

对应的JavaScript只需要控制容器的显示即可:

function determineWinner({
  player,
  enemy,
  timerId
}) {
  clearTimeout(timerId)
  document.querySelector('#textContainer').style.display = 'flex'
  // ... 后续修改innerHTML的逻辑不变
}

额外优化:缓存DOM元素

多次重复调用document.querySelector()会重复查询DOM,建议提前缓存元素提升性能:

// 在函数外部缓存元素
const displayTextEl = document.querySelector('#displayText')
const refreshTextEl = document.querySelector('#refreshText')

function determineWinner({
  player,
  enemy,
  timerId
}) {
  clearTimeout(timerId)
  displayTextEl.style.display = 'flex'
  refreshTextEl.style.display = 'flex'
  
  if (player.health === enemy.health) {
    displayTextEl.innerHTML = 'Tie'
    refreshTextEl.innerHTML = 'Refresh Screen to Continue'
  } else if (player.health > enemy.health) {
    displayTextEl.innerHTML = 'Player 1 Wins'
    refreshTextEl.innerHTML = 'Refresh Screen to Continue'
  } else {
    displayTextEl.innerHTML = 'Player 2 Wins'
    refreshTextEl.innerHTML = 'Refresh Screen to Continue'
  }
}

内容的提问来源于stack exchange,提问作者Sunless Shadow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 14:45:48