2015-11-01 55 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