2011-12-18 112 views
3

我有兩部分腳本。防止調用函數


Part 1 : 
$("mySelector").click(function() { 
    alert('you call me'); 
}) 

Part 2 : 
$("mySelector").click(function() { 
    if(myCondition) { 
      //how can i prevent calling the first function from here ??? 
    } 
}) 

整個問題,是我必須part1的沒有訪問。所以我需要解除第一部分中已經指定的事件,如果myCondition是真的,否則我需要調用第一個函數。

感謝

UPDATE:

謝謝。我不知道stopImmediatePropagation()。但我覺得,必須有類似的東西:)

但實際上在我的情況下,它不工作:(

請看看我的網站 http://www.tours.am/en/outgoing/tours/%D5%80%D5%B6%D5%A4%D5%AF%D5%A1%D5%BD%D5%BF%D5%A1%D5%B6/Park-Hyatt-Goa/

酒店描述選項卡我有云旋轉木馬,當我點擊沒有活動圖像(不是前面的圖像),你可以看到我安慰,我stopImmediatePropagation()那裏,但事件但是電話:(

回答

1

禁止訪問:

$("#mySelector").click(function() { 
    alert('you call me'); 
}) 

訪問:

var myCondition = true, //try false too 
    fFirstFunction = $("#mySelector").data("events").click[0].handler; 
$("#mySelector").unbind("click"); 
$("#mySelector").click(function() { 
    if(myCondition) { 
     alert(myCondition); 
    } else { 
     $("#mySelector").click(fFirstFunction); 
    } 
}); 

this例如

+0

情況如何? – alex 2011-12-18 14:22:00

+2

您是否錯過了'if(myCondition)'部分? – Jon 2011-12-18 14:22:12

+0

抱歉,現在修復了。 – noob 2011-12-18 14:47:32

5

如果你的處理程序先註冊,然後你可以SE event.stopImmediatePropagation這樣的:

$("mySelector").click(function(event) { 
    if(myCondition) { 
      event.stopImmediatePropagation(); 
    } 
}) 

要知道,這將停止事件冒泡,所以它也將防止父元素click處理程序被調用。

更新:如果這不起作用,那麼您的處理程序會附加到您想要控制的處理程序之後。這是一個讓解決方案更加困難的問題。我建議你看看你是否可以在「另一個人之前」綁定,否則你將不得不解除綁定現有的處理程序,然後通過保留對它的引用來有條件地調用它。請參閱jQuery find events handlers registered with an object

+0

@alex:我在第一次嘗試時弄錯了,並在運行維修時被刪除。 :) – Jon 2011-12-18 14:15:57

+0

:) +1給你先生。 – alex 2011-12-18 14:17:12

+0

謝謝。我不知道stopImmediatePropagation()。但我覺得,一定有這樣的事情:) 但實際上在我的情況下它不起作用:( 請看看我的網站 http://www.tours.am/en/outgoing /遊覽/%D5%80%D5%B6%D5%A4%D5%AF%D5%A1%D5%BD%D5%BF%D5%A1%D5%B6/Park-Hyatt-Goa/ 根據**酒店描述**選項卡我有云旋轉木馬,當我點擊沒有活動的圖像(不是前面的圖像),你可以看到我安慰,我stopImmediatePropagation()那裏,但事件然而調用:( – Simon 2011-12-18 14:22:57

-1
return false; 

- 或 -

event.preventDefault(); 
+0

其實這隻會阻止* bubbling *,所以它不會工作 – Jon 2011-12-18 14:13:25

+0

'preventDefault'阻止本地操作,如在鏈接上導航;'stopPropagation'防止冒泡。 – pimvdb 2011-12-18 14:14:08

+0

請注意,兩者不是一回事。雖然'return false'會停止事件處理,'event.preventDefault()'會停止默認行爲(例如:單擊鏈接將發出導航命令,直到被阻止)。 – sitifensys 2011-12-18 14:17:17

1

您可以撥打

$('mySelector').unbind('click'); 

擺脫所有點擊處理程序。如果您的腳本在之後加載另一個(似乎是這種情況),那麼應該這樣做。但請注意,它會解除所有「單擊」處理程序的綁定,因此請確保在添加自己的處理程序之前調用該處理程序。

1

如果你不能保證你的處理程序首先連接,請嘗試以下代碼:

var events = $('mySelector').data("events"); //all handlers bound to the element 
var clickEvents = events ? events.click : null;//all click handlers bound to the element 
$('mySelector').unbind('click');    //unbind all click handlers 
//bind your handler 
$("mySelector").click(function(e) { 
    if (myCondition) { 
     //do what you want 
    } else { 
     //call other handlers 
     if (clickEvents) { 
      for (var prop in clickEvents) 
       clickEvents[prop].call(this, e); 
     }   
    } 
}) 

更新:

  • 上面的代碼的jQuery 1.3.2
  • 以上代碼基於jQuery 1.3.2的內部實現,因此請在更新jQuery時仔細檢查。
相關問題