2013-07-12 111 views
3

这可能是一个非常基本的问题,但我找不到答案。 (我可能正在寻找错误的条件......)jQuery事件内部事件

有时我觉得我需要在另一个事件中添加一个事件以便共享变量,例如。但是我意识到内部的事件可以根据父事件被触发的次数多次触发。

这里就是我在谈论的一个基本的例子:http://jsfiddle.net/mRc9K/

$('.demo').click(function(){ 
    $('.hidden').show(function(){ 
     $('#link').click(function(){ 
      alert("Clicked"); //fired multiple times 
      $(this).parent().hide(); 
     }); 
    }); 
}); 

如果你点击比在“首次点击”再一次,你会看到第二个事件是如何发射多次。

我不是在寻找那种行为。我知道I can avoid it using delegation利用.on()但是...是否有任何其他方式来避免内部事件多次被解雇?

谢谢。

回答

2

解决方法是使用jQuery的one()方法。

one() - 将处理程序附加到元素的事件。每个元素最多执行一次处理程序 。

在这种情况下,这将是:

$('#link').one('click', function(){ 
    alert("Clicked"); //fired multiple times 
    $(this).parent().hide(); 
}); 

jsFiddle example here.

+1

完美地工作。谢谢。我会在5分钟内接受答案。 – Alvaro

+0

@Alvaro很高兴帮助:) – lifetimes

1

只需使用.one(),其中每个元素结合事件只是一次:

$('.demo').click(function() { 
    $('.hidden').show(function() { 
     $('#link').one('click', function() { 
      alert("Clicked"); 
      $(this).parent().hide(); 
     }); 
    }); 
}); 

DemoDocumentation

+1

(+1)效果很好。但Zenith在大约2分钟前回答。不管怎么说,还是要谢谢你! – Alvaro

+0

@阿尔瓦罗,是的,我看到“1新答复”的消息出现了,因为我正在完成我的答案。我猜想,如果我立即发布了“使用'.one()'”,然后*然后*用小提琴链接编辑了......但我想Zenith可以说同样的事情! ;)感谢upvote,但! –

1

你也可以使用一个变量作为标志:Live DEMO

var clicked = false; 
$('.demo').click(function(){ 
    clicked = true; 
    $('.hidden').show(function(){ 
     $('#link').click(function(){ 
      if(clicked == true){ 
       alert("Clicked"); 
       $(this).parent().hide(); 
       clicked = false; 
      } 
     }); 
    }); 
}); 
+0

它的另一种选择,但也许不是最干净,简单:)谢谢。 – Alvaro

+0

@Alvaro你的欢迎;) –

0

您可以一次启动它像所有其他人说,也可以每次(只是不同的形式给出)

$('.demo').click(function(){ 
    $('.hidden').show(function(){ 
     $('#link').click(function(){ 
      alert("Clicked"); 
      $(this).parent().hide(); 
      $('#link').unbind('click'); 
     }); 
    }); 
}); 
解除绑定click事件

jsfiddle :).