【问题标题】:how to incorporate a function within a function如何在函数中合并函数
【发布时间】:2012-04-09 01:41:27
【问题描述】:

我用新日期创建的字符串日期更新了我的代码,并添加回了 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'); 
    } 
});

});

【问题讨论】:

  • 正确缩进代码可提高可读性。
  • 您在unavailableDays 之前缺少关键字function!会不会是问题?你没有收到错误吗?
  • 它在我的页面中,它没有正确复制。对不起。修复了这个问题和缩进。
  • 抱歉,到底是什么问题?哪些部分有效/哪些无效,或者您想让它做什么需要帮助?没有什么是公然的问题……
  • 该范围不适用于禁用日历上的日期。阵列工作正常。现在我只需要让他们一起工作。

标签: javascript jquery arrays function range


【解决方案1】:

在您的函数中,dates.push 必须是 date.push

【讨论】:

  • 有时候,JavaScript 会因为一个字符而让你头疼!
  • 感谢 Scott,我已解决此问题,但仍有问题。
【解决方案2】:

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

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
}

【讨论】:

  • 是否需要将 createDateRange 和 availableDays 函数放入 someOtherFunction 中,并在其中声明除上述变量之外的变量?
  • @bklynM 您不必将一个函数放在另一个函数中。你可以,但是你使内部函数对其他函数不可用。 (有时这是一件好事,但这不是你想要的。)
  • 如何将数组包含在新函数中,以便将其添加到 someDateRange 的范围中?谢谢。
  • @bklynM 可能是通过将它们作为函数的参数。
  • 喜欢添加... var someDateArray = createDateArray ["date array"];然后与上面的 for 和 if 语句相同? js新手,所以不确定参数应该说什么。非常感谢任何帮助。
【解决方案3】:

在另一个函数中包含一个函数没有问题,JavaScript 几乎就是基于此。你也可以有单独的函数,它也可以工作。

更新

(考虑到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/

【讨论】:

  • 这是我的问题,是的。我需要禁用数组字符串和范围。我更新了上面的代码,但又在 if 语句中添加了代码。两种日期类型的处理方式相同是有道理的,但它现在不适用于字符串或范围。会不会是我的 datepicker 代码中的某些东西(请参阅上面的更新)?谢谢。
  • @bklynM,仔细看看我的示例代码。当您使用yymmdd 时,您仍在尝试将日期与字符串进行比较。我的代码做的不同。
  • 问题是我需要将日期与字符串匹配,以便在用户选择日期时调用适当的图像。所以它必须匹配 yy-mm-dd 才能得到 yy-mm-dd.jpg。我是新手,所以我绝对可以用这种方式解释。我只知道字符串禁用了日期,但范围没有,而且我不知道如何在不可用的日子里让范围“读取”,所以我可以在 beforeShowDays 中使用它。再次感谢。
  • 我一直在玩这个代码,但我不明白为什么这些测试并非全部返回 false。 1978-08-11 也应该是假的,因为它在 78 年 8 月到 11 月之间的范围内。另一个问题是我的整个日期选择器日期现在都被禁用了。谢谢。
  • @bklynM, 1978-08-11 返回true,因为createDateRange 不会创建两个过去日期之间的完整范围。它采用第一个日期并以一周的间隔 (j.getDate() + 7) 创建新日期,直到结束日期。这就是您的原始代码所做的,我没有触及那部分。至于您的日期选择器,问题可能与该代码有关,也可能与该代码无关。你应该发布一个单独的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 2011-05-04
  • 2022-06-15
相关资源
最近更新 更多