Javascript:调用函数onsubmit不拦截参数

标签 javascript arrays

我正在尝试在 Vanilla JS 中制作一个蛇游戏,其中有可能改变级别。每个级别都由一个函数生成的不同迷宫表示:

function createMaze(selected) {
  for (let y = 0; y < selected.length; y++) {
    for (let x = 0; x < selected[y].length; x++) {
      if (selected[y][x] === 1) {
        ctx.fillStyle = "black";
        ctx.fillRect(x*10, y*10, 10, 10);
      }
    }
  }
}

通过表单来改变级别:

<form id="levelSelect">
  <select id="levels">
    <option value="gridLevel1">One</option>
    <option value="gridLevel2">Two</option>
    <option value="gridLevel3">Three</option>
    <option value="gridLevel4">Four</option>
    <option value="gridLevel5">Five</option>
  </select>
  <input type="submit">
</form>

定义如下:

const levelSelection = document.querySelector("#levelSelect");
const levelDropdown = document.querySelector("#levels");

然后在事件监听器中被调用:

levelSelection.addEventListener("submit", (event) => {
  event.preventDefault();
  selected = levelDropdown.options[levelDropdown.selectedIndex].value;
  createMaze(selected);
  console.log(selected);
});

由于一开始 createMaze 函数没有特定参数,因为没有执行选择,所以我添加了一个子句:

if (!selected) selected = gridLevel1;

当游戏开始时,createMaze(selected) 函数将被调用。

但是,即使在事件监听器中,当我调用函数 createMaze(selected) 时,我也能够注销作为级别名称的值(这也是代表每个级别的数组的名称)它似乎不起作用。如果我在 creatMaze 中记录所选内容,它只会打印出数组的名称,而不是数组本身。

最佳答案

因为selected是一个字符串,例如"gridLevel1",但你希望它是一个变量gridLevel1。这可以通过在窗口对象中查找来轻松完成:

 window["gridLevel1"] // gridLevel1

或者在您的一般情况下:

createMaze(window[selected]);

但是,尽管这有效,但您应该考虑将级别放入对象中:

const levels = {
  gridLevel1: [ /*..*/ ],
  //...
 };

所以你可以这样做:

createMaze(levels[selected])

关于Javascript:调用函数onsubmit不拦截参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51580267/

相关文章:

c# - 将 Excel 范围转换为 C# 数组

php - 每 3 项和 4 项交替

javascript - jQuery:为什么选择器会失败?

javascript - 为什么 'javascript:..' 代码段在 Firefox 地址栏中不起作用?

javascript - 使用 cookie 设置/获取输入值

javascript - 如何从 AngularJS 中的对象数组创建一个类似于对象的空对象?

arrays - 在 Clojure 中优化数组变异

javascript - 显示本地 JSON 文件中的数据

java - 没有集合库的哈希表

c - 包含 2 个结构数组的结构数组未正确初始化,导致段错误