在jQuery

时间:2017-08-25 13:53:46

标签: javascript jquery checkbox scope

我正在开发一款游戏来测试控制代码的某些属性。基础游戏就是这个众所周知的魔术游戏:你有一些带数字的牌,并选择所有你选择出现的牌。然后,"魔术师"可以使用您选择的二进制代码卡来发现您的号码。一个非常简单的版本如下:

卡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);函数的第一个值。

感谢您的帮助和建议,如果答案在其他帖子中而我还没有看到,请原谅我!

1 个答案:

答案 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选择器。

使用这种事件绑定,您无需担心解除绑定和重新绑定或重复事件,因为它会根据页面上的内容自动为您管理此事件。