【问题标题】:How to trigger/refer a custom JavaScript object?如何触发/引用自定义 JavaScript 对象?
【发布时间】:2014-08-12 09:47:27
【问题描述】:

我在具有 #box id 的 div 内创建了一个 javascript animation 对象,但我的问题是我无法在函数之外引用动画对象。

http://codepen.io/vincentccw/pen/bfojB?editors=101

这是我的代码:

$('#box').each(function(index, element)
{
          var kkc = new TimelineLite({
            paused:true
          });

          kkc.to($("#box") , .4, {left:100,ease:Power1.easeInOut});

          element.animation = kkc; 

});

$('#box').on('mouseenter', function(){
    $('#box').animation.play(); //this doesn't work
});

【问题讨论】:

    标签: javascript jquery css object css-animations


    【解决方案1】:

    在您的示例中,您将 jQuery 对象与 DOM 对象混合在一起,您在一个地方使用一个,另一个在其他地方使用,由于它们不一样,您的代码不起作用。

    当你这样做时:

    element.animation = kkc; 
    

    您正在向 DOM 对象添加一个名为 animation 的自定义属性。

    当您尝试这样做时:

    $('#box').animation.play();
    

    您正在尝试访问不存在的 jQuery 对象上的自定义属性 animation


    如果您想坚持使用自定义 DOM 属性,可以使用以下代码:

    $('#box').on('mouseenter', function(){
        this.animation.play(); 
    });
    

    因为您的事件处理程序中的 this 是 DOM 对象。


    执行此操作的更多 jQuery 方式(避免将您自己的自定义属性添加到 DOM 对象)将是这样的:

    $('.box').each(function(index, element)
    {
              var kkc = new TimelineLite({
                paused:true
              });
    
              kkc.to($(this) , .4, {left:100,ease:Power1.easeInOut});
    
              $(element).data("animation", kcc); 
    
    });
    
    
    
    $('.box').on('mouseenter', function(){
        $(this).data("animation").play();
    });
    

    另外,我可能会问您为什么要使用 $('#box').each(),因为应该只有一个对象与 #box 选择器匹配,因此您不需要使用 .each() 进行迭代。

    【讨论】:

    • 感谢您的解释,实际上我只是在此示例中简化了我的问题,以便你们可以轻松理解我的问题,但没有意识到我使用 and id 而不是 class。我的实际代码实际上由 10 个不同的元素组成,我需要单独访问它们而不重复我的代码。这就是为什么我需要使用 .each() :)
    • 我已经使用您建议的 jquery 方式创建了另一个示例,但是,我似乎无法使其工作,并且出现此“无效的左侧分配”错误。 codepen.io/vincentccw/pen/Hiaqg?editors=101你能帮我解决这个问题吗?非常感谢
    • @VincentChua - 我在第一行 .data() 建议的代码(jQuery 方式)中有一个错字。我已经解决了。我还修改了 mouseenter 事件处理程序以使用 $(this),因此如果您使用事件处理程序监视多个项目,它将起作用,并且我已将代码切换为 .box 作为显示它的选择器可以使用多个元素。
    【解决方案2】:

    您可以使用.data() 将动画附加到元素。例如:

    var kkc = new TimelineLite({...});
    // ...
    $('#box').data("animation", kkc);
    
    
    $('#box').on('mouseenter', function(){
        $('#box').data("animation").play();
    });
    

    注意。您在示例中使用了$('#box').each(...),这意味着您希望在DOM 中有多个ID 为box 的元素。通常,ID 在 DOM 中应该是唯一的,因此我在此处的示例代码中删除了不必要的 each

    【讨论】:

    • 其实我的代码要复杂得多,上面的示例代码只是我草拟的,但没有意识到我应该使用class而不是id。是的,我确实需要使用 .each()。 :)
    • 这是有道理的。如果您确实有多个要操作的元素,请注意.data() 只会获取第一个元素的数据。因此,您需要执行以下操作来播放所有匹配元素的动画:$("selector").each(function(i, el) { $(el).data("animation").play(); })
    • 谢谢,这对我很有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 2012-11-06
    • 2016-04-05
    • 1970-01-01
    • 2013-02-21
    • 2013-02-03
    相关资源
    最近更新 更多