2012-04-09 130 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

相關問題