尝试在jQuery show()周围事件之前和之后触发

我试图在一些第三方代码出现modal dialog后获得一段JavaScript运行。 我看到了一个非常巧妙的劫持jQuery show函数的想法 ,但不幸的是它没有用。 我猜这个想法曾经在2009年用于旧版本的jQuery,但现在还没有最新版本。 这是一个带有实现的jsFiddle和一个示例:

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

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

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

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

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

这个jsFiddle可以找到一个有效的实现:

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

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

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

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

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

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

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

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

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

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

编辑:

我厌倦了一些事情,并且学到了我学到的东西,我建议你创建一个新的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/