1

我有一个启动一堆计时器的函数调用,我想为每个计时器添加几分钟,这样它们就不会全部从零开始。我取得了成功:

var currentDate = new Date();
var twentyMinutesLater = new Date(currentDate.getTime() + (20 * 60 * 1000));
new CountUp(twentyMinutesLater, 'counter03');

我很想跳过为我想要的所有计时器创建 var 二十分钟等,我只是无法获得正确的语法,或者这可能是不可能的。有没有办法在下面的函数调用中添加毫秒。

new CountUp(new Date(), 'counter03');

我试过了:

new CountUp((new Date() + (20 * 60 * 1000)), 'counter03');

结果 NaN NaN:NaN:NaN 所以它不是数字 双引号的结果相同。

那里有任何 javascript 语法大师有任何想法吗?

4

4 回答 4

3

应该执行以下操作:

var d = new Date();
new CountUp(d.setMinutes(d.getMinutes() + 20), 'counter03'); 

根据 CountUp 构造函数如何使用传递给它的日期对象,以及是否要重用d,您可能需要:

var d = new Date();
new CountUp(new Date(d.setMinutes(d.getMinutes() + 20)), 'counter03'); 

这样每次调用CountUp都会获得不同的日期对象。

于 2012-01-17T00:34:02.937 回答
2

在您的特定代码中,您将 Date 对象传递给计数器代码,这不是预期的。它期望一个时间值,它将从中生成它自己的 Date 对象(您可以在 Counter 函数的构造函数中看到它)。另外,计数器代码在未来不会占用时间,只会占用过去的时间(也许是因为它不想处理负时间 - 我不知道)。

这是一个工作示例,我在其中修改了在回答您的其他问题时使用的其他 jsFiddle

function addCounter() {
    var currentDate = new Date();
    var twentyMinutesLater = currentDate.getTime() - (20 * 60 * 1000);
    var div = document.createElement("div");
    div.id = "counter" + counterNum++;
    document.body.appendChild(div);
    new CountUp(twentyMinutesLater, div.id);
}

而且,这是一个 jsFiddle,它可以让您输入分钟数,它会在该值处启动一个计数器:http: //jsfiddle.net/jfriend00/vnf5z/

于 2012-01-17T00:12:57.967 回答
0

我在 Rails 中看到的另一种方法。您将使用此语法创建相对日期对象,

(20).minutes().fromNow()

或者,如果您讨厌括号中的噪音,您可以这样做(仅在兼容 ES5 的浏览器上),

(20).minutes.fromNow

这是第一个在 Number 原型上添加方法的非 ES5 解决方案。

Number.prototype.minutes = function() {
    // minutes to milliseconds
    return this * 60 * 1000;
};

Number.prototype.fromNow = function() {
    var futureDate = new Date(Date.now() + this);
    return futureDate;
};

new CountUp((20).minutes().fromNow(), 'foo')

这是添加函数支持属性的 ES5 解决方案。

Object.defineProperties(Number.prototype, {
    minutes: {
        get: function() {
            // minutes to milliseconds
            return this * 60 * 1000;
        }
    },
    fromNow: {
        get: function() {
            var futureDate = new Date(Date.now() + this);
            return futureDate;
        }
    }
});

new CountUp((20).minutes.fromNow, 'foo')

关于原生对象的扩展有不同的思想流派。一组不惜一切代价禁止它,而另一组则鼓励几乎在任何地方使用它。与任何事情一样,取得平衡很重要。

于 2012-01-17T00:58:46.330 回答
0

new Date() 确实返回一个对象而不是时间戳,所以你不应该在那里使用数学运算(至少没有加法,当你期望一个数字作为结果时)。使用 Date.getTime() :

//when you need a Date-object as argument
  new CountUp(new Date(new Date().getTime() + (20 * 60 * 1000)) , 'counter03');
//when you need the timestamp as argument
  new CountUp((new Date().getTime() + (20 * 60 * 1000)) , 'counter03');

查看小提琴以识别差异:http: //jsfiddle.net/doktormolle/8v4Tx/

于 2012-01-17T00:13:29.970 回答