2013-02-20 50 views
2

“我想点击‘命中’上课的时候,只有当父母的‘盒子’的ID是正确的做这样的事情下面将运行一个函数没有更新。jQuery选择与变量,变量的时候改变

var selected = 1;  

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

    selected = randomFromTo(1,5); 

}); 

根据页面上的其他动作selected变量的变化,但我不能得到的功能进行任何更改后的工作 - 它保持固定到最初选择的“盒子”的ID。我可以想象,为什么这可能是,因为jQuery已经拍摄了该字符串的快照,并没有任何信息告诉它更新它,但我无法弄清楚如何解决这个问题。

编辑:添加所选变量的实例和它被设置的位置。我忽略了UI更改,这会让用户更容易理解。

+0

u能提供更多的代码?例如,设置变量的代码? – PlantTheIdea 2013-02-20 23:41:52

回答

3

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

+0

+1已移除我自己的答案;-) – 2013-02-20 23:48:39

+0

事实证明我只是想这对'hit'区反正工作,因此类的名称 - 只是没有注意。在一个解决了两个问题;) – RichieAHB 2013-02-20 23:59:21

0

我需要看到整个上下文理解, 但在第一次看,似乎张贴代码被您的网页上运行一次。

,所以如果你

var selected = something; 

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

    //function 

}); 

,后来

selected = "newvalue"; 

这不会改变程序的行为,单击事件已被设置为特定对象。

其他建议设置点击.hit处理使得有很大的意义,然后将处理程序中,您可以检查是否

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

,然后才执行代码。

+0

不完全等同。如果选择了'“#box - ”这是真的“>点击” +选择+',但它不是 - 箱子可以是任何始祖。 – 2013-02-20 23:51:23

+0

你当然是对的:) – 2013-02-20 23:59:03

2

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

结合后,就不可能修改选择器,并切换选择过程中使用的任何变量将没有任何效果。

解决这个问题的最好办法,我能想到的,就是点击事件附加到所有可能的匹配,然后进一步筛选他们click处理器中......

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

+1我从Kolink的回答中写道这个,但是谢谢:)也需要从'box'之前删除哈希,因为它正在寻找一个id。 – RichieAHB 2013-02-20 23:54:40

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() { }); 
}