Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 更改jQuery上的复选框状态时遇到问题_Javascript_Jquery_Checkbox_Scope - Fatal编程技术网

Javascript 更改jQuery上的复选框状态时遇到问题

Javascript 更改jQuery上的复选框状态时遇到问题,javascript,jquery,checkbox,scope,Javascript,Jquery,Checkbox,Scope,我正在开发一个游戏来测试控制代码的一些属性。这是一款著名的魔术游戏:你有一些带数字的牌,然后选择所有出现数字的牌。然后,“魔术师”可以发现你的号码使用二进制代码的卡你已经选择。一个非常简单的版本如下: 卡1(如果选择,则表示位xx1) 一, 三, 五, 七, 卡2(位x1x) 二, 三, 六, 七, 卡3(位1xx) 四, 五, 六, 七, 在本例中,如果您考虑的是数字3,您将选择卡1和卡2,这表示二进制的(011),即数字3 好吧,这个解释是为了让你了解上下文。我的游戏版本还有一层

我正在开发一个游戏来测试控制代码的一些属性。这是一款著名的魔术游戏:你有一些带数字的牌,然后选择所有出现数字的牌。然后,“魔术师”可以发现你的号码使用二进制代码的卡你已经选择。一个非常简单的版本如下:

卡1(如果选择,则表示位xx1)

  • 一,
  • 三,
  • 五,
  • 七,
卡2(位x1x)

  • 二,
  • 三,
  • 六,
  • 七,
卡3(位1xx)

  • 四,
  • 五,
  • 六,
  • 七,
在本例中,如果您考虑的是数字3,您将选择卡1和卡2,这表示二进制的(011),即数字3

好吧,这个解释是为了让你了解上下文。我的游戏版本还有一层验证卡和数字。您可以找到实际的代码。它充满了给我变量信息的警报。如果你运行它,你会发现第一次执行是正常的,但下一次尝试它开始疯狂

我对jQuery中的复选框有一些问题。我尝试了许多解决方案,阅读了文档和其他相关帖子,但似乎没有任何东西能够解决这个问题。我认为,
$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')
,效果很好。不过,我将学习委托活动,以改进它。非常感谢!