0

0

如何让按钮的 textContent 保持不变(防止重复点击覆盖)

花韻仙語

花韻仙語

发布时间:2026-01-01 16:56:27

|

925人浏览过

|

来源于php中文网

原创

如何让按钮的 textContent 保持不变(防止重复点击覆盖)

在井字棋等回合制游戏中,需确保每个格子只能被点击一次并显示固定标记(如 "x" 或 "o"),避免重复点击导致内容被覆盖。本文介绍两种可靠方案:现代浏览器推荐使用 addeventlistener 的 { once: true } 选项;兼容旧版 ie 则可通过手动移除事件监听器实现。

要让按钮(或任何 DOM 元素)的 textContent 在首次点击后“永久锁定”,核心思路是:阻止后续点击触发状态更新逻辑。这并非真正“锁定属性”,而是通过控制事件响应机制来保障数据一致性。

✅ 推荐方案:使用 { once: true }(现代浏览器首选)

addEventListener 支持一个可选参数对象,其中 once: true 表示该监听器仅执行一次,之后自动移除。简洁、高效、语义清晰:

const playRound = (e) => {
  const player = getActivePlayer();
  e.currentTarget.textContent = player.marker;
  placeMarker(e.currentTarget.dataset.number, player.marker);
  _switchPlayerTurn();
  printNewRound();
};

const board = document.querySelectorAll('.square');
board.forEach(element => {
  element.addEventListener('click', playRound, { once: true });
});
✅ 优势:代码量少、无副作用、无需维护额外状态(如已点击标志)、天然防重入。 ⚠️ 注意:IE 不支持此选项(Can I Use: once),若需兼容 IE11 及更早版本,请采用下方兼容方案。

? 兼容方案:手动移除监听器(全浏览器支持)

适用于必须支持 Internet Explorer 的项目。原理是在回调中执行业务逻辑后,立即调用 removeEventListener 清理自身:

const playRound = (e) => {
  const player = getActivePlayer();
  e.currentTarget.textContent = player.marker;
  placeMarker(e.currentTarget.dataset.number, player.marker);
  _switchPlayerTurn();
  printNewRound();
};

const board = document.querySelectorAll('.square');
board.forEach(element => {
  const handler = (e) => {
    playRound(e);
    element.removeEventListener('click', handler); // 关键:执行后立即解绑
  };
  element.addEventListener('click', handler);
});

该方式逻辑明确、兼容性好,但需注意:必须使用具名函数引用(不能传匿名函数),否则 removeEventListener 无法匹配并移除对应监听器。

Lifetoon
Lifetoon

免费的AI漫画创作平台

下载

? 补充建议:增强健壮性(可选)

虽然上述方案已解决核心问题,但实践中建议叠加一层防御性检查,提升可维护性与调试体验:

const playRound = (e) => {
  const el = e.currentTarget;
  // 防御性检查:若已有内容,直接退出(双重保险)
  if (el.textContent.trim() !== '') {
    console.warn('Attempted to overwrite occupied cell:', el);
    return;
  }

  const player = getActivePlayer();
  el.textContent = player.marker;
  placeMarker(el.dataset.number, player.marker);
  _switchPlayerTurn();
  printNewRound();
};

这样即使事件监听器因异常未被正确移除(极小概率),也能避免意外覆盖,同时提供清晰的调试提示。

✅ 总结

  • 优先使用 { once: true }:简洁、安全、符合现代 Web 标准,适用于 Chrome/Firefox/Safari/Edge(≥79)等主流浏览器。
  • 兼容 IE 时用 removeEventListener 手动解绑:需确保传入相同函数引用,稍显冗余但 100% 兼容。
  • 不推荐仅依赖 textContent 判断是否已占用(如 if (!el.textContent) {...}):虽可行,但属于运行时防护,不如事件层拦截彻底;应作为辅助校验而非主逻辑。

通过合理选择事件绑定策略,你不仅能稳定控制 UI 状态,还能让游戏逻辑更清晰、更易测试与扩展。

相关专题

更多
chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

729

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

715

2023.11.06

edge是什么浏览器
edge是什么浏览器

Edge是一款由Microsoft开发的网页浏览器,是Windows 10操作系统中默认的浏览器,其目标是提供更快、更安全、更现代化的浏览器体验。本专题为大家提供edge浏览器相关的文章、下载、课程内容,供大家免费下载体验。

1255

2023.08.21

IE浏览器自动跳转EDGE如何恢复
IE浏览器自动跳转EDGE如何恢复

ie浏览器自动跳转edge的解决办法:1、更改默认浏览器设置;2、阻止edge浏览器的自动跳转;3、更改超链接的默认打开方式;4、禁用“快速网页查看器”;5、卸载edge浏览器;6、检查第三方插件或应用程序等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

373

2024.03.05

如何解决Edge打开但没有标题的问题
如何解决Edge打开但没有标题的问题

若 Microsoft Edge 浏览器打开后无标题(窗口空白或标题栏缺失),可尝试以下方法解决: 重启 Edge:关闭所有窗口,重新启动浏览器。 重置窗口布局:右击任务栏 Edge 图标 → 选择「最大化」或「还原」。 禁用扩展:进入 edge://extensions 临时关闭插件测试。 重置浏览器设置:前往 edge://settings/reset 恢复默认配置。 更新或重装 Edge:检查最新版本,或通过控制面板修复

832

2025.04.24

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

713

2023.08.22

DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

2712

2024.08.14

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

65

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

44

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何进行WebSocket调试
如何进行WebSocket调试

共1课时 | 0.1万人学习

TypeScript全面解读课程
TypeScript全面解读课程

共26课时 | 5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号