试图在javascript中制作一个扫雷并遇到这个问题......
我创建了一个表,每个td都是一个“盒子”,里面有一个或者没有(当前)。 单击一个框后,javascript应该将onclick从“clicked(this.id)”更改为一个警告“NOPE”(发出警告只是为了测试是否发生了什么事情),但发生的事情是:
出于某种原因,onclick返回其原始值(clicked(this.id))..
我制作了一个测试页面,一个包含2个td的表格并记住了相同的想法(点击后更改了onclick值)并且它有效..我不知道如何解决这个问题...
运行的test.html: http://pastebin.com/62ayRJps
网站中的HTML无法正常工作: http://pastebin.com/SZ6NU8j9
来自网站的Javascript无法正常工作: http://pastebin.com/bevJHNLc
答案 0 :(得分:4)
由于clicked(id)
中的这一行:
document.getElementById("minesweeper").innerHTML += ammountClicked+" - "
每个表格单元格的HTML都有onclick='clicked(this.id);'
属性。将测试函数tst
分配给表单元格DOM对象时,您正在设置DOM对象的onclick
属性,但这不会更改HTML的onclick
属性。 (是的,这令人困惑。)
在上面的代码行中,浏览器从扫雷innerHTML
(具有原始div
属性)读取onclick
,将其与另一个字符串连接,然后重新分配结果回到扫雷div
。这会清除div
的原始内容,并将其替换为新的HTML(每个单元格都具有原始onclick
属性的表格)。
如果您想要一个消息区域,建议您在另一个元素上设置innerHTML
:Demo
在演示中,我更改了第49行(添加span
):
print += "</table><span id='message'></span>";
和第107行(将文本分配给span
):
document.getElementById("message").innerHTML += ammountClicked+" - ";
答案 1 :(得分:1)
我建议你跟踪每个项目的状态。在运行应用程序时最好不要修改代码。
var states = {1: 0, 2: 0};
function clicked(id)
{
if (states[id] === 0)
alert("First time clicking me, eh?");
else
alert("Seems we have a repeat offender!");
states[id]++;
}
这使您可以通过检查给定state
的{{1}}是否已更改(例如,通过之前的点击)来拆分函数中的逻辑。
答案 2 :(得分:0)
在function clicked(id)
中进行一些修改后,它可以正常工作:
//document.getElementById(id).onclick = tst;
field[row][column] = false;
在执行任何操作之前检查字段是否包含false
:
if (field[row][column] == false) {
console.log("This cell has already been clicked");
return;
}
无需更改onclick事件。
Jeffery To 解释的问题如下:
clicked
被称为minesweeper.innerHTML = minesweeper.innerHTML + "1 - "
[重置所有onclick事件] minesweeper.innerHTML = minesweeper.innerHTML + "2 - "
[重置所有onclick事件] onclick事件被重置,因为innerHTML包含所有onclick声明。这就像重写该div的所有HTML,从而重写所有子元素及其事件。 这也是你的简单例子(只有两个单元格的例子)有效的原因。