尝试将 setAttribute 动态设置为 Class 中的按钮元素,但 returns "is not defined"
Trying to setAttribute to a button Element in a Class dynamically but returns "is not defined"
我有这个问题。我正在 Javascript 中创建一个类似于雷区的游戏 - 我决定使用 Class 来生成游戏关卡。 Class 还负责根据创建关卡时定义的关卡大小生成 DOM 代码,包括按钮和布局。
现在我遇到的问题是,当我为每个按钮生成代码时:
box.setAttribute('onclick', this.levelName + '.checkResult(this.id)');
在生成HTML中似乎是正确的:
<button id="00" class="box" onclick="LevelOne.checkResult(this.id)">test</button>
但是当我按下相关按钮时,我收到此消息:
Uncaught ReferenceError: LevelOne is not defined
at HTMLButtonElement.onclick (findTheSpot.html:16)
如果我这样做,直接在第二个参数中插入变量名:
box.setAttribute('onclick', 'levelOne.checkResult(this.id)');
效果很好。
我将在下面粘贴整个代码,只是为了帮助您可视化整个流程 - 我是 javascript 的新手,我正在尝试尽可能多地学习,创建不同的编码练习由我自己,提前为任何编码恐怖或菜鸟错误道歉:D
/// creating a class to generate an array map of 0s and a single random 1
class Level {
constructor(wL, hL) {
this.widhtLevel = wL;
this.lenghtLevel = hL;
this.levelName;
this.level = [];
}
populateLevel() {
var idNumber = 0;
//Creating the main div container
var div = document.createElement('div');
div.style.width = this.widhtLevel + (this.widhtLevel * 50) + 'px';
div.style.height = this.lenghtLevel + (this.lenghtLevel * 50) + 'px';
div.setAttribute('id', 'mainContainer');
div.setAttribute('class', 'boxContainer');
document.body.appendChild(div);
for(var i = 0; i < this.lenghtLevel; i++) {
var arrayPopulation = []
for(var j = 0; j < this.widhtLevel; j++) {
arrayPopulation.push(0)
//Creating the boxes
var box = document.createElement('button');
box.textContent = "test";
box.setAttribute('id', idNumber + '' + (arrayPopulation.length - 1));
box.setAttribute('class', 'box');
box.setAttribute('onclick', this.levelName + '.checkResult(this.id)');
div.appendChild(box);
}
this.level.push(arrayPopulation);
idNumber++;
}
}
randomizeKey() {
var randomX = Math.floor(Math.random() * (this.widhtLevel - 0));
var randomY = Math.floor(Math.random() * (this.lenghtLevel - 0));
this.level[randomY][randomX] = 1;
//console.log(this.level[randomY][randomX]);
}
createLevel(name) {
this.levelName = name;
this.populateLevel()
this.randomizeKey()
for (var i = 0; i < this.level.length; i++) {
console.log(this.level[i])
}
}
var levelOne = new Level(5,5);
levelOne.createLevel("LevelOne");
问题归结为常见的编程噩梦 - 大写。尝试调试由大小写不一致引起的问题可能会非常令人沮丧,因为您的大脑在比较变量名称时经常会跳过该细节。在您的情况下,您生成的代码大写“LevelOne”,但您的硬编码值为“levelOne”。您可能需要阅读上一句两遍才能注意到其中的区别,即使它已被明确指出。
因此,您的问题的短期答案是您需要确保变量名称和“levelName”属性 具有相同的大小写。无需花时间查看您的代码的其余部分,这些代码至少应该可以解决眼前的问题。
当您查看此内容时,考虑一下您的可变资本化约定不会有什么坏处。您不必立即重命名所有变量,但您可能会发现定义个人标准将使以后的代码更易于维护。如果您与其他开发人员一起工作,那么这是一个您应该一起进行的练习,否则您可能会发现自己无意中相互对抗。如果您已经有命名约定,那么请随时忽略此建议 - 也许它会帮助其他人稍后查看此答案。
我有这个问题。我正在 Javascript 中创建一个类似于雷区的游戏 - 我决定使用 Class 来生成游戏关卡。 Class 还负责根据创建关卡时定义的关卡大小生成 DOM 代码,包括按钮和布局。
现在我遇到的问题是,当我为每个按钮生成代码时:
box.setAttribute('onclick', this.levelName + '.checkResult(this.id)');
在生成HTML中似乎是正确的:
<button id="00" class="box" onclick="LevelOne.checkResult(this.id)">test</button>
但是当我按下相关按钮时,我收到此消息:
Uncaught ReferenceError: LevelOne is not defined
at HTMLButtonElement.onclick (findTheSpot.html:16)
如果我这样做,直接在第二个参数中插入变量名:
box.setAttribute('onclick', 'levelOne.checkResult(this.id)');
效果很好。
我将在下面粘贴整个代码,只是为了帮助您可视化整个流程 - 我是 javascript 的新手,我正在尝试尽可能多地学习,创建不同的编码练习由我自己,提前为任何编码恐怖或菜鸟错误道歉:D
/// creating a class to generate an array map of 0s and a single random 1
class Level {
constructor(wL, hL) {
this.widhtLevel = wL;
this.lenghtLevel = hL;
this.levelName;
this.level = [];
}
populateLevel() {
var idNumber = 0;
//Creating the main div container
var div = document.createElement('div');
div.style.width = this.widhtLevel + (this.widhtLevel * 50) + 'px';
div.style.height = this.lenghtLevel + (this.lenghtLevel * 50) + 'px';
div.setAttribute('id', 'mainContainer');
div.setAttribute('class', 'boxContainer');
document.body.appendChild(div);
for(var i = 0; i < this.lenghtLevel; i++) {
var arrayPopulation = []
for(var j = 0; j < this.widhtLevel; j++) {
arrayPopulation.push(0)
//Creating the boxes
var box = document.createElement('button');
box.textContent = "test";
box.setAttribute('id', idNumber + '' + (arrayPopulation.length - 1));
box.setAttribute('class', 'box');
box.setAttribute('onclick', this.levelName + '.checkResult(this.id)');
div.appendChild(box);
}
this.level.push(arrayPopulation);
idNumber++;
}
}
randomizeKey() {
var randomX = Math.floor(Math.random() * (this.widhtLevel - 0));
var randomY = Math.floor(Math.random() * (this.lenghtLevel - 0));
this.level[randomY][randomX] = 1;
//console.log(this.level[randomY][randomX]);
}
createLevel(name) {
this.levelName = name;
this.populateLevel()
this.randomizeKey()
for (var i = 0; i < this.level.length; i++) {
console.log(this.level[i])
}
}
var levelOne = new Level(5,5);
levelOne.createLevel("LevelOne");
问题归结为常见的编程噩梦 - 大写。尝试调试由大小写不一致引起的问题可能会非常令人沮丧,因为您的大脑在比较变量名称时经常会跳过该细节。在您的情况下,您生成的代码大写“LevelOne”,但您的硬编码值为“levelOne”。您可能需要阅读上一句两遍才能注意到其中的区别,即使它已被明确指出。
因此,您的问题的短期答案是您需要确保变量名称和“levelName”属性 具有相同的大小写。无需花时间查看您的代码的其余部分,这些代码至少应该可以解决眼前的问题。
当您查看此内容时,考虑一下您的可变资本化约定不会有什么坏处。您不必立即重命名所有变量,但您可能会发现定义个人标准将使以后的代码更易于维护。如果您与其他开发人员一起工作,那么这是一个您应该一起进行的练习,否则您可能会发现自己无意中相互对抗。如果您已经有命名约定,那么请随时忽略此建议 - 也许它会帮助其他人稍后查看此答案。