【发布时间】:2017-08-25 13:53:45
【问题描述】:
我正在开发一个游戏来测试控制代码的一些属性。基础游戏就是这个著名的魔术游戏:您有一些带有数字的卡片,然后选择所有出现您选择的数字的卡片。然后,“魔术师”可以使用您选择的卡片的二进制代码发现您的号码。一个很简单的版本如下:
卡 1(如果选中则表示位 xx1)
- 1
- 3
- 5
- 7
卡 2(位 x1x)
- 2
- 3
- 6
- 7
卡 3(位 1xx)
- 4
- 5
- 6
- 7
例如,如果您正在考虑数字 3,您将选择卡片 1 和 2,它们以二进制表示 (011),即数字 3。
嗯,这个解释是为了让你了解上下文。我的游戏版本还有一层验证卡和号码。您可以找到实际代码 in this codepen。它充满了警报,可以为我提供有关变量的信息。如果你运行它,你会发现第一次执行没问题,但下一次尝试它开始变得疯狂。
我在使用 jQuery 选中/取消选中复选框时遇到了一些麻烦。我已经尝试了许多解决方案并阅读了文档和其他相关帖子,但似乎没有任何东西可以解决这个问题。我认为$lie var 的范围存在一些问题。当我点击按钮时,它应该是$lie = '';在另一个函数$lie 之后得到一个新值。这是正确的,但是当我将 $lie 传递给此函数时,它会记住以前的值。
我在这里复制了与$lie var 一起使用或相关的函数的完整框架:
var $lie = '';
function check() {
$lie = ''; // only to clear on successive calls
if (something) {
// $lie gets its correct value here
}
return $lie; //I have made some alerts here and it is working well always
}
function lying() {
if ($lie === something) {
// something related with "something"
}
}
function message($lie) {
// other stuff
$(some-div).on('click', function() {
// more stuff
$change = $('#' + $lie); // here $lie gets the first value, but not reset on successive tries, that is why program goes crazy
$change.prop('checked', function(i, i2) {
return !i2;
});
});
}
$(run-button).on('click', function(e) {
e.preventDefault();
check();
if ($lie !== '') { // do only if $lie have value
lying();
message($lie)
}
}
我第一次执行程序$lie 有一个正确的值并且可以正常工作。但接下来运行$lie 值不会重置并记住以前的值。我不确定错误在哪里,我尝试在很多地方重置$lie = '';,但一直在处理message($lie); 函数的第一个值。
感谢您的帮助和建议,如果答案在其他帖子中而我没有看到,请见谅!
【问题讨论】:
-
每次调用
message()函数时,都会将一个额外的点击处理程序绑定到some-div -
感谢@billyonecan!那么,如何防止在 message() 函数上单击处理程序?我明白你在说什么。更重要的是,我重新设计了整个程序,因为我之前在嵌套的“点击”处理程序上遇到了问题。但正如你所指出的,它并没有解决。
-
如果你绑定的太多,你可以通过在绑定
.off('click').on('click')或更好的 using a delegated event 之前在消息函数之外取消绑定来确保绑定一次。 -
@estemon 您不需要
some-div点击处理程序的函数包装器,只需在run-button的点击处理程序中直接触发它:$(some-div).trigger('click');(您不需要供应$lie,因为它是在全局范围内定义的) -
@Johannes 我已经尝试了您的建议,
.off('click')并且有效。但是,我将了解委托事件以改进它。非常感谢!
标签: javascript jquery checkbox scope