函数名中的数组

时间:2012-11-16 13:48:39

标签: javascript jquery timepicker

我正在尝试在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;
}

所以我只想拥有数组值而不是“Monday”

我尝试了很多东西,但我找不到好的解决方案。

提前致谢。

4 个答案:

答案 0 :(得分: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]
        });
    }
}

答案 1 :(得分: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;
}

答案 2 :(得分: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();

答案 3 :(得分:0)

通过调整用于回答String to jQuery.function

的括号表示法

你可以从当前对象中获取它:

onHourShow: this[day + "HourFuncStart"],

根据方法所在的范围,您可能必须通过方法所在的this,或者具体指向它们。但一般来说,括号表示法可以从字符串中获取函数,因为方法只是对象的属性。

虽然我必须说,Chad的答案将整个问题转化为使用泛化,这可能是一个更好的解决方案。