2015-11-01 81 views
1

我不能完全想到如何将两个几乎完全相同的init监听器,jQuery函数合并为一个。不能将两个jQuery函数合并为一个函数

VARIANT 1(可行)。 №1工作,但它看起来像一件坏事:

// Checkbox 
var matchesWithEmail = document.getElementById('matchesWithEmail'); 
// Checkbox 
var matchesWithEmail2 = document.getElementById('matchesWithEmail-2'); 

jQuery(matchesWithEmail).on('change', function (e) { 
    var current = e.target; 
    var checked = current.checked; 

    matchesWithEmail2.checked = checked; 
}); 

jQuery(matchesWithEmail2).on('change', function (e) { 
    var current = e.target; 
    var checked = current.checked; 

    matchesWithEmail.checked = checked; 
}); 

VARIANT 2(不完全可行)。 我也试图减少,但它我收到坏主意的结果,它给出错误有时工作:

var matchesWithEmail = [document.getElementById('matchesWithEmail'), document.getElementById('matchesWithEmail-2')]; 
matchesWithEmail.forEach(function (element) { 
    jQuery(element).on('change', function (e) { 
     var current = e.target, 
      checked = current.checked, 
      allExceptCurrent = matchesWithEmail.filter(function (element) { 
       return element !== current; 
      }); 

     allExceptCurrent.forEach(function (element) { 
      jQuery(element).off('change'); 

      element.checked = checked; 
      jQuery(element).on('change', function (e) { 
       var current2 = e.target, 
        checked2 = current2.checked, 
        allExceptCurrent2 = matchesWithEmail.filter(function (element) { 
         return element !== current2; 
        }); 
       allExceptCurrent2.forEach(function (element) { 
        jQuery(element).off('change'); 
        element.checked = checked2; 
       }); 
      }); 
     }); 
    }); 
}); 

请告诉我这两个功能如何减少紧凑?

+0

嗯不知道我知道,你想保留两个?还是只有一个?并且您希望我们审查您的代码,并告诉您如何改进它? – LiranBo

+0

“减少它”是什么意思?将两者结合为一体?添加关于您想要完成的内容的说明可能会有所帮助。 –

+0

是的,我试图改善它,因为我的变体是坏的,我知道它,但意外的是我不能提出一个很好的解决方案。直到** jfriend00 **提供了一个优雅的解决方案。我不明白为什么没有想到它自己。谢谢! – user3688243

回答

1

您可以参考this来引用创建事件并获取其属性的对象。这意味着,你可以这样做:

var matches = jQuery("#matchesWithEmail, #matchesWithEmail-2"); 
matches.on('change', function(e) { 
    // set both objects to have the checked value from the one that just changed 
    matches.prop("checked", this.checked); 
}); 

这将执行以下操作:

  1. 创建一个既指匹配对象的单一jQuery对象。
  2. 为两个对象上的'change'事件注册一个事件处理程序。
  3. 当该事件触发时,它确保两个对象的checked属性设置为刚刚更改的属性(因此两个对象将相互跟踪)。
  4. 为简化起见,这只是为两个对象设置了checked属性,即使不需要设置当前对象。你可以使用.not(this)来过滤掉this对象,但是没有任何意义。例如,你可以这样做:

代码:

var matches = jQuery("#matchesWithEmail, #matchesWithEmail-2"); 
matches.on('change', function(e) { 
    matches.not(this).prop("checked", this.checked); 
}); 
+0

优雅的解决方案! – user3688243