2010-12-21 65 views
0

使用下面的html和jQuery,如果我多次點擊第一個錨點然後點擊列表錨點,我會看到警告消息顯示的次數是我點擊第一個錨點的次數。爲什麼是這樣?我如何阻止它發生?當只有一個人需要時Jquery多個事件

<div> 
    <a href="#">click me</a> 
    <ul style="display:none"> 
     <li><a href='#'>now click me</a></li> 
    </ul> 
</div> 


$('div > a').click(function(e) { 
    e.preventDefault(); 

    $(this).next().show().find('a').click(function() { 
     alert("alert from inner click"); 
     return false; 
    }); 
}); 

回答

3

因爲每對錨的點擊處理程序被調用時,你鉤住爲其他錨的事件處理程序的另一個實例。想必你只想連接一次,但不知道更多關於你想要實際做什麼......

如果你想更改當你點擊第一個按鈕時會發生什麼,你可以從錨解除綁定所有click處理程序首先,像這樣:

$('div > a').click(function(e) { 
    e.preventDefault(); 

    $(this).next().show().find('a').unbind('click').click(function() { 
     // New bit is here.........^^^^^^^^^^^^^^^^ 
     alert("alert from inner click"); 
     return false; 
    }); 
}); 

...但我的總體目標更好的主意懷疑,就不會有一個更好的解決方案。 (上述的一個問題是,它會刪除所有click處理來自錨,無論是通過該代碼或別的東西,這是不與別人很好地玩上勾搭上了)

0

發生這種情況的原因是,每次單擊第一個鏈接時,都會在列表中的錨點上綁定單擊事件。

你想實現什麼?

0

基本上,當您單擊第一個鏈接時,將新的單擊事件附加到嵌套鏈接。有兩種解決方案。

首先你可以再次設置它之前解除綁定的第二次點擊事件:

$('div > a').click(function(e) { 
    e.preventDefault(); 

    $(this).next().show().find('a') 
     .unbind('click') 
     .click(function() { 
      alert("alert from inner click"); 
      return false; 
     }); 
}); 

其他更好的解決辦法是附加的第一個點擊事件以外的其他點擊。

0

,如果你真的想第一個內第二次點擊處理程序綁定,你可以用第二個處理器連接到一個功能,並首次嘗試解除綁定此功能:

$(this).next().show().find('a') 
    .unbind("click", someFunction) 
    .click(someFunction); 

你也可以設置一些標誌在第二個處理程序中檢查它是否在之前被調用。

但據我看到這裏的主要問題是爲什麼return false不停止事件傳播,對不對?這需要進一步的研究,正如我預計的那樣。

相關問題