2014-06-27 152 views
0

我在寫一個計算最大高度/寬度並使元素高度/寬度相同的函數。我想通過2個參數給這個函數:將jquery函數作爲可變參數傳遞給自定義函數

1. The selector, which can be(element, class) 
2. jQuery `width()`/`height()` function 

和所期望的結果應該是,它看起來像功能..

Eg 1. equalDimensions('.class', width()); OR 
Eg 2. equalDimensions(div, height()); 

和基於什麼是傳遞給函數width()/height()它將計算最大高度/寬度,並將所有選擇器作爲第一個參數傳遞相等的寬度/高度。

作爲jQuery的新手,我很努力地將它放入代碼中。

這是我到目前爲止已經試過......

var equalDimension = function( selector, fn){ 
    var dimension = fn(); 
    var biggestDimemsion = 0; 
    $(selector).each(function(){ 
     if($(this).dimension > biggestDimemsion){ 
      biggestDimemsion = $(this).dimension; 
     } 
    }); 
    $(selector).each(function(){ 
     $(this).dimension(biggestDimemsion); 
    }); 
}; 
+0

目前我使用兩個單獨的自定義函數來獲取相同的高度和寬度,只是將選擇器作爲參數傳遞並且它工作正常,但是創建一個函數並將寬度/高度函數傳遞爲第二個參數。 – user2563864

回答

5

我寫的我會怎樣解決這個問題一個簡單的例子:

http://jsfiddle.net/3NRah/

var equalDimension = function (selector, fn) { 
    var $elements = $(selector), 
     dimensions = $elements.map(function (i) { 
      return $elements.eq(i)[fn](); 
     }), 
     maxDimension = Math.max.apply(Math, dimensions); 
    $elements[fn](maxDimension); 
}; 

equalDimension('div', 'height'); 

這假定您傳遞的是jQuery函數的名稱,而不是函數本身。如果你想通過實際的功能,它應該是這樣的:

http://jsfiddle.net/3NRah/1/

var equalDimension = function (selector, fn) { 
    var $elements = $(selector), 
     dimensions = $elements.map(function (i) { 
      return fn.call($elements.eq(i)); 
     }), 
     maxDimension = Math.max.apply(Math, dimensions); 
    fn.call($elements, maxDimension); 
}; 

equalDimension('div', $.fn.height); 

編輯:若要在此乾淨UI方面,我想最可能添加爲在下面的JSBin中。

http://jsbin.com/pogujozane/edit?js,output

$.fn.equalDimension = function (fn) { 
    var $elements = $(this), 
     dimensions = $elements.map(function (i) { 
      return $elements.eq(i)[fn](); 
     }), 
     maxDimension = Math.max.apply(Math, dimensions); 
    $elements[fn](maxDimension); 
}; 
$.fn.equalHeight = function() { 
    return $(this).equalDimension('height'); 
}; 
$.fn.equalWidth = function() { 
    return $(this).equalDimension('width'); 
} 

,以便它可以這樣調用:

$('div').equalHeight(); 
+0

比我的(現在刪除的)答案要乾淨得多。 –

+0

輝煌。你的解決方案都很完美。謝謝羅伯特。只是想從jQuery的角度來看,哪一個更好一些,使用字符串或函數作爲參數,以及爲什麼(如果您可以請解釋原因) – user2563864

+0

我不確定是否比其他 - 但我確實認爲你得到的錯誤對於第二種解決方案會更加明顯 - 它只是要求你知道jQuery的功能在哪裏。 –

0

你真的應該傳遞一個刺,而不是一個函數的和做somthine這樣的:

var equalDimension = function( selector, fn){ 
    var dimension = fn === 'width' ? 'width' : 'height'; //Prevent from runing any other jQuery functions 
    var biggestDimemsion = 0; 
    $(selector).each(function(){ 
     if($(this)[dimension]() > biggestDimemsion){ 
      biggestDimemsion = $(this).dimension; 
     } 
    }); 
    $(selector).each(function(){ 
     $(this)[dimension](biggestDimemsion); 
    }); 
}; 

equalDimension('selector', 'width'); 

注意,第二個可以忽略:

var equalDimension = function( selector, fn){ 
    var dimension = fn === 'width' ? 'width' : 'height'; //Prevent from runing any other jQuery functions 
    var biggestDimemsion = 0; 
    $(selector).each(function(){ 
     if($(this)[dimension]() > biggestDimemsion){ 
      biggestDimemsion = $(this).dimension; 
     } 
    }); 
    $(selector)[dimension](biggestDimemsion); 
};