2010-10-16 51 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

相关问题