带有变量的jQuery选择器,当变量发生变化时不更新

时间:2013-02-20 23:40:15

标签: javascript jquery

'我正在尝试执行类似下面的操作,只有当父“box”ID正确时,才会在单击“匹配”类时运行函数。

var selected = 1;    

$('#box-' + selected + ' .hit').click(function(){

    selected = randomFromTo(1,5);

});

selected变量根据页面上的其他操作而变化,但我无法在任何更改后使该函数工作 - 它保持固定为最初选择的“box”id。我可以想象为什么会这样,因为jQuery已经拍摄了该字符串的快照,没有任何东西告诉它更新它但我无法弄清楚如何解决这个问题。

编辑:添加了所选变量的实例化以及设置的位置。我遗漏了UI更改,这会让用户更容易理解。

4 个答案:

答案 0 :(得分:3)

您可以在.hit类上设置单击处理程序,然后在处理程序本身中检查父节点中是否有正确的ID。如果这样做,请确保正确推迟事件,否则最终会为每个.hit元素设置一个处理程序。

答案 1 :(得分:2)

如果我正确理解您的问题,问题是在创建函数时评估selected变量。该函数当时绑定到一组DOM元素的click事件。

绑定后,无法修改选择器,更改选择期间使用的任何变量都无效。

我能想到的最好方法是将click事件附加到所有可能的匹配项,然后在click处理程序中进一步过滤它们......

$('.hit').click(function(){
    // check if the parent has the correct id
    if($(this).parent().attr('id') == 'box-' + selected){
        //function
    }
});

答案 2 :(得分:1)

可以这样做:

var selected = null;
function setSelected(aSelected) {

    if (selected !== null) {
        // Remove existing selected click handler
        $('#box-' + selected + ' .hit').off('click.selected')
    }

    selected = aSelected;

    // Click handler for new selected el
    $('#box-' + selected + ' .hit').on('click.selected', function() { });
}

答案 3 :(得分:0)

我需要看到整个背景要理解, 但在第一眼看来,似乎已发布的代码在您的页面上运行一次。

所以,如果你这样做

var selected = something;

$('#box-' + selected + ' .hit').click(function(){

    //function

});

以及稍后

selected = "newvalue";

这不会改变程序行为,已经为特定对象设置了click事件。

在.hit上设置点击处理程序的另一个建议很有意义,然后在处理程序内你可以检查是否

($(this).parent().attr('id')) == ("box-"+selected)

然后才执行你的代码。