2012-04-09 131 views
0

我更新了我的代码,它使用新日期创建的字符串日期并添加回if语句中。这不是禁用字符串或范围。我也添加了日期选择器代码。如何在一个函数中包含一个函数

function unavailableDays(date) { 

function createDateRange(first, last) { 
    var dates = []; 
    for(var j = first; j < last; j.setDate(j.getDate() + 7)) { 
     dates.push(new Date(j.getTime())); 
    } 
    var alwaysDisabled = [new Date("1963-3-10T00:00:00"), new Date("1963-3-17T00:00:00"), new Date("1963-3-24T00:00:00"), new Date("1963-3-31T00:00:00"), new Date("1965-9-18T00:00:00")]; 
    return dates.concat(alwaysDisabled); 
} 

var disabledDays = createDateRange(new Date("1978-8-10T00:00:00"), new Date("1978-11-5T00:00:00")); 

var yy = date.getFullYear(), mm = date.getMonth(), dd = date.getDate(); 
    for (i = 0; i < disabledDays.length; i++) { 
    if($.inArray(yy + '-' + (mm+1) + '-' + dd,disabledDays) != -1 || new Date() < date) { 
     return [false]; 
    } 
} 
    return [true]; 
} 

$(document).ready(function(){ 
$('.selector').datepicker({ 
    inline: true, 
    dateFormat: 'yy-mm-dd', 
    constrainInput: true, 
    changeYear: true, 
    changeMonth: true, 
    minDate: new Date(1940, 1-1, 1), 
    maxDate: new Date(2011, 10-1, 24), 
    beforeShowDay: unavailableDays,  
    onSelect: function(dateText, inst) { 
      $("#img").attr("src", "http://www.example.com" + dateText + ".jpg"); 
     var chosenDates = $.datepicker.parseDate('yy-mm-dd', dateText); 
     var backToString = $.datepicker.formatDate('MM dd' + ',' + ' yy', chosenDates); 
     $('.info').html('You are viewing:' + '<br />' + 
      backToString).addClass('background'); 
    } 
}); 

});

+2

缩进代码可以提高可读性。 – 2012-04-09 01:42:55

+3

您在'unavailableDays'之前缺少关键字'function'!这可能是问题吗?你没有收到错误吗? – bfavaretto 2012-04-09 01:43:45

+0

这是在我的页面,它没有正确复制。抱歉。修正了这个和缩进。 – amespower 2012-04-09 01:46:28

回答

0

有在具有没有问题函数在另一个里面,JavaScript基本上是基于这个的。你也可以有单独的功能,它也可以工作。

UPDATE

(考虑到datedates问题是固定的)

这里是什么似乎是问题(这是你的问题似乎什么是真正关心,里面没有功能函数!):createDateRange返回一个Date对象的数组,但您的其他版本(var disabledDays = ["1963-3-10", ...)是一个字符串数组(并且格式不能被new Date(str)解析)。

你目前的循环似乎试图处理这个字符串版本,它的工作原理,但你想createDateRange总是忽略某些日期(据我了解你在说什么)。所以,试试这个:

function unavailableDays(date) { 

    function createDateRange(first, last) { 
     var dates = []; 
     for(var j = first; j < last; j.setDate(j.getDate() + 7)) { 
      dates.push(new Date(j.getTime())); 
     } 
     var alwaysDisabled = [new Date("1963-03-10T00:00:00"), new Date("1963-03-17T00:00:00"), new Date("1963-03-24T00:00:00"), new Date("1963-03-31T00:00:00"), new Date("1965-09-18T00:00:00")]; 
     return dates.concat(alwaysDisabled); 
    } 

    var disabledDays = createDateRange(new Date("1978-08-10T00:00:00"), new Date("1978-11-05T00:00:00")); 
    for (i = 0; i < disabledDays.length; i++) { 
     if(disabledDays[i].getTime() == date.getTime()) { 
      return false; 
     } 
    } 
    return true; 

} 

// Use `T00:00:00` after the date to set it as GMT, or 
// dates can be interpreted as the previous day on some timezones. 
var testDate1 = new Date('1978-08-10T00:00:00') 
console.log("-- " + unavailableDays(testDate1)); // false 
var testDate2 = new Date('1978-08-11T00:00:00') 
console.log("-- " + unavailableDays(testDate2)); // true 
var testDate3 = new Date('1978-08-17T00:00:00') 
console.log("-- " + unavailableDays(testDate3)); // false 
var testDate4 = new Date('1963-03-10T00:00:00') 
console.log("-- " + unavailableDays(testDate4)); // false 

http://jsfiddle.net/t4ahF/4/

+0

这是我的问题,是的。我需要禁用数组字符串和范围。我更新了上面的代码,但在if语句中添加了该代码。有意义的是,两种日期类型都被视为相同,但现在不适用于字符串或范围。难道它是我的日期选择器代码中的东西(请参阅上面的更新)?谢谢。 – amespower 2012-04-09 11:27:07

+0

@bklynM,仔细看看我的示例代码。在使用'yy','mm'和'dd'时,您仍然试图将日期与字符串进行比较。我的代码做不同。 – bfavaretto 2012-04-09 13:29:58

+0

事情是我需要将日期匹配到字符串以获取适当的图像以便在用户选择日期时调用。所以它必须匹配yy-mm-dd才能获得yy-mm-dd.jpg。我是新手,所以我绝对可以这样解释。我只知道该字符串是禁用日期,但范围不是,我不知道如何让范围'不可读'在unavailableDays,所以我可以在beforeShowDays使用它。再次感谢。 – amespower 2012-04-09 14:20:49

1

因此,看来你只是想分离出功能:

function createDateRange(first, last) { 
    var date = []; 
    for(var j = first; j < last; j.setDate(j.getDate() + 7)) 
     dates.push(new Date(j.getTime())); 
    return date; 
} 

function unavailableDays(date) { 
    var disabledDays = createDateRange(new Date("1978-08-10"), new Date("1978-11-05")); 

    //date array to be disabled 
    var disabledDays = ["1963-3-10", "1963-3-17", "1963-3-24", "1963-3-31", "1965-9-18"]; 
    var yy = date.getFullYear(), mm = date.getMonth(), dd = date.getDate(); 
    for (i = 0; i < disabledDays.length; i++) { 
     if($.inArray(yy + '-' + (mm+1) + '-' + dd,disabledDays) != -1 || new Date() < date) { 
      return [false]; 
     } 
    } 
    return [true]; 
} 

这将允许您使用createDateRangeunavailableDays另一个函数内部:

function someOtherFunction() { 
    var someDateRange = createDateRange(new Date('1979-10-10'), new Date('1980-01-01')); 
    … // stuff 
} 
+0

将someDtherFunction中的createDateRange和unavailableDays函数与除上述之外声明的变量放在一起是必要的吗? – amespower 2012-04-09 02:13:16

+0

@bklynM您不必将一个函数放在另一个函数内。你*可以*,但是你让内部函数对其他函数不可用。 (有时候这是件好事,但这不是你想要的。) – kojiro 2012-04-09 03:36:01

+0

如何将数组包含在新函数中,以便将其添加到someDateRange范围中?谢谢。 – amespower 2012-04-09 03:46:05

3

在你的函数,dates.push需求是date.push

+0

有时候,JavaScript会因为单个角色而让你头疼! – 2012-04-09 02:35:06

+0

谢谢Scott,我解决了这个问题,但仍然存在问题。 – amespower 2012-04-09 02:44:27

相关问题