我正在开发一款游戏来测试控制代码的某些属性。基础游戏就是这个众所周知的魔术游戏:你有一些带数字的牌,并选择所有你选择出现的牌。然后,"魔术师"可以使用您选择的二进制代码卡来发现您的号码。一个非常简单的版本如下:
卡1(如果选择则表示位xx1)
卡2(位x1x)
卡3(位1xx)
例如,如果您考虑的是数字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);
函数的第一个值。
感谢您的帮助和建议,如果答案在其他帖子中而我还没有看到,请原谅我!
答案 0 :(得分:1)
由于我的评论似乎有助于回答手头的问题,因此这是一个扩展的答案。
在JQuery中,有几种方法可以处理事件绑定。
$(some-div).on('click', function() {});
上面的代码是您正在使用的代码,这意味着每次调用此代码时,它都会选择页面上与选择器匹配的每个元素。
在你的代码中,因为这是一个函数内部,你很有可能最终重新绑定已经绑定的事件。这会导致重复事件并真的搞得一团糟。
您可以通过稍微修改代码来缓解此问题:
$(some-div).off('click').on('click', function() {});
此代码确保在添加任何点击事件之前删除所有点击事件,停止重复事件。
但是,如果您的目标只是确保有效元素始终绑定,无论它们是否存在于初始页面加载中,那么委派的事件都是您的朋友。好消息是,它没有太大的不同或困难。
简单地编写代码有点不同:
$('.parent').on('click', '.child', function() {});
在这种情况下,.parent
是一个选择器,其中包含您的所有活动的位置(在您的情况下我认为是您的.container
。.child
在这种情况下将等同于您的some-div
选择器。
使用这种事件绑定,您无需担心解除绑定和重新绑定或重复事件,因为它会根据页面上的内容自动为您管理此事件。