尝试触发之前&围绕jQuery show()的事件之后

时间:2012-02-23 07:23:38

标签: jquery events

我试图在一些第三方代码出现模式对话框后运行我们的JavaScript。我看到了a pretty neat idea of hijacking the jQuery show function,但不幸的是它没有用。我猜这个想法曾经在2009年用于旧版本的jQuery,但现在还没有在最新版本上使用。这是一个带有实现的jsFiddle和一个示例:

http://jsfiddle.net/mkmurray/drv5w/2/

正如您通过运行示例所看到的,它将警告'beforeShow'事件,但不会警告'afterShow事件',并且通过一些调试我可以看到它没有完全调用'newCallback'函数。

提前感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:9)

看起来我能够通过解决方案。它涉及原因的一些因素:

  1. 自从我看到的代码的原始编写以来,jQuery添加了另一个名为easing的可选参数。这真的搞砸了我如何通过调用show委托jQuery中的原始_oldShow.apply(...)方法。
  2. 在我修复之后,我发现有时show方法会调用一系列其他方法,有时会再次递归调用show。我需要一种不让我的实现拦截那些递归调用的方法;我发现如果有selector属性,我可以依赖。
  3. 可以在这个jsFiddle找到一个有效的实现:

    http://jsfiddle.net/mkmurray/drv5w/27/

    这个实现非常依赖于jQuery而不是改变show方法的方法签名。所以你几乎要决定是否要修改你的第三方jQuery插件而不是这样做。无论哪种方式,如果你想获得最新的第三方插件或最新的jQuery,一些新的改变可能会破坏你的实现。因此,此解决方案不一定比修改第三方插件更好或更差。

答案 1 :(得分:3)

我在here找到了另一个解决方案,稍微调整了一下。

(function($){
    $.each(['show','hide'],function(i,ev){
        var el = $.fn[ev];              
        $.fn[ev] = function(){
            this.trigger(ev);
            return el.apply(this,arguments);
        };
    });                  
})(jQuery);

它没有提供其他例子的之前/之后的事件,但它当然可以详细说明。到目前为止它对我有用,并希望它继续这样做 - 这是一个很好的小方法,可以很容易地扩展到其他jQuery函数,包括显示的各种替代方法。

**请注意,这也会触发“隐藏”事件。

答案 2 :(得分:-1)

我没有测试任何东西,但分享了一些我知道的东西

  1. show有一个可选的第二个参数 - 缓动。 jQuery会自动检测到这一点,但是对于一个完美的解决方案,你必须考虑这一点。

    _oldShow.apply(obj, [speed, null, newCallback]); 
    
  2. 仅当存在延迟时,回调才有意义,这意味着speed的值。我希望如果出现延迟,您的afterShow事件将被触发。如果没有延迟,您可以在调用_oldShow之后触发它,就像这样

    _oldShow.apply(obj, [speed, null, newCallback]); 
    if(!speed){
      obj.trigger('afterShow');
    }
    
  3. 编辑:

    我厌倦了一些事情并且学到了我学到的东西我建议你创建一个新的show函数而不是覆盖。

    jQuery.fn.extend({
    
        show2:function( speed, easing, callback ) {
            this.trigger('beforeShow');
            this.show(speed, easing, function(){
                $(this).trigger('afterShow');
                if ($.isFunction(callback)) {
                    callback.apply(this);
                }
            });
            if(!speed){
                this.trigger('afterShow');            
            }          
        }
    
    
    });
    

    演示:http://jsfiddle.net/9F8ea/2/