Javascript 更改jQuery上的复选框状态时遇到问题
我正在开发一个游戏来测试控制代码的一些属性。这是一款著名的魔术游戏:你有一些带数字的牌,然后选择所有出现数字的牌。然后,“魔术师”可以发现你的号码使用二进制代码的卡你已经选择。一个非常简单的版本如下: 卡1(如果选择,则表示位xx1)Javascript 更改jQuery上的复选框状态时遇到问题,javascript,jquery,checkbox,scope,Javascript,Jquery,Checkbox,Scope,我正在开发一个游戏来测试控制代码的一些属性。这是一款著名的魔术游戏:你有一些带数字的牌,然后选择所有出现数字的牌。然后,“魔术师”可以发现你的号码使用二进制代码的卡你已经选择。一个非常简单的版本如下: 卡1(如果选择,则表示位xx1) 一, 三, 五, 七, 卡2(位x1x) 二, 三, 六, 七, 卡3(位1xx) 四, 五, 六, 七, 在本例中,如果您考虑的是数字3,您将选择卡1和卡2,这表示二进制的(011),即数字3 好吧,这个解释是为了让你了解上下文。我的游戏版本还有一层
- 一,
- 三,
- 五,
- 七,
- 二,
- 三,
- 六,
- 七,
- 四,
- 五,
- 六,
- 七,
$lie
变量的范围存在一些问题。当我单击按钮时,它被设置为$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=''代码>在许多地方,但始终处理消息($lie)的第一个值代码>函数
谢谢你的帮助和建议,如果答案在其他帖子中,我还没有看到,请原谅 因为我的评论似乎有助于回答眼前的问题,这里是一个扩展的答案
在JQuery中,有几种处理事件绑定的方法
$(一些div).on('click',function(){})代码>
上面的代码就是您正在使用的代码,这意味着每次调用此代码时,它都会选择页面上与选择器匹配的每个元素
在您的代码中,因为它位于函数内部,所以很有可能最终会重新绑定已绑定的事件。这会导致重复事件,并造成混乱
您可以通过稍微修改代码来缓解此问题:
$(某些div).off('click')。on('click',function(){})代码>
此代码确保在添加任何单击事件之前删除所有单击事件,从而停止重复事件
但是,如果您的目标只是确保始终绑定有效元素,而不管它们是否存在于初始页面加载中,那么委托事件就是您的朋友。好消息是,这没有什么不同,也不难做到
只需编写稍微不同的代码,如下所示:
$('.parent')。on('click','.child',function(){})代码>
在这种情况下,.parent
是一个选择器,它包含所有事件的位置(在您的情况下,我相信这是您的.container
)。在这种情况下,child
相当于您的某个div
选择器
使用这种事件绑定,您无需担心取消绑定、重新绑定或复制事件,因为它会根据页面上的内容自动为您管理这些事件。每次调用消息()
函数您正在将一个额外的点击处理程序绑定到某个div
谢谢@billyonecan!那么,如何防止在消息()上点击处理程序呢函数?我理解你的意思。更重要的是,我重新设计了整个程序,因为我以前在嵌套的“单击”处理程序上遇到过问题。但正如你所指出的,这并没有解决。如果绑定太多,你可以通过在绑定前解除绑定.off('click')。on('click')来确保绑定一次
或者更好的方法是在消息函数之外。@estemon您不需要某些div
单击处理程序的函数包装器,只需在运行按钮的单击处理程序内直接触发它:$(某些div)。trigger('click');
(您不需要提供$lie
,因为它是在全局范围内定义的)@Johannes我已经尝试了您的建议,.off('click')
,效果很好。不过,我将学习委托活动,以改进它。非常感谢!