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;
}

所以我只想拥有数组值而不是“星期一”

我尝试了很多事情,但我没有找到好的解决方案。

提前致谢。

4

4 回答 4

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]
        });
    }
}
于 2012-11-16T13:58:14.207 回答
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;
}
于 2012-11-16T13:59:01.803 回答
0

将它们放入对象中是最好的方法,但请注意您在循环之外创建函数或将所需的索引存储在闭包中。否则,当您运行该函数时,“i”的值将达到最大值。
在您的循环中,var day = week[i];将返回未定义,因为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();
于 2012-11-16T14:06:32.353 回答
0

通过将括号表示法用于将字符串回答为 jQuery.function

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

onHourShow: this[day + "HourFuncStart"],

根据方法所在的范围,您可能必须传递this方法所在的位置,或者专门指向它们。但总的来说,方括号表示法可以从字符串中提取函数,因为方法只是对象的属性。

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

于 2012-11-16T14:07:07.547 回答