2013-07-12 41 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 :).