代码之家  ›  专栏  ›  技术社区  ›  NightOwl888 Jabrwoky

在jQuery中有没有一种方法可以在不使用全局变量的情况下中断事件递归?

  •  2
  • NightOwl888 Jabrwoky  · 技术社区  · 15 年前

    我有一个带有两个文本输入和两个跨度控件的表单。通常,当文本框A被更改时,会触发一个事件来更改范围A,而当文本框B被更改时,会触发一个事件来更改范围B。

    为了简单起见,最好在创建事件处理程序时将字符串(表示其他文本输入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;
                    }
                }
            }
        });
    
    1 回复  |  直到 15 年前
        1
  •  3
  •   Nick Craver    15 年前

    可以在上使用extraParameters参数 .trigger() 要爆发,例如:

    $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