【问题标题】:jQuery animation and live eventjQuery 动画和实时事件
【发布时间】:2013-11-07 21:58:39
【问题描述】:

我使用 AJAX 加载页面。该页面包含以下代码(对于 div 的移动动画,#1 将其向左移动,#2 将其再次向后移动)

#1 
$('#flipper').click(function () { 
      $(".l-l").animate({ "left": -267 }, 600, function () {
             $('#flipper').addClass('flipper-h'); 
       });
});

#2
$('#flipper.flipper-h').die(); //to prevent .live() event bubbling. I guess
$('#flipper.flipper-h').live('click', function () { 
    $(".l-l").animate({ "left": 0 }, 600, function () {
            $('#flipper').removeClass('flipper-h'); 
    });
});

使用该代码我有一些问题:

1) 第一页加载后,代码#2 在动画开始前有一点卡顿

2) 在第二个(以及更多)页面加载后,#2 代码不会触发。为什么?

编辑

我注意到代码 #2 被无限次调用(这很奇怪)。但是,我已经通过代码修复了 1) 的情况:

$('#flipper').click(function () {
        if(!$(this).hasClass('flipper-h')) {
                $(".l-l").animate({ "left": -267 }, 600, function () {
                $('#flipper').addClass('flipper-h');
            }); 
        } else {
            $(".l-l").animate({ "left": 0 }, 600, function () {
                $('#flipper').removeClass('flipper-h');
             });
       }
});

但问题 2) 仍未解决。有什么想法吗?

【问题讨论】:

  • live() 已被so 弃用。 stackoverflow.com/questions/9422069/…
  • 好的,现在是$('div').on('click', '#flipper.flipper-h', ....)
  • 不是因为你有 $('#flipper') 选择器和 $('#flipper.flipper-h') 选择器,所以在第二种情况下,两个动画都被调用,看起来像没有移动全部? (也许我错了......)我猜没有阻止事件冒泡......
  • 刚刚阅读,die() 也被弃用了(与 live 相同)
  • 你能发布你的 ajax 是如何工作的,或者至少你的页面有一些状态吗?

标签: javascript jquery ajax


【解决方案1】:

EDIT3:考虑这两个代码:

http://jsfiddle.net/2zEZT/2/

http://jsfiddle.net/2zEZT/3/

在第一个示例中,当您使用删除按钮时,元素会被删除,其中的元素看起来相同,但实际上并非如此。事件丢失。

在第二个中,元素被删除,但点击事件在此之后再次绑定......

EDIT2:根据您的编辑,尝试改用此功能。它可以表现得更好......

$('#flipper').click(function () {
    if ($(this).hasClass('flipper-h')) {
        $(this).removeClass('flipper-h');
        $(".l-l").animate({
            "left": 0
        }, 600);
    } else {
        $(this).addClass('flipper-h');
        $(".l-l").animate({
            "left": -267
        }, 600);
    }
});

编辑:我建议你仍然使用 jQuery 1.7,所以我做了一些调查。

首先,您将事件 onclick 放在#flipper 上。

然后你在#flipper.flipper-h 元素上调用die。这应该破坏所有现场活动。

之后,您在#flipper.flipper-h 元素上进行了实时事件,这意味着所有存在和将要存在的元素都会有此事件。

现在首先点击: 动画左侧:-267 发生, 然后回调将#flipper变成#flipper.flipper-h, 然后将直播事件绑定到新的#flipper.flipper-h,

第二次点击: 动画左侧:-267 发生,但它已经存在,所以什么都没有发生 然后回调确实#flipper变成#flipper.flipper-h,所以什么也没有发生, 现在事件仍在冒泡,所以剩下的第二个动画:600ms 后触发 0(这可能是你的冻结) 现在回调删除 .flipper-h

现在我不知道您的 ajax 究竟是如何工作的,但似乎 die 函数会永远从 #flipper 中删除实时事件。所以不能再触发了……

die 函数不能防止冒泡。它会删除实时事件。 return falseevent.stopPropagation

【讨论】:

  • 我正在使用 jQuery v1.10.2。请参阅我的帖子编辑 - 即使我从 $('#flipper').click(function () {}) 更改为 $('#flipper').on('click', function () { }) 问题 2) 仍然存在。我的 ajax 函数只是将页面加载到 div 容器
  • 是那个容器的鳍状肢部分吗?在这种情况下,单击功能绑定到元素。所以删除元素并再次添加类似元素并不意味着它会有那个事件。如果您使用 html() 或 innerHtml() 函数将其删除,则单击事件将丢失...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 2013-07-18
  • 1970-01-01
  • 2017-01-19
相关资源
最近更新 更多