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

不使用eval将字符串转为变量名:获取HTML输入值的替代方案

替代eval()访问动态变量的方案

核心问题分析

你用const声明的player1NameInput和player2NameInput如果在函数/模块作用域内,不会挂载到全局window对象上,所以window[变量]和Function方法都访问不到这些局部变量——这就是你之前尝试失败的原因。

方案1:用对象统一管理元素(推荐)

把所有玩家输入元素放到一个对象里,通过键名动态访问,完全规避eval:

// 用对象存储,替代单独的变量
const playerInputs = {
  player1: document.getElementById("name1"),
  player2: document.getElementById("name2")
};

const player = event.target.id.slice(7,14); // 值为"player1"或"player2"
let nameElement = document.getElementById(`${player}-name`);

// 直接通过对象键访问对应元素
nameElement.textContent = playerInputs[player].value + ": ";
playerInputs[player].value = "";

方案2:直接动态获取DOM元素(更简洁)

既然你已经能拿到player标识(player1/player2),可以直接拼接ID重新获取元素,省掉提前存储变量的步骤:

const player = event.target.id.slice(7,14);
let nameElement = document.getElementById(`${player}-name`);

// 从player字符串里提取数字,拼接成输入框ID
const inputId = `name${player.slice(-1)}`;
const inputElement = document.getElementById(inputId);

nameElement.textContent = inputElement.value + ": ";
inputElement.value = "";

为什么之前的方法失效?

  • window[${player}NameInput]:const声明的局部变量不会成为window的属性,只有全局作用域的var变量才会自动挂载。
  • Function方法:它创建的函数在全局作用域执行,无法访问当前函数/模块内的局部变量,所以会抛出ReferenceError。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:55:45