【问题标题】:Detecting jQuery .stop()检测 jQuery .stop()
【发布时间】:2011-05-19 18:01:25
【问题描述】:

我正在创建一个 jQuery 插件,它向元素添加一些自定义动画,我想检测何时在该元素上调用 .stop() 方法。这是一个例子:

(function( $ ){
    $.fn.myAnimation = function() {
        var myInterval = setInterval(function() {
            // Do animation stuff
            if (.stop() == true) {
                clearInterval(myInterval);
            {
        });
    });
});

$(".element").myAnimation();
$(".element").stop();

所以我的问题是,我该怎么做:

if (.stop() == true)

或者有没有办法通过这样的事件处理程序来做到这一点:

this.bind("stop", function() {});

或者我完全错误的方式?

非常感谢
斯蒂芬

【问题讨论】:

  • 连"stop"都没有,不能和bind一起使用。 .stop() 方法返回一个不是布尔值的对象。

标签: jquery jquery-plugins jquery-animate


【解决方案1】:

我假设您想检查元素是否为动画。如果是这样,您可以使用jQuery's :animated selector

if( this.is(':animated') ) {...

如果您希望取消间隔,您可能只需将其作为自定义方法构建到 API 中,用户调用该方法将停止动画,调用 clearInterval

【讨论】:

  • 所以jQuery会在动画开始时添加这个选择器,然后在动画停止时移除它?
  • @GateKiller - 如果调用它的元素当前正在动画,则选择器将匹配。当动画停止时,它不再匹配。在仔细查看您似乎想要做的事情后,我更新了我的答案。我认为最安全的方法是有一种特定于停止动画和清除间隔的任务的方法。
  • @Patrick 这似乎正是我所需要的。问题是,如何将 ":animated" 选择器添加到自定义动画开始的元素中?
  • @Patrick 我一直在四处寻找,但仍然找不到添加 :animated 选择器的方法。如果您有更多信息,将不胜感激。 :)
  • @GateKiller - 我不确定你添加 :animated 选择器是什么意思。如果元素处于动画过程中,则选择器将匹配。如果没有,它不会。我将在稍后创建一个示例。
【解决方案2】:

两种可能的解决方案:

A)创建一个标志(两种方法)
B) 创建自定义事件

A-创建标志
1-可以使用.attr()添加标志

$('.element').stop().attr('stopped','')
//to check use :
if($('.element').is('[stopped]'))

2-如果您不希望涉及任何属性或任何更改的 DOM 结构
你可以附加一个默认的标志。
通过使用.data()存储任意数据:

$(".element").stop().data('stopped',true);

然后检索它以进行检查

if($(".element").data('stopped')) /** (1) **/

至于插件(正如你提到的here
是的,我们可以从中创建一个:

// Stop() with a capital S, don't have to remind you jQuery is case sensitive
$.fn.Stop = function() {
  this.stop().data('stopped', true)
  return this
} // check the same way as i mentioned in (1)

B-创建自定义事件
如果您不想要任何类型或任何类型的标志
您可以创建自定义事件,因为“停止”不是一个
Documentation about creating custom events

$('*').on('stop', function() {
  $(this).stop()
  //any other Statements you want
  //in this case you may need to change the selector
  //to match only '.element'
})

然后使用.trigger() 触发事件:

$('.element').trigger('stop')

【讨论】:

    【解决方案3】:

    在我找到添加 jQuery :animated 选择器的方法之前,我想出了以下解决方法:

    (function( $ ){
        $.fn.myAnimation = function() {
            this.addClass("isanimated");
            var myInterval = setInterval(function() {
                // do animation
                if (this.hasClass("isanimated") == false) {
                    clearInterval(myInterval);
                }
            }, 1000);
        });
    });
    
    $(".element").myAnimation();
    $(".element").removeClass("isanimated");
    

    上面的代码未经测试。

    如果有人能提出添加 :animated 选择器的方法,我将不胜感激。

    【讨论】:

    • 您将插件的实现细节泄露到插件范围之外。
    • 除了@alex 提到的插件范围之外的细节泄漏,为什么你使用递归函数和clearInterval() 的组合,而有更简洁的方法来制作标志?
    • @Amine 我不相信这是递归,它正在取消间隔。
    猜你喜欢
    • 2011-02-01
    • 2023-03-23
    • 2011-07-21
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多