代码之家  ›  专栏  ›  技术社区  ›  Daniel Cotter

jQuery data()方法重置循环中以前设置的数据

  •  0
  • Daniel Cotter  · 技术社区  · 16 年前

    好的,我正在尝试将两段数据存储在一组被附加到父div的匿名div中:

    var $timepicker = $('<div class="timepicker"></div>');
    var startTime = new Date(0, 0, 0, 0, 0, 0, 0);
    var endTime = new Date(0, 0, 0, 23, 60 - settings.step, 0, 0);
    
    for (var time = startTime; time <= endTime; time.setMinutes(time.getMinutes() + 30)) {
        $timepicker.append($('<div></div>').data('time', time));
    }
    

    但是,在运行for循环之后,对于每个div,data的值('time')始终等于上次的值(显然,它应该等于最初设置的时间)。我在互联网上搜寻线索,但似乎没有其他人有这个问题。怎么回事?是因为我用的是匿名div吗?非常感谢你的帮助。

    谢谢,

    丹尼尔

    2 回复  |  直到 16 年前
        1
  •  1
  •   Daniel Cotter    16 年前

    对于那些好奇的人来说,结果发现它不起作用,因为JS拿着一个 参考 每个div中的时间,而不是传递的值。这是因为JS只将简单类型作为值传递;对象作为引用传递。解决方法是在每次迭代中实例化一个新的日期对象:

    var $timepicker = $('<div class="timepicker"></div>');
    var startTime = new Date(0, 0, 0, 0, 0, 0, 0);
    var endTime = new Date(0, 0, 0, 23, 60 - settings.step, 0, 0);
    
    for (var time = startTime; time <= endTime; time.setMinutes(time.getMinutes() + 30)) {
        $timepicker.append($('<div></div>').data('time', new Date(0, 0, 0, time.getHours(), time.getMinutes(), 0, 0)
    }
    
        2
  •  0
  •   psychotik    16 年前

    使用 appendTo . append

    $('<div></div>').appendTo($timepicker).data('time', time));