我试图在一些第三方代码出现模式对话框后运行我们的JavaScript。我看到了a pretty neat idea of hijacking the jQuery show function,但不幸的是它没有用。我猜这个想法曾经在2009年用于旧版本的jQuery,但现在还没有在最新版本上使用。这是一个带有实现的jsFiddle和一个示例:
http://jsfiddle.net/mkmurray/drv5w/2/
正如您通过运行示例所看到的,它将警告'beforeShow'事件,但不会警告'afterShow事件',并且通过一些调试我可以看到它没有完全调用'newCallback'函数。
提前感谢您提供的任何帮助。
答案 0 :(得分:9)
看起来我能够通过解决方案。它涉及原因的一些因素:
easing
的可选参数。这真的搞砸了我如何通过调用show
委托jQuery中的原始_oldShow.apply(...)
方法。show
方法会调用一系列其他方法,有时会再次递归调用show
。我需要一种不让我的实现拦截那些递归调用的方法;我发现如果有selector
属性,我可以依赖。可以在这个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)
我没有测试任何东西,但分享了一些我知道的东西
show
有一个可选的第二个参数 - 缓动。 jQuery会自动检测到这一点,但是对于一个完美的解决方案,你必须考虑这一点。
_oldShow.apply(obj, [speed, null, newCallback]);
仅当存在延迟时,回调才有意义,这意味着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');
}
}
});