我正在创建一个简单的记忆游戏,我几乎完成了所有事情。但是,我希望能够使用按钮设置不同的难度,但调用我的函数在按钮的单击上生成表会使其余代码无效。这是我的代码。有人可以告诉我为什么单击其中一个按钮“#easy,#medium,#hard”会使表格单元格无法点击?
//Creates all of the variables to be manipulated later
var countCells;
var cardValues = [];
var checker = true;
var tempArr = [];
var winCounter = 0;
//Generates a table with the dimensions specified
var createTable = function (row, col) {
$('table').empty();
for (var i = 1; i <= row; i++) {
$('table').append($('<tr>'));
}
for (var j = 1; j <= col; j++) {
$('tr').append($('<td>'));
}
countCells = row * col;
};
createTable(3, 6);
//Creates a new game with various difficulties
$('#easy').click(function () {
createTable(2, 5);
});
$('#medium').click(function () {
createTable(3, 6);
});
$('#hard').click(function () {
createTable(4, 9);
});
//Adds a number for half of the cells into an array twice
for (var k = 1; k <= countCells / 2; k++) {
cardValues.push(k);
if (k === countCells / 2 && checker) {
checker = false;
k = 0;
}
}
//Adds a random number from the array to each of the cells
var giveCellValue = function () {
var len = cardValues.length;
for (var i = 0; i <= len; i++) {
var random = Math.ceil(Math.random() * cardValues.length) - 1;
$('td').eq(i).append(cardValues[random]);
cardValues.splice(random, 1);
}
};
giveCellValue();
//Checks for matches when cells are clicked
$('td').click(function () {
if ($(this).hasClass('clicked') || $(this).hasClass('completed')) {
$(this).stopPropagation();
$(this).preventDefault();
return;
}
$(this).addClass('clicked');
tempArr.push($(this).text());
var len = tempArr.length;
if (len > 1) {
if (tempArr[0] === tempArr[1]) {
alert("Good job!");
$('.clicked').addClass('completed');
$('.completed').removeClass('clicked');
winCounter = winCounter + 1;
} else {
alert("Try again!");
$('.clicked').removeClass('clicked');
}
tempArr.splice(0, 2);
}
if (winCounter === countCells / 2) {
alert('You won!');
}
console.log(countCells, winCounter);
});
答案 0 :(得分:1)
清除表格后,td
的事件处理程序将丢失。您需要使用委托/实时或重置点击。
我花了一些时间修复你的代码是一个工作小提琴。 http://jsfiddle.net/ncapito/bg2FH/
值得注意的更改
stopPropagation
和preventDefault
不在“this”上,这是您点击的td,它们位于传递给您的委托/点击功能的事件对象上。
我重构按钮单击侦听器以调用函数来重置内容。
$('#hard').click(function () {
createTable(4, 9);
addNumbers();
giveCellValue();
});
我创建了你必须添加数字的addNumbers
函数。
将$('td').click
更改为
//Checks for matches when cells are clicked
$('table').on('click', 'td', function (event) {
如果你在调用dom之后向dom添加内容,则不需要设置On。
答案 1 :(得分:0)
因为你正在消除附加了点击事件的td。试试这个改变:
-$('td').click(function () {
+$('td').live('click', function () {
答案 2 :(得分:0)
您对$('table')的调用.flash();销毁表格单元格和相关的事件处理程序。您需要为td重新绑定点击处理程序或更好地使用事件委托,如:
$('table').on('click', 'td', function() {
//your code here
});