2012-11-16 23 views
1

我想在JS中做一個小的「開放時間」腳本。我使用timepicker這個和所有的工作正常,但我想每天都有一個函數,我不想複製粘貼七次。函數名中的數組

這是我的代碼的一部分: 呼叫部分:

jQuery(document).ready(function() { 
    var week = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']; 
    for (var i = 0; i < week.length; i++) { 
     day = week[i]; 

     jQuery('#' + day + '_start1').timepicker({ 
      showLeadingZero: false, 
      onHourShow: MondayHourFuncStart, 
      //I want to add the day name instead of Monday 
      onMinuteShow: MondayMinFuncStart //I want to add the day name instead of Monday 
     }); 
    } 

功能部分:

week = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']; 
for (var i = 0; i < week.length; i++) { 

    function MondayHourFuncStart(hour) //I want to add the day name instead of Monday { 
    var day = week[i]; 
    var tpEndHour = jQuery('#' + day + '_end1').timepicker('getHour'); 
    // all valid if no end time selected 
    if (jQuery('#monday_end1').val() == '') { 
     return true; 
    } 
    // Check if proposed hour is prior or equal to selected end time hour 
    if (hour <= tpEndHour) { 
     return true; 
    } 
    // if hour did not match, it can not be selected 
    return false; 
} 

所以,我只是想有數組值,而不是 「星期一」

我嘗試了很多東西,但沒有找到好的解決方案。

在此先感謝。

+0

你能否提一下你想使用數組索引而不是字符串? – ryadavilli

+0

你有一個塊中的函數聲明。這是無效的開始。但即使它是有效的,它也沒有意義。你只是覆蓋循環中的相同功能。 –

+3

@ user1689607他想要爲每個迭代創建一個不同的函數,例如,MondayHourFunc,TuesdayHourFunc等。最好是使用包含函數的屬性填充對象。 –

回答

1

如何使用該函數是這樣的:

jQuery('#' + day + '_start1').timepicker({ 
    showLeadingZero: false, 
    onHourShow: FuncStart(day), 
    onMinuteShow: FuncStart(day) 
}); 

然後重新定義FuncStart返回相應的功能。例如:

function FuncStart(dayarg){ 

    //define functions 
    function dynamicfunction(hour){ 
     var day = dayarg; 
     var tpEndHour = jQuery('#' + dayarg + '_end1').timepicker('getHour'); 
     // all valid if no end time selected 
     if (jQuery('#' + dayarg + '_end1').val() == '') { 
      return true; 
     } 
     // Check if proposed hour is prior or equal to selected end time hour 
     if (hour <= tpEndHour) { 
      return true; 
     } 
     // if hour did not match, it can not be selected 
     return false; 
    } 
    return dynamicfunction; 
} 
+0

這是一個好主意,但我仍然需要定義每個函數7次。我每天有4個功能(func hour start,func hour end,func minutes start和func minutes ends)。我不想在我的文檔中使用28個函數。 – Kaherdin

+0

@Kaherdin你不需要重新定義函數7次。基於當天,您可以對實際功能進行更改。所以只需定義一個具有依賴於'day'值的某些細節的函數並返回它。 –

+0

@Kaherdin查看我編輯的版本 –

2

把它們放在一個對象:

//object containing all the week's functions 
var funcs = {}, 
    days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']; 

//build the functions for each day 
for(var i = 0; i < days.length; i++) { 
    funcs[days[i]] = function() { 
     //stuffs 
    } 

    //or for multiple events/functions, something like 
    funcs[days[i]] = { 
     onHourShow: function() {}, 
     onMinuteShow: function() {} 
    }; 
} 

jQuery(document).ready(function() { 
    var week = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']; 
    for (var i = 0; i < week.length; i++) { 
     day = week[i]; 

     jQuery('#' + day + '_start1').timepicker({ 
      showLeadingZero: false, 
      onHourShow: funcs[day], //or funcs[day].onHourShow, depending on which you do above 
      onMinuteShow: funcs[day] 
     }); 
    } 
} 
+0

這裏有一個限制,在'funcs [days [i]]'函數中,賦值'var day = week [i];'不起作用。 – robC

+0

@robc yup,OP代碼需要相應調整。我只是用一個對象來演示函數,而不是構建全局的命名函數。您的實施可能有所不同 – Chad

+0

謝謝,爲了理想,我稍後會對它進行測試。 Asad的解決方案現在適用於我,它具有相同的概念。 – Kaherdin

0

將它們放入一個對象是你創建的功能循環之外或存儲在一個閉合所需指標的最佳方式,但頭腦。否則,在運行該函數時,'i'的值將達到最大值。
在你的循環,var day = week[i];將返回undefined,因爲i將達到week.length。

var fns = {}, 
    week = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']; 

function makeDayFn(i){ 
    return function(){ 
     console.log(week[i]); 
    } 
} 

for(var i=0,len=week.length;i<len;i++){ 
    fns[week[i] + "HourFuncStart"] = makeDayFn(i); 
} 

fns.mondayHourFuncStart(); 
fns.tuesdayHourFuncStart(); 
fns.wednesdayHourFuncStart(); 
0

通過調整支架的表示法用來回答String to jQuery.function

你可以從當前對象得到它:

onHourShow: this[day + "HourFuncStart"], 

根據其中該方法是在範圍內,您可以將必須通過方法所在的this,或者專門指向它們。但通常,括號表示法可以從字符串中獲取函數,因爲方法只是對象的屬性。

雖然我必須說,乍得的回答轉換問題的全部使用泛化,這可能是一個更好的解決方案。