1

JSで小さな「営業時間」スクリプトを実行しようとしています。私はこれにタイムピッカーを使用していますが、毎日の機能が必要で、7回コピーして貼り付けたくない場合を除いて、すべて正常に機能します。

これは私のコードの一部です:呼び出し部分:

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

Putting them into an object is the best way, but mind that you create the function outside of the loop or store the required index in a closure. Otherwise the value of 'i' will have reached it's maximum by the time you run the function.
In your loop, var day = week[i]; will return undefined because i will have reached 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 に答える