2010-10-16 43 views
1

我有一個2文本輸入和2個跨度控件的窗體。通常,當文本框A被改變時,事件被觸發以改變範圍A,並且當文本框B被改變時,事件被觸發以改變範圍B.有沒有辦法在不使用全局變量的情況下突破jQuery中的事件遞歸?

然而,在一個特例中,我希望改變文本框A或文本框B更新跨度A和B.我試圖在這種情況下將事件連接到相應的控件,但它不起作用,因爲在事件構建代碼中設置了很多狀態(更不用說每個事件調用'this',如果它是從不同於預期的那一個發射出來的,會使邏輯使用錯誤的控制)。爲了使事情變得簡單,最好在創建時向事件處理程序傳遞一個字符串(代表其他文本輸入ID),然後在第二個控件上手動調用change()事件。但是,這使得事物處於遞歸的無限循環中。我想到一種避開遞歸的方法,但它需要一個全局變量。

有沒有比這更好的方法,最好是一個不需要全局變量?

ml_inEvent = false; 



    $ctlToVal.bind('keyup change', {feedbackCtl: ml_feedback, controlsToMonitor: ary, validationGroup: this.validationGroup, controlToFire: ctlToFire}, function(event) { 
     // Other processing happens here... 

     if (event.data.controlToFire != '') { 
      var $controlToFire = $('#' + event.data.controlToFire); 
      if ($controlToFire.length) { 
       // Use a global variable to ensure this event is not fired again 
       // as a result of calling the other one 
       if (!ml_inEvent) { 
        ml_inEvent = true; 
        $controlToFire.change(); 
        ml_inEvent = false; 
       } 
      } 
     } 
    }); 

回答

2

您可以使用.trigger()的extraParameters參數打出來,例如:

$ctlToVal.bind('keyup change', {feedbackCtl: ml_feedback, controlsToMonitor: ary, validationGroup: this.validationGroup, controlToFire: ctlToFire}, function(event, fire) { 
    // Other processing happens here... 
    if(fire !== false) $('#' + event.data.controlToFire).trigger('change', false); 
}); 

You can give it a try here。這樣做是事件處理的回調不僅接收event object而且任何其他參數你傳遞,在這種情況下,我們只是使用簡單false!===檢查這重要的,所以undefined(在未傳遞的參數所有)仍然改變這兩個控件。因此,例如$("#control").change()會更改兩個控件,但仍然沒有循環... you can test that here

+0

謝謝 - 我認爲它應該是這樣簡單! – NightOwl888 2010-10-16 11:32:41

相關問題