2012-09-24 94 views
0

我的菜單是這樣工作的:每個菜單項(例如,下面的菜單項1)在嵌套在另一個<td>內的表中的<td>中。外部<td>有一些onclick事件處理程序(這裏稱爲「processMenuClick()」)。關於事件冒泡和停止傳播,然後允許冒泡的困惑

<td onClick="processMenuClick(<item-dependent-arguments>);"> 
    <table> 
     <tr> 
      <td class="innermenuitem">Menu Item One</td> 
     </tr> 
    </table></td> 

在某些情況下,我希望防止菜單響應點擊。爲了測試這將如何工作,我做了兩個按鈕。一個適用於event.stopPropagation類<td>每個「innermenuitem」像這樣:

<button onclick="javascript:stopit()">Test the disable menu functionality</button> 

<script type="text/javascript"> 
function stopit() 
{ 
    $("td.innermenuitem").click(function(event) 
    { 
     event.stopPropagation(); 
    }) 
} 
</script> 

這似乎工作的偉大。當我點擊按鈕時,菜單停止響應點擊。但現在說我想重新啓用菜單。點擊處理程序在外​​部<td>中仍未受干擾。所以我想讓我的第二個按鈕禁用我已經應用到內部<td>的stopPropagation。那有意義嗎?如果是這樣,它是如何完成的?

注意:請注意,以上應允許我禁用菜單,並重新啓用它,而不必重新綁定到其處理程序的外部<td>。這很重要,因爲傳遞給「processMenuClick()」的參數只在服務器上知道。如果我必須重新處理處理程序,我將不得不找出一種通過某種回發來回顧它們的方法。但我認爲,因爲我所做的一切都是停止從內部<td>冒出事件,假設有一種方法可以解決UNDO(並允許事件再次冒泡),我應該是金。但是閱讀其他線程看起來像stopPropagation只用於一個事件,而不是像我想的那樣,它基本上就像<td>上的「狀態」。有人可以讓我直立嗎? (希望能解決我在這裏仔細描述的問題?)謝謝。

Paragram

回答

1
function startIt(){ 
    $('td.innermenuitem').off('click'); 
} 

停止它應與上法,使這個儘可能的簡單結合。

function stopIt(){ 
    $('td.innermenuitem').on('click', function(event){ 
     event.stopPropagation(); 
    }); 
} 
+0

謝謝謝謝謝謝!有用。我試着去注意這個,但我想我沒有聲望!爲什麼當谷歌關閉stopPropagation時發現這種技術?我見過幾個人問起它,但你是第一個放棄這個祕密的人!我有沒有提到謝謝! – user1693404

0

還有沒有jQuery的一種方式:
dataSend發送一個Ajax請求
的onclick您可以訪問事件 因此呼叫後冒泡與event.stopPropagation停止() ;
沒有stopPropagation在DIV「1」 click事件也將被激活

<div id='1' class='mnb_bookinfo' 
onclick='dataSend(cBookInfo,34)';> 

<div id='2' class='mnb_bookedit' 
onclick="dataSend(cBookEdit,34);event.stopPropagation();"> 
<img src='misc/mnb/icon_edit.svg' width=32 height=32> 
</div> 

</div>