我正在尝试在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”
我尝试了很多东西,但我找不到好的解决方案。
提前致谢。
答案 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的答案将整个问题转化为使用泛化,这可能是一个更好的解决方案。